Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

binee::

[Plaid CTF 2016] unix_time_formatter write up 본문

CTF

[Plaid CTF 2016] unix_time_formatter write up

binee108 2016. 4. 23. 11:29

낮은 스코어 답게 쉽게 풀었지만,

환경변수 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