정성 들여 쓴글이 다 날라갔습니다 허허허

인생은 참 무엇인지... 최소한의 기록만 남겨야겠습니다.


======================================================


보호 기법 확인(checksec)




CANARY, NX 확인, 서버 환경 상 ASLR enable.




프로그램 동작 분석


x86 binary 로 사용자에게 captcha를 입력 받음

맞을 경우 base64 encoding 된 값을 입력 받아 md5 값 계산, 출력 후 프로그램 종료






취약점 탐색


사용자 입력 부분을 이것 저것 살펴보다가 base64 값 입력 부분에서 stack smashing 이 나는 것을 확인



memory leak을 해 canary를 확인해 BOF 하거나, 아니면 다른 취약점을 찾아야 함



binary를 리버싱해보면 다음과 같이 canary 와 현재 time 값 seed 의 rand() 값을 이용해 captcha를 생성하는 것을 확인할 수 있음 





즉 captcha 값과 captcha 생성 시 time seed 값을 알 수 있으면 역으로 canary 값을 계산할 수 있음


문제 설명의 hint를 보면 

hint : this service shares the same machine with pwnable.kr web service


pwnable.kr 웹서비스 요청을 통해 시간을 알 수 있다




Canary 계산


Canary 계산을 위해 unix timestamp 값과 captcha 를 입력 받아 계산해주는 코드를 짰다. 대~~충



python 코드에서 위 프로그램 호출 후 return 된 값을 & 0xffffffff 해 4바이트 처리를 해 줌




EIP control 시도


Canary 및 return address 위치 확인을 위해 gdb로 메모리 분석


A*512 를 base64 encoding 후 입력 했을 때



gdb-peda$ x/16wx $ebp-0x1c

0xbfffee9c:     0x41414141      0x41414141      0x41414141      0x41414141

0xbfffeeac:     0x464b5000      0xb7da4000      0x00000000      0xbfffeee8

                    ( Canary )

0xbfffeebc:     0x08049174      0x08049314      0xbfffeed8      0x00000001

                   (Return addr)


Payload = A * 512 + Canary 4byte + A*12 + Return addr 4byte 


위 Payload 를 base64 encoding 해 입력하면 정상적으로 EIP control 이 될 것이고 로컬 테스트 완료 함




/bin/sh 실행 방법 구상



EIP control 은 됐고... 쉘은 어떻게 잡아야될 지 생각해보자


ASLR이 적용되어 있으므로


1. Memory leak  -> libc base addr 계산 -> system(/bin/sh) 실행

2. 고정된 주소(code, bss .... ) 사용


둘 중 하나의 방법을 사용해야 할텐데 main() 함수를 보면 다음과 같이 system() 을 call 하는 곳이 있다



이제 /bin/sh 문자열만 메모리에 올리고 주소만 알면 되는건데, 변수를 살펴보면 다음과 같이 고정된 주소를 사용하는 g_buf가 있다



근데 g_buf에 들어가는 값은 base64 encoding된 값이고, decoding된 값은 스택에 들어가서 주소가 유동적임


-  "/bin/sh\n00" + encoded value  로 payload를 구성해 보내볼까?

     :  base64 decoding 이 정상적으로 될 리 없음.


- 그냥 memory leak 할까...

     :  leak 없이 해보려고 했는데 약간 아쉬움?


- 설마 base64 encoding해 /bin/sh 문자열이 될 수 있나?




     :  /bin/sh 로 디코딩 시 패딩 에러... 발생해 /bin//sh 로 사용해 정상적으로 인코딩, 디코딩 되는 것을 확인함


     : base64 인코딩으로 NULL은 만들지 못하지만 Payload 제일 마지막에 붙이면 NULL 삽입 없이 되지 않을까


결과적으로 


Payload = A * 512 + Canary 4byte + addr_of_system_call + addr_of_/bin//sh + 0xfdb8a7fffb21


로 Payload 구성, base64 encoding된 값을 입력해 정상적으로 쉘 획득 함




공격 코드


















'Pwnable.kr > Rookiss' 카테고리의 다른 글

[pwnable.kr] crypto1 - 120pt  (0) 2017.05.20
[pwnable.kr] brain fuck - 150pt  (0) 2017.04.16
[pwnable.kr] fsb - 20pt  (0) 2016.11.17
[pwnable.kr] echo2 - 50pt  (0) 2016.11.10
[pwnable.kr] simple login - 50pt  (0) 2016.08.23

+ Recent posts