tmxklab
[FTZ] Level14 풀이 본문
1. 문제확인
1) 사용자 및 패스워드 : level14 / what that nigga want?
2) 파일확인
3) hint 코드 설명
#include <stdio.h>
#include <unistd.h>
main()
{
int crap;
int check;
char buf[20];
fgets(buf, 45, stdin);
if(check==0xdeadbeef)
{
setreuid(3095, 3095); // level15의 ruid, uid값으로 변경
system("/bin/sh"); //
}
}
- 프로그램 실행 후 fgets함수를 통해 사용자의 입력을 받을 수 있음(stdin)
- buf변수의 20bytes보다 더 큰 입력 값을 넣을 수 있음 → bof 취약점 존재
2. 접근방법
1) attackme 디버깅
- 함수의 프롤로그(push ebp, mov ebp, esp)이후에 ebp-0x38(56bytes)만큼 스택 확보
- fgets()의 인자 값을 받기 위해 3번의 push를 진행, 첫 번째 인자 값(buf배열의 주소)를 받기 위해 push하는데 이때 [ebp-56]에 buf배열(20bytes)이 존재함을 알 수 있음
- if문으로 인해 cmp, jne명령어를 수행함, 이때 if문에서 check변수와 0xdeadbeef를 비교, 따라서 [ebp-16]에 check변수(4bytes)가 존재함을 알 수 있음
- 함수의 에필로그(leave, ret)
2) 스택구조
3) 결론
- if문에 진입하면 setreuid()와 system()으로 인해 level15의 쉘 권한 획득 가능
- 따라서, if문의 조건을 충족시키기 위해 buf값을 조작하여 check의 변수 값을 0xdeadbeef로 변경해야함
3. 풀이
1) 공격 코드 작성
- buf[20bytes] + dummy[20bytes] + check[4bytes]
- 40bytes는 쓰레기 값, 나머지 4bytes는 0xdeadbeef로 채우면 됨
2) bof 수행
- fgets()로 입력을 받으므로 2개의 명령어를 사용해야함(python, cat) → 세미콜론 사용
- 따라서, python프로그램을 통해 공격코드를 화면에 출력하고 이를 cat과 파이프를 사용하여 화면에 출력한 값을 ./attackme의 입력 값으로 받으면 됨
'War Game > FTZ' 카테고리의 다른 글
[FTZ] Level16 풀이 (0) | 2020.01.12 |
---|---|
[FTZ] Level15 풀이 (0) | 2020.01.12 |
[FTZ] Level13 풀이 (0) | 2020.01.12 |
[FTZ] Level12 풀이 (0) | 2020.01.12 |
[FTZ] Level11 풀이 (0) | 2020.01.12 |
Comments