⊙ 문제의 소스를 보자) |
[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만 덮어 쓸 수 있다. esp에 저장된 복귀 주소를 pop하고 그 주소를 eip에 대입 하게 된다. 복귀 주소를 pop 하였기 때문에 esp+4가 됨으로써 다시 한번 리턴 할 수 있다. |
⊙ 구성도 |
♧ 인스트럭션 코드가 차례대로 실행되고 Return Address를 다시 한번 RET명령 주소로 덮어쓴다. ♧ 다시 한번 RET명령을 호출 함으로서 esp+4가 됨으로 system을 다시 호출 하게 된다.
|
(※ RET명령을 다시 호출 하는 것 외에는 전 단계와 동일 함으로 필요한 주소 찾는 과정은 제외 한다.)
∑ 익스플로잇 작성! | |||||||||
① 공격 스크립트 작성
② ∑xploit |
※ 사전에 chsh명령 -> bash2로 변경 후 재로그인 함
giant : "one step closer"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL17] zombie_assassin -> succubus (function calls) (0) | 2011.06.12 |
---|---|
[LEVEL16] assassin -> zombie_assassin (fake ebp) (0) | 2011.06.11 |
[LEVEL14] bugbear -> giant (RTL2, only execve) (0) | 2011.06.09 |
[LEVEL13] darkknight -> bugbear (RTL1) (0) | 2011.06.08 |
[LEVEL12] golem -> darkknight (sfp) (1) | 2011.06.08 |