2010.08.23 01:01 WarGame

저번 문제와 같이 바이너리를 얻을 수 없는 관계로

vnsecurity에서 작성한 문서를 토대로 제가 이해한 내용을 써내려가는 식의 포스팅을 하도록 하겠습니다


문제는 대략 메모를 남기는 프로그램을 Overflow 취약점을 이용해 쉘을 따는것 같습니다

여기서 핵심은 메모를 남기는 buffer의 크기가 매우 작아서, 쉘 코드가 들어갈 수 없다는 것입니다

쉘 코드를 나눠서 메모를 여러번 남김으로써, Exploit 하는 문제죠

먼저 문제 코드를 살펴보겠습니다


한가지 특이점은 29번째 줄의 

 if ( !setjmp(exception_env) )   


38번째 줄의
 
longjmp(exception_env, 1);   


라는 코드가 쓰인 것입니다

setjmp / longjmp 문에 대한 설명은

http://studyfoss.egloos.com/5275830 에서 얻을 수 있었습니다


setjmp/longjmp는 프로그램의 흐름을 비정상적으로 제어하는 것으로 이른바 nonlocal goto라고 불린다.
nonlocal이라고 하는 것은 일반 goto와 달리 함수 밖의 위치로 이동할 수 있기 때문이다.
하지만 아무런 제한없이 아무 함수로나 움직일 수 있는 것은 아니며
이동할 위치의 stack frame이 보존된 상태여야 한다.
(즉, 해당 함수가 아직 실행되고 있는 상태에야 한다.)
일반적으로 중첩된 함수 호출내에서 예외 상황이 발생한 경우
상위의 예외 처리 루틴으로 바로 제어를 넘겨서 실행할 수 있도록 구현할 수 있다.

그러니까 요약하자면

setjmp에서 저장한 레지스트리 값, 스택 구조는 복원하되, 스택 내용은 복원되지 않는다

라는 것이군요

먼저 한번의 메모 기록에 들어갈 수 있는 쉘 코드의 크기는 17byte 입니다

전체 메모 크기가 30 byte 지만

44번째 줄의

" Memo : < Shellcode> , size : <Code size> "

의 부가 설명 덕분에 13byte가 빠지게 됩니다

여기서 우리가 Shellcode 를 넣으려고 하는 Buffer는

memo_array[30][30] 이고 , 첫번째 기록한 메모와 두번째 메모와의 Gap 은 13byte 가 되므로

쉘코드 뒤에 JMP 13 명령어를 넣어주어야 할 것입니다

대략


<그림 1. 메모 1개 기록 할때의 memo_array[n][30] 구조>

그리고 메모를 모두 기록했다면, 마지막으로 memo_array의 주소로 JMP 해야 합니다

여기서 바로 longjmp 가 쓰이게 됩니다

longjmp를 조작해서 setjmp 가 아닌 Shellcode 가 들어있는 memo_array 의 주소로 JMP 하면

일사 천리로 진행되겠죠

37번째 줄의 OverFlow 를 이용합시다

여기서 메모리 구조를 살펴보면


<그림2. bss 구역의 메모리 구조>

buf[4]와 setjmp 에서 저장된 jmp_buf_tag 는 24byte 만큼 떨어져있습니다

정확히 24byte가 OverFlow 되므로 Exploit하는데 문제는 없어 보이는군요

정리해보죠

Shellcode를 한번 메모 기록에 15byte 씩 집어넣습니다

각 기록시 JMP 13 를 붙여 총 17 byte를 입력합니다

이렇게 잘라서 Shellcode를 삽입하고

마지막으로는 24byte를 OverFlow 시켜서 쉘코드의 초기주소로 점프 합니다

이 때 초기주소는 char buf[4] 가 0x0804AD48 이니까

900만큼 빼줘야겠죠 16진수로 384니까 이를 빼주면 0x804A9C0 입니다.

여기서 Memo : 수식부분 앞 꼬리 7 byte 를 건너 뛰면

0x804A9C7 이 됩니다


이를 이용해 vnsecurity 에서 짠 Exploit 코드는 다음과 같습니다



'WarGame' 카테고리의 다른 글

Padocon 2011 Twit Bot 문제 풀이  (0) 2011.02.27
Hackjam level3 Solution - Game of life  (0) 2010.08.28
ISEC 2009 Challenge 12 Solution  (0) 2010.08.23
ISEC 2009 Challenge6 with GOT OverWrite  (0) 2010.08.22
[ CodeGate 2010 ] Challlenge 15 풀이  (0) 2010.07.06
[ CodeGate 2010 ] Challenge 8  (0) 2010.06.22
Posted by LinkC
이전버튼 1 2 3 4 5 6 7 8 9 ··· 47 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday49
Today11
Total323,945

달력

 « |  » 2018.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          

최근에 받은 트랙백

글 보관함


. .