본문 바로가기
Hacking/DreamHack

[DreamHack] 드림핵 shell_basic

by st-og 2024. 10. 28.

문제 확인

 

해당 문제는 시스템의 파일을 읽어오는 쉘코드를 작성하는 문제이다

서비스 분석

 

해당 파일을 실행할 경우 shellcode를 입력받으며

원하는 값이 들어오지 않을 경우에는 세그멘테이션 오류가 발생한다.

소스 코드

 

코드에 여러 함수가 보이지만 문제 설명에서 보았듯 풀이와 관련 없는 함수이므로 우리는 main함수의 코드에만 집중하면 된다.

 

코드 라인 설명
39 mmap 함수를 사용하여 shellcode라는 변수에 rwx의 권한을 가진 메모리 공간을 부여한다
40 생성된 shellcode의 메모리 공간 중 시작 주소를 저장하기 위한 포인터 함수를 생성
46~47 사용자에게 0x1000만큼의 데이터를 입력 받는다
49~50 입력받은 shellcode를 실행하는 코드

 

*mmap() : 메모리 매핑을 제공하는 함수로 파일과 메모리를 연결하여 파일의 입출력을 메모리 접근처럼 수행 가능하게 하는 함수

 

문제 해결

위 코드에서 mmap함수로 생성된 메모리 공간은 shellcode 변수에 연결이 된다. 이 메모리는 읽기, 쓰기. 실행 권한을 가지기 때문에 사용자가 이 메모리 공간에 실행 가능한 쉘 코드를 작성하게 되면 해당 코드를 실행할 수 있다.

 

아래는 pwntools를 사용한 exploit 코드이다.

 

코드 라인 설명
3 시스템의 아키텍처가 amd64임을 정의한다. 쉘 코드는 아키텍처에 맞게 작성되어야 하기에 사용하였다.
5~6 드림핵 서버에 연결하는 remote와 flag가 저장되어 있는 path를 정의하였다.
8 flag가 저장되어 있는 파일을 연다. 파일을 성공적으로 열게 될 경우 파일 디스크립터는 rax에 저장된다.
9 파일 디스크립터에서 0x30만큼 데이터를 가져와 rsp에 저장한다, 
10 rsp에 저장된 0x30만큼의 데이터를 출력한다.
11 작성한 payload를 어셈블리어로 변환한다.
13~14 shellcode를 전송하고 그 결과를 받아 출력한다.

 

shellcraft : pwntools에서 쉘 코드 작성을 쉽게 할 수 있도록 지원하는 모듈

FLAG