정성 들여 쓴글이 다 날라갔습니다 허허허
인생은 참 무엇인지... 최소한의 기록만 남겨야겠습니다.
======================================================
보호 기법 확인(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된 값을 입력해 정상적으로 쉘 획득 함
공격 코드
