read()의 got의 값을 읽을 때 -> read = u64(p.recvn(6)+b"\x00"*2) 왜 이런식으로 값을 읽는지 궁금합니다.

read()의 got의 값을 읽을 때 -> read = u64(p.recvn(6)+b"\x00"*2) 왜 이런식으로 값을 읽는지 궁금합니다.

rop프로그램에서 read()의 got값이 leak될 때 출력 되는 값을 보면

[DEBUG] Received 0x7 bytes:
    00000000  50 63 03 06  0a 7f 0a                               │Pc··│···│
    00000007

이런식으로 나오더라구요.
그래서 제가 생각했을 때는 7바이트가 출력되므로 read = u64(p.recvn(7) + b'\x00') 이렇게 해야겠다고 생각했었는데 풀이를 보니 위와 같이 6바이트 까지만 값을 받네요. 왜 입력되는 값을 다 받지 않고 6바이트만 받는건가요?

(7바이트를 다 받으면 오류가 나긴 하네요. 왜 그런가요?)

#시스템_해킹 #공격기법 #rop
작성자 정보
답변 1
avatar
Sechack
2024 Invitational Contenders

64비트 바이너리의 libc주소는 우분투 환경에서는 보통 0x7f부터 시작이 됩니다. 그리고 총 6바이트이고 나머지는 0x00(NULL)로 채워집니다. 그래서 저는 보통

u64(r.recvuntil("\x7f")[-6:].ljust(8, b"\x00"))

이런식으로 주소를 받아옵니다. 총 7바이트를 받아온다고 하셨는데 저기 뒤에 붙은 0x0a는 puts로 출력할때 붙는 개행문자입니다.

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