728x90
먼저 문제 파일로 주어진 ssp_000.c 파일의 코드 분석을 진행했다.
✅ 문제 코드 분석
- initialize() 함수: 입력 및 출력 버퍼를 비활성화하고, SIGALRM 시그널을 처리하는 alarm_handler() 함수를 넣어준다. 이 시그널 핸들러는 "TIME OUT" 메시지를 출력하고 프로그램을 종료한다.
- get_shell() 함수: /bin/sh 쉘을 실행하는 system() 함수를 호출한다.
- main() 함수: 초기화를 수행하고, 0x40 바이트 크기의 버퍼인 buf를 선언합니다. 그 후, 사용자로부터 최대 0x80 바이트를 읽어 buf에 저장하고 있다.
위 함수를 바탕으로 사용자로부터 메모리 주소와 값을 입력받아 해당 메모리 주소에 값을 쓰고 있다. 이때, 해당 부분에서 사용자가 임의의 메모리 주소와 값을 입력하여 프로그램의 동작을 변경할 수 있기 때문에 취약점 발생 가능성이 있다.
먼저 pwndbg 모드로 해당 파일에서 현재 사용하고 있는 방어기법을 확인해보았다. 확인해보니 64비트 카나리가 적용되어 있는 것을 볼 수 있었다. 추가적으로 PIE가 비활성화되어 있으므로 이를 활용해서 익스플로잇 코드를 시도해볼 수 있을 것 같다고 생각하였다.
본격적인 익스플로잇 코드 작성에 앞서서 문제 코드를 다시 확인하여 보니 0x40 바이트 크기의 버퍼인 buf 를 선언하고 있지만 사용자로부터 읽어오는 값은 최대 0x80 바이트 임으로 정해진 버퍼보다 더 큰 값을 읽어올 때, 취약점이 발생할 수 있을 것으로 보인다.
따라서 위와 같이 익스플로잇 코드를 작성해주었다. 이때 입력 버퍼에 사용되는 A의 크기를 0x50 바이트 크기로 설정하여 버퍼 오버 플로우 취약점을 적용할 수 있도록 작성하였다.
작성한 코드를 실행하고 ls 명령어를 실행하여 파일들을 모두 확인해보니 ‘flag’라는 이름의 파일을 발견할 수 있었고 cat flag 명령어를 실행하여 flag 파일의 내용을 보니 다음과 같이 플래그 값을 확인할 수 있었다.
문제 해결-!
728x90
'Security > System Hacking' 카테고리의 다른 글
[Tool] gdb (0) | 2024.09.09 |
---|---|
[Dreamhack] ssp_001 (0) | 2024.09.01 |
[Background] x86 Assembly (0) | 2024.09.01 |
[Background] Linux Memory Layout (0) | 2024.09.01 |
[Background] Computer Architecture (1) | 2024.09.01 |