FTZ level18 풀이
FTZ level18 풀이
level 18의 홈디렉터리에 level19 의권한으로 setuid가 걸린 attackme 프로그램 확인
hint를 열어보자
힌트에는 전 문제들과는 다르게 엄청 복잡한 코드가 나왔다. 흠.. 최대한 해석해보도록 하자..
코드가 시스템에 관해 알아야할 내용이 많고 복잡해서 최대한 간단하게 설명하도록 하겠다.
소스에서 check 변수의 값이 0xdeadbeef 면 sheelout 함수를 호출해 level19권한으로 /bin/sh 셸이 실행된다. 하지만 string[100] 보다 check 변수가 뒤에 존재해 일반적인 BOF로는 문제를 해결할 수 없을것 같다.
여기서 가장 중요한 부분은 버퍼의 문자수를 조절해주는 count 변수가 0x08 입력이 들어오면 1감소하게 된다는 점이다.
그렇다면 배열의 인덱스가 -가 되도록 하면 앞의 메모리에 접근이 가능하게 될것이다. 즉, string[100]보다 나중에 존재하는 check 변수에 접근이 가능하다는 것이다.
어떤 식으로 문제를 해결할지 생각해보자
1 : string[100] 에서 부터 check 까지의 거리
2 : check 에 0xdeadbeef를 덮어씌우는 페이로드 작성
우선 string[100] 에서 부터 check 까지의 거리를 알아보자
디버깅을 위해 attackme 파일을 tmp/ 디렉토리로 이동
0x08048743 <main+499>: lea eax,[ebp-100] 이 부분을 확인하면 string에서부터 ebp 까지의 거리를 알 수 있다
string[100] 에서부터 ebp 까지의 거리 = 100
0x080485ab <main+91>: cmp DWORD PTR [ebp-104],0xdeadbeef 이 부분을 확인하면 check변수 에서부터 ebp 까지의 거리를 확인 할 수 있다.
check 변수 에서부터 ebp 까지의 거리 = 104
string 변수에서 부터 check 까지의 거리 = [string[100] 에서 부터 ebp 까지의 거리] - [check변수에서 부터 ebp 까지의 거리] = 100 - 104 = -4
생각대로 check 의 위치가 string 보다 앞에 위치해있다.
이제 페이로드를 작성해 보자
기본적인 페이로드는 [string에서부터 check 까지의 거리] + [0xdeadbeff값] 이다
여기서 참고 할 점은 string에서부터 check 까지의 거리인 -4 는 0x08을 입력시 버퍼의 문자수를 조절해주는 count변수가 -1 되는것을 이용해 역으로 돌아가는 방법을 사용해야 합니다.
최종적인 페이로드는 (python -c 'print "\x08"*4 + "\xef\xbe\xad\xde"';cat) | ./attackme
성공적으로 0x08 의 4회 입력을 통해 버퍼 인덱스가 -4 를 가르키게 되어 check 변수에 0xdeadbeef 값를 덮어 씌울수있게 되었다.
my-pass 명령어를 통해 level19 패스워드 출력
level 18 clear~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level20 풀이 (1) | 2017.07.05 |
---|---|
FTZ level19 풀이 (0) | 2017.07.04 |
FTZ level17 풀이 (0) | 2017.07.04 |
FTZ level16 풀이 (0) | 2017.07.04 |
FTZ level15 풀이 (0) | 2017.07.04 |