

카나리가 적용되어있지 않은 바이너리지만 코드 내 카나리 역할을 하고 있는 친구인 size_t check라는 변수가 보인다.
처음에 stdout이라는 변수의 주소를 출력하고 msg 배열을 입력받는데 여기서 버퍼 오버플로우가 발생한다.
이후 check변수의 값이 여전히 0인지 카나리처럼 검사하고 만약 아니라면 exit함수를 호출한다. 이때 check변수는 size_t형이기 때문에 8바이트이다.
이후 msg를 출력하고 메모리에 올리고 main함수는 끝난다.
나는 oneshot-gadget을 사용해 해당 문제를 해결 할 것이다.
대략적인 문제풀이는 msg 배열의 입력 과정에서 check변수의 값을 조심하며 main함수의 return address를 oneshot-gadget의 주소로 덮으면 된다. 이때 libc base주소를 알아야 하는데 이는 처음에 출력하는 stdout의 주소와 libc 내부의 stdout의 오프셋을 통해 알아낼 수 있다.
우선 gdb롤 해당 바이너리를 디버깅 해보자.

보면 rsp는 0x30만큼 빼지만 실질적인 msg 배열은 rbp-0x20에 위치함을 알 수 있고 check변수는 rbp-0x08에 위치하는 것을 알 수 있다. msg와 check 사이의 8바이트는 왜 있는지 모르겠으나 일단 위치를 알 수 있었고

해당 바이너리에 링크되는 libc파일의 stdout의 위치와 명칭을 찾을 수 있다.

oneshot-gadget도 4개나 있고 해당 바이너리에는 4개 다 사용이 가능했다.

페이로드는 다음과 같다.

실행시키면 쉘이 잘 따지는 것을 볼 수 있다.
oneshot-gadget의 강력함을 알 수 있었던 문제였다.
'보안 > DreamHack' 카테고리의 다른 글
| Dreamhack out of bound (0) | 2024.10.30 |
|---|---|
| Dreamhack hook (0) | 2024.10.28 |
| Dreamhack fho (0) | 2024.10.14 |
| Dreamhack basic_rop_x86 (0) | 2024.10.11 |
| Dreamhack basic_rop_x64 (0) | 2024.10.10 |