tmxklab
[FTZ] Level17 풀이 본문
1. 문제확인
1) 사용자 및 패스워드 : level17 / king poetic
2) 파일확인
3) hint 코드 설명
#include <stdio.h>
void printit(){
printF("Hello there!\n");
}
main()
{
int crap;
void (*call)()=printit;
char buf[20];
fgets(buf, 48, stdin);
setreuid(3098, 3098);
call();
}
- fgets()로 인해 buf[20bytes]배열의 크기보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재
- Level16과 달리 shell()가 사라지고 printit()만 존재
2. 접근방법
1) attackme 디버깅
- <main+6> : [ebp-16]에 0x8048490(printit()의 시작 주소값)넣음 → [ebp-16]은 call함수 포인터 변수를 의미
- <main+24> : fgets함수의 첫 번째 인자 buf배열의 주소 값([ebp-56])을 eax에 넣음
- <main+57> : fgets(), setreuid()실행 후 call포인터 변수에 저장된 주소 값을 eax에 넣고 call명령어를 통해 실행
2) 스택구조
3) 결론
- fgets()를 통해 buf배열의 크기(20bytes)보다 더 큰 값을 입력할 수 있지만 fgets()에서는 48bytes만 buf배열에 저장하므로 main()의 RET까지 도달하지 못함 -> buf배열은 [ebp-56]에 존재
- 하지만, 마지막에 실행하는 call변수까지는 도달할 수 있으므로(ebp-16) call변수의 주소 값을 변조해야함 -> printit()의 주소 값 대신에 쉘 코드 주소 값으로 채워넣음
3. 풀이
1) 쉘 코드 작성 및 환경변수에 등록
- call 포인터 변수에 SHELLCODE 주소 값을 넣기 위해 환경변수로 등록 후 주소 값 확인
2) 공격코드 작성
buf[20bytes] + dummy[20bytes] + call[4bytes, 환경변수 SHELLCODE의 주소 값]
3) bof 수행
'War Game > FTZ' 카테고리의 다른 글
[FTZ] Level19 풀이 (0) | 2020.01.12 |
---|---|
[FTZ] Level18 풀이 (0) | 2020.01.12 |
[FTZ] Level16 풀이 (0) | 2020.01.12 |
[FTZ] Level15 풀이 (0) | 2020.01.12 |
[FTZ] Level14 풀이 (0) | 2020.01.12 |
Comments