⊙ 문제의 소스를 보자) |
#include <stdio.h> #include <stdlib.h>
main(int argc, char *argv[]) { char buffer[40]; int i;
if(argc < 2){ printf("argv error\n"); exit(0); }
if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); }
strcpy(buffer, argv[1]); printf("%s\n", buffer); } |
♧ RET이 "\xbf"로 시작 할 수 없다. 즉, RET을 스택영역으로 둘 수 없다. 그렇기 때문에 RTL(Return-into-Libc) 기법을 통한 문제를 문제를 풀도록 하자. (*자세한 내용은 밑에 참조 문서를 참고 하도록 하자.) | |||||
ⓐ 공유 라이브러리의 함수의 위치는 정해져 있다. 시스템마다 위치가 다르기는 하지만 한번 위치가 알려지면 재컴파일되기 전까지는 위치가 같다. ⓑ 쉘코드를 사용하는 대신에 RET지점에 라이브러리 함수( system(), exit(), "/bin/sh")같은 위치값을 넣어주면 그 함수로 점프하게 된다. ⓒ 스택에서 함수 호출은 다음과 같은 모양이다.
ⓓ 간단한 구성은 다음 그림과 같다. | |||||
참조 문서 | |||||
∑ 익스 플로잇 작성! | ||||||||||
① 필요한 함수와 인자의 주소(system, exit, "/bin/sh")를 구해 보자.
② 공격 스크립트 작성
③ ∑xploit
|
※ 사전에 chsh명령 -> bash2로 변경 후 재로그인 함
darkknight : "new attacker"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL15] giant -> assassin (no stack, no RTL) (0) | 2011.06.10 |
---|---|
[LEVEL14] bugbear -> giant (RTL2, only execve) (0) | 2011.06.09 |
[LEVEL12] golem -> darkknight (sfp) (1) | 2011.06.08 |
[LEVEL11] skeleton -> golem (stack destroyer) (0) | 2011.06.08 |
[LEVEL10] vampire -> skeleton (argv hunter) (0) | 2011.06.07 |