본문 바로가기

보안/DreamHack

Dreamhack Return to Shellcode

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