이번에 풀이할 문제는 Basic_BOF #2다. Basic_BOF #1 풀이에서 말했듯이, 이번 write-up부터는 핵심만 간단히 풀이하겠다.
리눅스 환경에서 실행해보니, 어떤 입력 값을 넣어도 "하아아아아아아아아앙"이 출력되는 것을 볼 수 있다.
ida로 main 함수를 c 코드로 보니 엄청난 양의 코드가 존재하는 것을 볼 수 있다.(ida 문제인가..?)
위 코드에서 한 가지를 알 수 있다.
fgets 함수로 133byte만큼 char 형 배열 s에 문자열을 넣어준다.
basic_bof #1 문제도 배열 변수의 크기보다 큰 문자열을 fgets 함수로 넣어줘서 취약점이 발생했기 때문에 이 문제도 역시 이 부분이 취약점을 발생시킬 수도 있다.
일단 저 코드만으로는 쉘을 얻을 수 있는 로직 등이 보이지 않았기에 gdb를 통해 동적 분석해봤다.
먼저 info func 함수로 함수들의 목록을 출력해보니 shell이라는 수상한 함수가 존재하는 것을 볼 수 있다.
ida에서 shell 함수를 찾아 c 코드로 보니, 이 함수가 쉘을 얻게 해준다는 것을 알 수 있다. 하지만 이것만으로는 쉘을 얻을 방법이 떠오르지 않았기에 동적 디버깅을 진행해봤다.
위는 main 코드를 디스어셈블 한 것이다. 디버깅을 통해 알아낸 중요한 사실만 정리해보겠다.
main+41, main+47 : 0xffffcf7c(ebp-0x8c)가 char형 배열 s의 주소임을 알 수 있음
main+56, main+59 : 0xffffcffc(ebp-0xc)에 저장돼 있는 값 0x80484b4를 eax 레지스터에 넣은 후 call eax. 즉 0x80484b4 주소의 함수를 실행
info func 명령어를 통해 확인해봤을 때 0x80484b4 주소에 해당하는 함수는 바로 sup 함수다.
sup 함수를 ida로 확인해보면 이상한 문자를 출력하는 코드가 있다. 디버깅을 해보면 ida에서는 이상한 문자로 뜨지만, 실제로 "하아아......"를 출력하는 함수임을 알 수 있다.
스택 상에서 배열 변수 s의 주소는 0xffffcf7c, sup 함수의 주소는 0xffffcffc이고 두 주소의 차는 128byte다.
하지만 fgets 함수를 통해 s에 입력 값을 133byte 만큼 저장해주므로 스택 오버플로우가 일어날 수 있다. 스택 오버플로우 공격을 통해 0xffffcffc에 저장된 sup의 주소 0x080484b4 대신 쉘을 얻게 해주는 함수 shell의 주소 0x0804849b를 갖게하면 될 것 같다.(aslr이 없어서 다행이다.)
from pwn import *
payload = b'A'*128+p32(0x0804849b) # 'A' 128byte + 리틀 엔디안 0x0804849b로 payload 생성
p = remote("ctf.j0n9hyun.xyz", 3001) # CTF 서버로 접속
#p = process("./bof_basic2") 로컬 exploit
p.sendline(payload) # payload 문자열 입력
p.interactive() # 사용자 입력 모드로 전환
'A' 128byte + 0x0804849b로 스택 오버플로우 공격을 수행하는 payload 문자열을 생성해서 exploit 했다.
쉘을 얻은 후 cat flag 명령어를 통해 flag를 획득했다.
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Basic_FSB (2) | 2021.05.05 |
---|---|
[HackCTF] x64 Simple_size_BOF (0) | 2021.04.28 |
[HackCTF] x64 Buffer Overflow (0) | 2021.03.20 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.03.18 |
[HackCTF] Basic_BOF #1 (0) | 2021.03.15 |