Pwnable.bof 풀이.
Nana가 내게 말하길 버퍼오버플로우가 가장 일반적인 소프트웨어 취약점이라고 합니다. 그게 사실인가?라고 쓰여져 있다.
일단 다운로드 하라고 하는 bof라는 실핼 파일과 bof.c라는 소스 코드가 있다.
또한 nc를 통해 접속해서 푸는 문제라고 나와 있다.
nc란 netcat의 줄임말로 TCP/UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓸 수 있는 유틸리티다.
UNIX 계열의 cat을 보면 파일을 대상으로 읽고 쓰는데 Netcat는 network connection에 읽고 쓰는 것이라고 한다.
pwnable 문제 유형을 보면 ssh를 통해 원격 터미널 접솟을 통해 문제를 푸는 경우도 있고,
nc 서버로 접속해 문제를 푸는 경우도 있기에 숙지하고 있어야 하는 방법이다.
먼저 bof.c를 열어보겠다.
gdb를 통해서 bof파일의 func()함수를 분석한 내용이다.
func+29의 위치를 통해서 overflowme[32]는 ebp로부터 0x2c(44)만큼 떨어져 있는 것을 알 수 있다.
또한 func+40의 위치를 통해서 key는 ebp로부터 0x8(8)만큼 떨어져 있는 것을 알 수 있다.
overflowme에 문자를 입력해서 key를 덮어 써야 하기 때문에 overflowme부터 key 사이의 크기를 구하면
52만큼의 크기가 나오게 되고, 52개의 쓰레기 값을 집어 넣은 뒤 문자를 덮어쓰면 공격이 성공할 거 같다.
A라는 쓰레기 값을 52개 입력한 뒤 원했던 cafebabe라는 값을 입력하면서 nc를 통해 시스템에 접속을 하니 /bin/sh이 정상적으로 실행되었다.
cf) ./bof 파일을 다운로드했을 때 아래와 같은 화면이 뜰 수 있다.
일단 wget을 이용해서 문제에서 제공하는 실행 파일, 즉 pwnable.kr/bin/bof에서 다운을 받았다.
'bof'로 저장했다고 한다.
근데 ./bof로 프로그램을 실행해보니 허가 거부라고 나온다.
excute 권한을 추가하기 위해 chmod +x bof를 명령했다.
그리고 다시 ./bof를 했지만 파일이 없다고 나온다.
bof file을 보니 32비트 파일이라고 하고 getconf LONG_BIT를 사용해 우분투 터미널을 보니 64bit 였다.
즉 64비트 리눅스에서 32비트 bof파일을 실행해야 한다.
1. sudo dpkg --add-architecture i386
2. sudo apt-get update
3. sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386
1.2.3번을 차례로 입력하면 사용할 수 있다.
다 입력하면 아래와 같은 화면이 뜬다. 잘 입력한 것이다.
이 상태가 된다면 위 풀이대로 하면 된다.
cf2) | <= 파이프라는 명령어에 간단히 소개하겠다.
Ex) Q/ W라면 Q 실행 결과로 출력되는 문자를 W의 입력으로 이용하는 것이다.
위 명령 (python -c 'print "A"*52+"\xbe\xba\xfe\xca"; cat)이 Q라고 할 수 있고,
nc pwnable.kr 9000이 W라고 할 수 있다.
다시 말해 Q의 표준 출력이 W의 표준 입력이 되니까 nc pwnable.kr를 실행하고 그 입력으로
"a"*52+"\xbe\xba\xfe\xca"가 넘어오게 된 것이다.
'# Related site issues > PW.KR' 카테고리의 다른 글
Pwnable.Dragon. (0) | 2018.04.08 |
---|---|
Pwnable.flag. (0) | 2018.04.06 |
Pwnable.collision. (0) | 2018.04.05 |
Pwnable.UAF. (0) | 2018.04.05 |
Pwnable.Passcode. (0) | 2018.03.28 |