보호기법은 ASLR과 NX-bit가 걸려 있습니다.
level03 문제 같은 경우는 입력 값에 대한 필터링이 몇 개 존재하고, 특이한 점은 클라이언트에게 입력 받자마자 소켓을 닫아버립니다. 따라서, exploit은 최초 한 번 입력 후 서버가 다시 reverse bind 하는 방법으로 작성하였습니다.
bof가 발생하는 부분은 decode_string() 함수입니다.
decode_string() 함수의 경우 전체적인 동작은 memcpy(src, dest, size) 와 비슷한데, size를 체크하는 부분에서 '<', '>' 와 같이 비교해야하는데, 단순히 != 로 비교하기 때문입니다.
그래서, 이 부분만 넘어가게 되면 while문에서 조건을 검사할 때 dest != end 부분은 계속 참을 가지게 되고, src변수가 끝날 때 까지 계속 dest 변수에 복사를 하게 됩니다.
그리고 while문 안을 보면 아래 소스와 같이 '\\u' 인 경우 dest를 두 번 증가시켜주는 부분을 볼 수 있습니다.
따라서, 초기에 src에 A를 127개 넣고 그다음에 \\u를 넣으면 dest++; dest++; 하게되어 dest>end인 경우가 되어버리게 됩니다. 이러면 dest != end는 무조건 참이 됩니다.
그래서 아래와 같은 exploit 코드를 작성하였습니다. (실패한 exploit)
% *malloc_got -> system_libc
add [ebx + 0x5d5b04c4], eax ; ret 와 같은 형식의 가젯을 이용해 got overwrite 할 때, 만약 변경 대상이 되는 함수 (malloc)의 libc 주소가 변경 하려는 함수(system) 의 libc 보다 커야 eax 레지스터에 NULL바이트가 아닌 값을 넣을 수 있게됩니다.
위 문제를 풀면서 참고했던 사이트들 주소
https://pen-testing.sans.org/blog/2013/05/06/netcat-without-e-no-problem
- nc(netcat)을 이용한 backdoor (nc에서 -e 옵션이 없을 때)
http://egloos.zum.com/improf/v/2916457
- openssl의 HMAC함수의 인자 설명
http://bujakim.blogspot.kr/2014/09/linux-c-c-json-json-c_3.html
- c언어에서의 json 형식
- python에서의 hmac 사용
'WARGAME > exploit-exercise' 카테고리의 다른 글
[exploit-exercise] fusion level02 (0) | 2015.12.22 |
---|---|
[exploit-exercise] fusion level01 (0) | 2015.12.22 |
[exploit-exercise] fusion level00 (0) | 2015.12.22 |