으어어어 p64(0)

payload += p64(pop_rsi_r15)
payload += p64(write_got)
payload += p64(write_plt)
이게 제가 write 함수를 사용하기 위해 작성한 코드이고
payload += p64(pop_rsi_r15)
payload += p64(write_got)
payload += p64(0)
payload += p64(write_plt)
payload += p64(main)
이게 다른 분이 작성한 코드입니다.
제가 처음에 p64(0)과 p64(main)이 없는 상태에서 익스플로잇을 실행했는데 계속 오류가 났고 다른 사람들이 작성한 코드를 보니 p64(0)하고 p64(main)가 있어서 p64(0)만 추가해서 익스플로잇을 실행했더니 정상적으로 작동이 되었습니다.
p64(0)과 p64(main)이 하는 역할이 뭔가요?

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

아마도 64비트 rop의 작동 원리를 제대로 이해하지 못하고 계신 것 같습니다.

강의에도 나와있듯 32비트에서는 함수가 스택의 값을 가져가서 실행하기에 pppr과 같은 가젯만 있으면 되지만
64비트에서는 레지스터에 값이 들어가있어야하기 때문에 그렇게 작동하도록 페이로드가 구성되어야합니다.

다시 강의를 잘 읽어보시면 좋을 것 같습니다 ㅎㅎ

2023.01.24. 08:30
avatar
Sechack
CTF First Place

pop rsi; pop r15; ret가젯이니까 pop을 2번 하잖아요. 그래서 rsi에 got를 pop하고 r15에 pop할것도 필요하니까 p64(0)을 넣어준겁니다. p64(main)은 그냥 leak하고 나서 다시 main함수로 돌아가기 위해서 넣어준거고요.

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