
바이너리 익스플로잇 및 리버스 엔지니어링 (어셈블리에서 C로)
10개의 작은 도전 과제를 통해 디스어셈블리, 바이너리 익스플로잇 및 리버스 엔지니어링을 탐구하세요.
각 레벨의 폴더에서 다음을 찾을 수 있습니다:
flag - 다음 레벨의 비밀번호
README.md - 비밀번호를 찾는 방법
source.c - 리버스 엔지니어링된 바이너리
dissasembly_notes.md - 어셈블리에 관한 노트
자세한 내용은 과제를 참조하세요.
더 많은 gdb 및 익스플로잇 재미를 위해 이전 프로젝트인 RainFall을 확인하세요.
먼저 42에서 OverRide.iso를 다운로드하세요.
Mac OSX에서 VirtualBox를 설치하세요.
VirtualBox에서 새 VM을 생성합니다 (New 클릭).
다음 단계들을 기본 설정으로 계속 진행하세요:
다음 설정 > 네트워크 > 어댑터 1 > 연결 대상: 브리지 어댑터를 클릭하세요.
여전히 설정에서 저장소 > "컨트롤러: IDE" 오른쪽에 CD 아이콘과 + 기호가 있습니다 (광학 드라이브 추가). 디스크 이미지 추가를 클릭하고 OverRide.iso를 선택하세요.
시작을 클릭하여 VM을 실행하면, 실행 중에 VM IP 주소가 표시되고 로그인 프롬프트가 나타납니다.
별도의 셸에서 사용자 level00으로 비밀번호 level00을 사용하여 로그인하세요.
ssh level00@{VM_IP} -p 4242
사용자 level00으로서 목표는 /home/users/level01/.pass에 있는 사용자 level01의 비밀번호를 읽는 것입니다. 그러나 사용자 level00은 이 파일을 읽을 권한이 없습니다.
사용자 level00의 홈 폴더에는 SUID가 설정되고 소유자가 level01인 바이너리 level00이 있습니다.
이것은 바이너리 level00을 실행할 때 사용자 level01의 권한으로 실행된다는 것을 의미합니다.
gdb를 사용하여 바이너리 level00의 취약점을 찾아야 합니다. 그런 다음 취약점을 익스플로잇하여 *system("/bin/sh")*를 실행하고, 사용자 level01로 셸을 열어 비밀번호를 읽을 수 있는 권한을 얻습니다.
cat /home/users/level01/.pass
그런 다음 사용자 level01로 로그인합니다.
su level01
각 레벨에 대해 반복합니다.
각 레벨에 대해, 우리는 바이너리의 gdb 디스어셈블리를 분석하여 원래의 source.c를 리버스 엔지니어링했습니다.
0 - 하드코딩된 비밀번호
1 - Ret2Libc 공격
2 - printf() 포맷 문자열 공격
3 - 무차별 대입 비밀번호
4 - gets() 스택 오버플로우 + Return-to-libc 공격
5 - 환경 변수의 셸코드 + printf() 포맷 문자열 공격
6 - gdb로 알아낼 수 있는 해시 값
7 - 보호되지 않는 데이터 테이블에 대한 Ret2Libc 공격
8 - 심볼릭 링크를 통한 비밀번호 백업 바이너리
9 - Off-by-one 오류
저는 이 프로젝트를 매우 재능 있는 @dfinnis와 팀으로 작성했습니다.