본문 바로가기
Pwnable/Pwnable CTF

[Pwnable.kr] Toddler's Bottle_bof

by Y06 2021. 3. 23.

문제에 들어가면 가장 먼저 만나는 창이다. 문제에서 우리에게 버퍼 오버플로우 문제라고 말하고 있다.

 

nc를 통해 문제에 접근할 수 있다고 한다. 이제까지 풀었던 문제는 모두 ssh를 통하여 들어갔다.

 

nc(Netcat): TCP/UDP 프로토콜로 연결된 네트워크 상에서 데이터를 읽고 쓸 수 있는 간단한 리눅스 유틸리티라고 한다. 네트워크에 연결된 서버 간의 포트 오픈을 확인할 수 있고, listen 모드로 자신이 서버가 되는 기능을 제공하기도 한다.

 

nc 명령어로 접속했더니 다음과 같이 뜨는 것을 확인하였다. 오버플로우에 실패한 것 같다. 

 

bof.c 파일을 다운로드 받고 확인하였다.

 

Buffer over flow

: 프로그래머가 지정한 버퍼의 범위를 넘어서 입력 시 다른 데이터를 덮어쓸 수 있는 취약점이다. 

- 중요 데이터를 덮어써서 프로그램 흐름을 마음대로 하는 것이기 때문에 입력 함수를 눈여겨 봐야 하며 입력 함수는 get()이다.

 

 

bof 파일이 다운로드 된 곳으로 들어가서 ls 명령어를 통해 확인하였다.

 

gdb ./bof 명령어를 통해 디버깅 하였다. 

 

gdb: Linux에서 사용되는 디버깅 툴

 

main 함수를 디스어셈블하여 기계어를 어셈블리어로 본다는 뜻이다.

 

메인함수에서 바로 디버깅할 것이 아니라 우리가 여기 소스코드에서 분석해야 할 부분은 메인함수 자체가 아닌 메인함수 내에서 func라는 이름으로 키를 비교해 셀권한을 얻거나 실패 메시지를 출력하는 func함수에 주력해야 하기 때문에 func 함수를 디스어셈블한다.

 

일단 func<+40>에서 cmpl 명령으로 0xcafebabe와 ebp+0x8을 비교하니까 ebp+0x8이 key인 것 같다.

또 func<+29> lea 명령으로 eax를 ebp-0x2c로 불러와서 연산을 실행하니까 ebp-0x2c가 버퍼 overflowme 시작 주소라는 것을 알 수 있다.

key-overflowme=ebp+0x8-(ebp-0x2c)=0x8-(-0x2c)=52

key랑 overflowme가 메모리 상에서 떨어져 있는 거리는 52다.

 

리틀 엔디언 방식이기 때문에 0xcafebabe의 역순을 넣어야 한다.

(python -c 'print "a"*52 + "\xBE\xBA\xFE\xCA"'; cat) | nc pwnable.kr 9000 => 이 값을 넣어준다.

 

이 값을 넣으면 FLAG 값이 나온다. 

 

 

FLAG: daddy, I just pwned a buFFer :)