binee::
[Plaid CTF 2016] unix_time_formatter write up 본문
낮은 스코어 답게 쉽게 풀었지만,
환경변수 debug를 이용하지 않았으면 빨리 풀지 못 했을 거 같기도 하다.
use after free 문제이다.
Binary 분석
unix_time_formatter 바이너리를 확인 해보면
unix_time_formatter: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=5afd38988c61546c0035e236ce938af6181e85a6, stripped
64bit elf 파일이고 특이한 점은 없다.
Program Logic 분석
.
아래는 main함수의 hex-xay 결과다.
위 그림처럼 총 4개의 기능이 있다.
기능 내용은 그냥 동적 실행 결과로 대체하겠다.
솔직히 지금 봐도 정확한 기능은 모르겠다.
(1)은 출력할 형태를 지정하는 것 같고
(2)은 출력할 시간을 지정해주는 것 같고
(3)은 솔직히 왜 있는지 모르겠다.
(4)으로 최종적으로 출력을 한다. 이 때 system함수를 사용해서 명령어 결과값을 출력한다.
특이한 점은 환경변수 DEBUG값이 존재하면 strdup의 반환 값을 출력한다.
특이점으로 5번을 할 경우 (1)(3)번에서 할당한 매모리를 free한다.
Exploit
이 문제는 system함수를 이용해서 command injection하는 문제 인 것 같다.
1번에서 입력한 문자를 __snprintf_chk 함수로 "/bin/date -d @%d +'%s' " 스트링 값에 대입을 한다.
%s로 불러오는 값 중간에 command injection 구문을 추가하면 내가 원하는 명령어를 실행 할 수 있을 것으로 판단 된다.
하지만 1번 함수에서 화이트 리스트 방식으로
"%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^# " 문자 외에는 사용 할 수 없게 만들었다.
보통 os command injection을 하기 위해서는 ; ` ( ) $ & | 문자를 사용해야되는데
모두 사용 할 수 없다.
그렇다면 우회 방법을 찾아야하는데,
환경변수에 DEBUG값을 만들어서 실행하면 메모리가 할당되는 주소가 보이는 것으로 봐서
Use After Free 문제일 확률이 높아보였다.
linux는 heap할당 시 처음 할당된 사이즈보다 작은 사이즈로 할당 요청을 했을 때 기존에 사용하던 주소를 다시 할당하는 특징이있다.
처음 10byte 메모리를 할당하고 해제하고 8byte 할당을 요청하면 이전에 10byte를 할당했을 때 사용한 공간을 재할당해준다.
실제로 확인해보면 동일한 공간을 할당하는 것을 알 수 있다.
1번에서 필터링을 하지만 3번에서는 필터링이 없으므로,
1번에서 할당하고 해제한 다음 3번에서 재할당을 하면,
필터링 없이 동일 주소영역에 값을 넣을 수 있게 된다.
그러므로 3번에서 command injection을 삽입하고
4번으로 실행하면 shell을 딸 수 있다.
'CTF' 카테고리의 다른 글
[Defcon CTF 2016] baby-re write up (1) | 2016.05.26 |
---|---|
[TU CTF 2016] WoO & WoO2 & woO2-fixed write up (0) | 2016.05.21 |
[Plaid CTF 2016] butterfly write up (1) | 2016.04.21 |
[sCTF 2016] pwn3 write up (0) | 2016.04.21 |
[sCTF 2016] pwn2 write up (0) | 2016.04.19 |