□ 문제를 보면 아래와 같다. Bof.c라는 소스코드와 bof 바이너리 파일이 주어졌다.
□ Bof.c 코드를 봐본 결과 func 함수안에 있는 key의 지역 변수 값이 "0cafebabe" 값이면 bof의 권한으로 /bin/sh을 실행시킬 수 있다.
- Key 값을 "0cafebabe"로 만들기 위해선 gets 함수를 이용해 overflowme[32] 배열에 입력 값을 받을 때 buffer overflow를 일으키면 된다.
□ Bof 공격 성공하기 위해선 바이너리 overflowme[32] 배열 주소의 위치와 key 주소의 위치 차이를 정확히 할아야하므로 bof 바이너리를 아래와 같이 IDA로 열어보았다.
- 해당 코드는 func() 함수의 코드이다.
- "Cmd [ebp+arg_0], 0CAFEBABE" 코드는 key의 지역 변수와 "0cafebabe" 값을 비교하는 코드이다.
- gets 함수를 통해 [ebp+s] 주소에 문자열을 입력받고 있다.
- 이 때, [ebp+s](=ebp-2C)에 임의의 입력 값을 ebp+arg_0(=ebp+8)까지 overflow 시킬 수 있다.
- 따라서 gets 함수를 통해 문자열을 입력 받을 때, 임의의 값 52(=ebp-2C와 ebp+8 차이) 바이트와 "0cafebabe" 값을 입력하면 "/bin/sh"를 실행시킬 수 있다.
□ Python을 통해 임의의 값 52(=ebp-2C와 ebp+8 차이) 바이트와 "0cafebabe" 값을 입력시킨 결과 "/bin/sh"가 실행되어 bof 권한을 얻을 수 있게 되었다.
- Cat 명령어를 통해 flag 값을 읽은 결과 문제가 풀리게 되었다.
'■ Wargame > - Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] flag - 7 pt ( Write Up ) (0) | 2019.06.10 |
---|---|
[Pwnable.kr] collision - 3 pt (Write Up) (0) | 2019.06.09 |
[Pwnable.kr] Fd - 1pt (Write up) (0) | 2019.06.09 |