⊙ 문제의 소스를 보자) |
/* 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을 사용하지 못한다. |
1) FAKE EBP? | |
♧ 일반 RTL에서는 하나의 함수밖에 호출하지 못하지만 FAKE EBP를 사용 함으로서 여러 함수를 실행하는 공격이 가능 하다.
♧ RET에 leave;ret 주소를 덮음으로써 조작한 ebp로 실행흐름을 바꿀 수 있게 된다.
|
2) 구성 |
① 공격 당한 함수의 에필로그 leave가 실행되면 [mov ebp esp]로 인해 esp가 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()를 호출하게 된다.
|
∑ 익스플로잇 작성! | ||||||||||||
① 공격 스크립트 작성
② ∑xploit |
※ 사전에 chsh명령 -> bash2로 변경 후 재로그인 함
assassin : "pushing me away"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL18] succubus -> nightmare (plt) (0) | 2011.06.15 |
---|---|
[LEVEL17] zombie_assassin -> succubus (function calls) (0) | 2011.06.12 |
[LEVEL15] giant -> assassin (no stack, no RTL) (0) | 2011.06.10 |
[LEVEL14] bugbear -> giant (RTL2, only execve) (0) | 2011.06.09 |
[LEVEL13] darkknight -> bugbear (RTL1) (0) | 2011.06.08 |