read 함수를 system 함수로 덮는다는 의미

read("/bin/sh") == system("/bin/sh")

payload += p64(pop_rdi)
payload += p64(read_got+0x8)
payload += p64(read_plt)
p.sendafter("Buf: ", payload)

p.send(p64(system)+b"/bin/sh\x00")
잘 이해가 안가서 질문 드립니다. 그러면 read_got + 0x8 이 b"/bin/sh\x00" 문자열로 덮이고, read_plt가 p64(system) 으로 덮인다는 의미로 해석했는데, p.sendafter 에서 payload를 날리고 난 후에 p.send를 통해 덮이게 되는 건가요? 왜 덮이게 되는건지 이해가 잘 안갑니다

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

일단 calling convention에 대해서 알아보시면 좋을 것 같습니다.

간단히 페이로드를 설명해보면
read got + 8 위치에 system 주소와 binsh 문자열을 넣어주는 동작을 합니다.

2023.03.08. 22:15
avatar
wyv3rn
무플 방지 위원회장

앗 설명을 조금 잘못했네요

아마 해당 페이로드 앞에 read got 위치에 system 주소와 binsh 문자열을 받아주는 코드가 있을겁니다.

그때 주소와 문자열을 넣어두는거고
위의 코드에서는 read plt를 호출하는데 read got +8 위치의 값을 인자로 사용하는 것입니다.

여기서 read got은 system 함수 주소를 가지고 있을거고 read got +8은 binsh 문자열을 담고 있을테니 결국 read를 호출하였지만
system(binsh)
가 실행되는거죠

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