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
Sechack
2024 Invitational Contenders
64비트 바이너리의 libc주소는 우분투 환경에서는 보통 0x7f부터 시작이 됩니다. 그리고 총 6바이트이고 나머지는 0x00(NULL)로 채워집니다. 그래서 저는 보통
u64(r.recvuntil("\x7f")[-6:].ljust(8, b"\x00"))
이런식으로 주소를 받아옵니다. 총 7바이트를 받아온다고 하셨는데 저기 뒤에 붙은 0x0a는 puts로 출력할때 붙는 개행문자입니다.