3

가젯코드

다풀었긴 했는뎅 이부분이 read(0, read_got, 0x10)
payload += p64(pop_rdi) + p64(0)payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)payload += p64(read_plt)
이코드에서 0x10를 정의하는게 없는데 이코드설명은 read(0, read_got, 0x10)
인가요?

답변 1개
3

앞의 두 인자는 pop rdi ; ret와 pop rsi ; pop r15 ; ret 가젯으로 쉽게 설정할 수 있습니다. 그런데 마지막 rdx와 관련된 가젯은 바이너리에서 찾기 어렵습니다. 이 바이너리뿐만 아니라, 일반적인 바이너리에서도 rdx와 관련된 가젯은 찾기가 어렵습니다.

이럴 때는 libc의 코드 가젯이나, libc_csu_init가젯을 사용하여 문제를 해결할 수 있습니다. 또는 rdx의 값을 변화시키는 함수를 호출해서 값을 설정할 수도 있습니다. 예를 들어, strncmp 함수는 rax로 비교의 결과를 반환하고, rdx로 두 문자열의 첫 번째 문자부터 가장 긴 부분 문자열의 길이를 반환합니다.

libc_csu_init가젯에 대한 내용은 심화 커리큘럼에서 설명하겠습니다.

Figure 4. libc에 포함된 rdx 가젯

$ ROPgadget --binary /lib/x86_64-linux-gnu/libc-2.27.so | grep “pop rdx”

0x0000000000001b96 : pop rdx ; ret

이 실습에서는 read 함수의 GOT를 읽은 뒤 rdx 값이 매우 크게 설정되므로, rdx를 설정하는 가젯을 추가하지 않아도 됩니다. 좀 더 안정적인(reliable) 익스플로잇을 작성하려면 가젯을 추가해줘도 좋습니다.

라고 강의내용에 나와있습니다. 실제 rdx 값은 알 수 없지만 일단 입력할 데이터는 16바이트이기 때문에 그냥 0x10이라고 쓴 것 같네요.