티스토리 뷰

level9 힌트를 보면 bof에 대한 문제라고 미리 알려줍니다. 그리고 소스를 공개하고 있습니다. 


파일을 찾아서 ls-al로 확인 결과 읽을 수가 없고 실행만 가능하네요. 다행히 위에 소스를 공개했으니 저 소스를 복사해서 따로 파일을 만들어서 분석 진행 하겠습니다.


위의 소스와 똑같이 bof를 tmp 디렉터리에서 다시 만들었습니다. 물론 권한은 읽기 권한을 주었습니다. 

소스 내용을 요약하면 일단, buf, buf2 각각에 배열을 할당하고 fgets함수로 buf를 받습니다. 하지만 바로 밑의 strncmp는 buf2와 "go"의 문자열을 비교하여 앞의 2글자가 맞으면 성공이네요. 하지만 fgets으로 받는 것은 buf이기 때문에 buf2값에 "go"라는 값을 넣어줘야 성공하는 문제입니다. 


컴파일 후에 bof 파일을 볼 수가 있습니다. -ggdb 옵션은 gdb 환경에서 list 옵션을 이용해서 소스코드를 볼 수 있는 개발자 옵션입니다.


bof를 실행한 결과 "It can be overflow"가 출력되고 값을 받는 것 같네요.


gdb로 한번 bof 파일을 리버싱 해보겠습니다. -q 옵션은 gdb를 입력했을 때 나타나는 몇 줄의 배너를 제외하고 실행됩니다. 훨씬 깔끔합니다. 


gdb로 구조를 파악하기 전에 선언한 buf와 buf2의 메모리 주소값을 확인 하기 위해서 소스를 하나 추가하겠습니다.


아래와 같이 buf, buf2의 메모리 주소 값을 출력하는 소스를 넣고 다시 컴파일 합니다.


실행을 하게 되면 아래와 같이 buf(0xbfffef40), buf2(0xbfffef50)에 메모리 주소가 할당이 되어 있습니다. 즉, 여기서 확인해야 할 것은 둘의 메모리 주소는 0x10(16바이트)만큼 떨어져 있습니다. 여기서 목표는 buf2 값에 "go"를 입력하여 암호를 획득해야 하기 때문에 16바이트 만큼 데이터를 쓰고 그 다음에 바로 "go"를 쓰면 되지 않을까 하고 생각했습니다.

* 메모리 주소는 실행할 때마다 달라지기 때문에 분석을 할 때 참고 하세요.


직접 gdb에서 실행을 해보면 입력 값 부분에 BP를 걸고 실행해서 16글자와 "go"를 입력합니다. 그러면 buf2의 메모리 주소 값에 "go" 가 들어가는 것을 볼 수 있습니다.


예상대로 'z'라는 문자열을 16번 입력한 뒤에 바로 go를 입력하니 저절로 buf2값에 씌워 져서 답이 확인 되는 것을 볼 수가 있습니다. 그렇다면 바로 위의 소스 setreuid(3010, 3010) 후에 /bin/bash를 실행하기 때문에 level10의 권한으로 변한 것을 볼 수가 있습니다.






참고로 스크립트 언어(파이썬, 루비, 펄)들을 이용해서 직접 입력 없이 이런 식으로 가능하기 때문에 나중에 100글자를 입력한다고 하면 하나하나 입력하는데 스트레스가 장난 아닐 것 같습니다. 스크립트를 이용하면 금방 해결이 되기 때문에 권장합니다.


'시스템해킹 > FTZ' 카테고리의 다른 글

FTZ LEVEL11 문제풀이  (2) 2015.07.28
FTZ LEVEL10 문제풀이[공유메모리]  (0) 2015.07.25
FTZ LEVEL8 문제풀이  (0) 2015.07.22
FTZ LEVEL7 문제풀이  (0) 2015.07.22
FTZ LEVEL6 문제풀이(시스템 인터럽트)  (0) 2015.07.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함