문제에 들어가면 가장 먼저 만나는 창이다. 문제에서 우리에게 버퍼 오버플로우 문제라고 말하고 있다.
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 :)
'Pwnable > Pwnable CTF' 카테고리의 다른 글
[Pwnable.kr] Toddler's Bottle_random (0) | 2021.04.06 |
---|---|
[Pwnable.kr] Toddler's Bottle_passcode (0) | 2021.03.31 |
[Pwanable.kr] Toddler's Bottle_flag (0) | 2021.03.31 |
[Pwnable.kr] Toddler's Bottle_collision (0) | 2021.03.23 |
[Pwnable.kr] Toddler's Bottle_fd (0) | 2021.03.17 |