

amd64비트 아키텍처 바이너리이다.
따라서 SFP는 기존 4바이트였던 32bit와 달리 8바이트이다
카나리가 적요오디어있지만 NX는 적용되어있지 않다.
따라서 버퍼에 쉘코드를 넣고 카나리를 우회한 후 버퍼의 주소로 return address를 덮는다면 쉘을 얻을 수 있을 것이다.

gdb로 메인함수를 살펴보면 메인함수에서 0x60바이트 만큼의 스택을 할당하는 것을 볼 수 있고
fs에서 0x28만큼 떨어진 것을 rax로 넣는 것을 볼 수 있고 이것이 카나리임을 알 수 있다.
정리해보자면, main함수에서 0x60만큼 할당을 하고 그 중 0x8만큼의 카나리가 들어가는것이다.
| 0x58 Buf | 0x8 canary | 0x8 SFP | return address | ||||||
스택은 위 그림과 같이 구성이 되어있는 것이다.
다시 c소스를 살펴보면

입력을 총 2번 받는데 두 입력 모두 버퍼오버플로우 공격이 가능한 것을 볼 수 있다.
따라서 첫 입력에서는 카나리를 추출하고 두번째 입력때 본격적으로 payload를 보내면 될 것 같다.
전체 페이로드는 다음과 같다.

우선 아키텍처를 명시하고 문제에서 주는 buf의 주소와 buf의 size를 변수로 받은 후 카나리의 첫 바이트가 null인것을 이용하여 할당된 0x58(0x60-0x8)만큼의 버퍼를 A로 채우고 버퍼 오버플로우를 이용하여 카나리의 첫 바이트인 NULL을 B로 채우면 이후 내 입력값을 출력해주는 printf에서 카나리의 값까지 출력을 해준다.
이 카나리의 값을 추출한 후에 본격적인 쉘코드를 입력하고 카나리 값을 넣고 SFP를 덮고 return address까지 buf의 주소로 덮으면

아래와 같이 쉘을 얻을 수 있고 flag를 찾을 수 있다.
이번 문제를 풀면서 기존에 사용하던 sendline 이외에도 sendafter, ljust 등의 새로운 pwntools 명령어들을 알 수 있게 되었다.
'보안 > DreamHack' 카테고리의 다른 글
| Dreamhack Return to Library (1) | 2024.10.07 |
|---|---|
| Dreamhack ssp_001 (1) | 2024.10.05 |
| Dreamhack basic_exploitation_001 (0) | 2024.10.01 |
| Dreamhack basic_exploitation_000 (0) | 2024.09.30 |
| Dreamhack shell_basic (0) | 2024.09.26 |