첫인상
- 해당 문제는 기존의 flag를 획득하는 문제와 달리 nc(netcat)으로 해당 server에 접근해, flag의 값을 확인하는 문제이다.
- 두개의 파일을 다운로드 후 문제를 해독하라고 명시되어있기에 다운을 받고 해당 실행파일과, 코드를 분석진행하였다.
- (window cmd에서 wget 사용하기: https://leesk212.github.io/Window-CMD%EC%97%90-wget%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0/)
- bof 디버깅해야하기에 포트포워딩을 설정해주고 linux os에 붙어서 추가적인 진행을 하였다.
- (sshd 외부 접근 설정: https://leesk212.github.io/Linux-Setting-ssh/)
접근
bof.c 파일 분석
- main에서 0xdeadbeef 값을 인자로 func함수를 호출한다.
- func함수에서는 main에서 넘겨준 인자를 key라는 변수로 받는다.
- 또한 overflowme라는 변수에 값을 입력 받은 이후, key가
0xcafebabe
와 같은 경우, 해당 시스템의 sh를 실행시킬 수 있는 함수이다. - 실행파일을 disas해서 분석을 진행해야한다
bof 파일 리버싱 진행
- func함수에서 두번째 call하는 부분이 gets함수가 실행되는 부분이다.
- 또한 cmp를 통해서 비교하는 곳이 key값과 비교하는 위치기에 [%ebp+0x8]이 key의 변수가 갖고 있는 값일 것이다.
- 그렇다면 overflowme의 시작 주소로부터 일정량을 덮어쓰고, key의 변수에 0xcafabebe를 넣으면 overflow가 진행될 것이다.
- 이때 gets함수를 통해 불러오는 위치가 ebp-0x2c임을 확인할 수 있다.
- 그렇다면 현재 상태가
- overflowme -> ebp-0x2c
- key -> ebp+0x8 임으로
- 두 변수 사이의 거리는
ebp+0x8 - (ebp-0x2c) = 0x8+0x2c = 0x34
이다. (10진수로는 52이다.) - 그렇다면 52byte만큼 아무 숫자를 넣고 key값인
0xcafebabe
를 넣어주면 될 것이다.
공격진행
- 이번에도 python을 활용하여 공격을 진행하였다.
- python -c 를 통하여 덮어 씌울만큼의 52byte의 값을 작성하고 그 뒤, key와 같은 값을 작성을 진행하였다.
- [python 2.7]
(python -c 'print "a"*52 + "\xBE\xBA\xFE\xCA"'; cat) | nc pwnable.kr 9000
-
[python 3.x]
(python -c "print('a'*52+'\xBE\xBA\xFE\xCA')";cat) | nc pwnable.kr 9000
- 성공적으로 쉘을 획득하게 되었다면 ls-al로 해당 서버의 파일 중 flag가 있는지 확인한다.
- flag가 읽을 수 있는 권한이 있기에, cat flag를 통해 flag 획득 성공!
ref
- https://hackingisly.tistory.com/14
- https://stfwlg.github.io/archivers/pwnable.kr-_bof_%ED%92%80%EC%9D%B4
- https://icmp-ycdi.tistory.com/50