'2011/06/08'에 해당되는 글 3건
- 2011.06.08 [LEVEL13] darkknight -> bugbear (RTL1)
- 2011.06.08 [LEVEL12] golem -> darkknight (sfp) 1
- 2011.06.08 [LEVEL11] skeleton -> golem (stack destroyer)
⊙ 문제의 소스를 보자) |
#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 |
⊙ 문제의 소스를 보자) |
#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를 변조하여 프로그램의 실행 흐름을 바꾸는 문제이다. | ||
① main에서 problem_child() 호출
(*strncpy 호출 후 스택 내용) ③ problem_child의 프레임에 leave 명령을 통해
SFP가 있는 곳으로 이동 후 변조된 ebp값을 pop 함으로써 main()의 ebp값은 변조된 ebp값으로 저장. ④ child 프레임의 RET을 통해 다시 main 프레임으로 복귀. ⑤ main 프레임의 leave가 수행된다.
⑥ 마지막으로 ret 명령으로, eip 는 esp를 참조해서 다음 실행할 주소로 점프 한다.
♧이렇듯 1Byte의 변조만으로 실행흐름이 바뀔 수 있다. |
∑ 익스 플로잇 작성! | ||
① 대략적인 구성. ( buffer 주소 :: [ 0xffffac4 ] 위 그림 참조.)
② 공격 스크립트 작성
③ ∑xploit
|
※ 사전에 chsh명령 -> bash2로 변경 후 재로그인 함.
golem : "cup of coffee"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL14] bugbear -> giant (RTL2, only execve) (0) | 2011.06.09 |
---|---|
[LEVEL13] darkknight -> bugbear (RTL1) (0) | 2011.06.08 |
[LEVEL11] skeleton -> golem (stack destroyer) (0) | 2011.06.08 |
[LEVEL10] vampire -> skeleton (argv hunter) (0) | 2011.06.07 |
[LEVEL9] troll -> vampire (check 0xbfff) (0) | 2011.06.05 |
⊙ 문제의 소스를 보자) |
#include <stdio.h> #include <stdlib.h>
extern char **environ;
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 is still your friend.\n"); exit(0); }
strcpy(buffer, argv[1]); printf("%s\n", buffer);
// stack destroyer! memset(buffer, 0, 44); memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48)); } |
1) if문으로 argv[1][47] != '\xbf' 체크. |
♧ 공유 라이브러리 이름을 쉘코드로 하여 LD_PRELOAD 등록 후 스택 찌꺼기?에 남아있는 곳을 찾아 RET으로 설정한다.
∑ 익스 플로잇 작성! | ||||
① 공유 라이브러리 생성
② LD_PRELOAD 환경변수 등록
③ GDB로 RET 주소 찾기. (사본::cp golem melog)
④ ∑xploit
|
♣ 기타 사항 |
ⓐ LD_PRELOAD로 등록 후 원본(golem)과 사본(melog)의 libc주소가 서로 틀려 졌다. ⓑ 그리하여 RTL을 이용 하여 만든 쉘코드는 원본(golem)에 적용되었다. (이유는 잘 모르겠다 좀더 시간 내서 공부를 해야 될듯...-_)
|
golem : "cup of coffee"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL13] darkknight -> bugbear (RTL1) (0) | 2011.06.08 |
---|---|
[LEVEL12] golem -> darkknight (sfp) (1) | 2011.06.08 |
[LEVEL10] vampire -> skeleton (argv hunter) (0) | 2011.06.07 |
[LEVEL9] troll -> vampire (check 0xbfff) (0) | 2011.06.05 |
[LEVEL8] orge -> troll (check argc) (0) | 2011.06.04 |