FTZ level16 풀이
FTZ level16 풀이
level16의 홈디렉토리에 level17의 권한으로 setuid가 걸린 attackme 프로그램 존재
hint 파일을 열어보자
hint 파일에는 c소스 파일이 있었다. 해석해보자
코드 해석을 참조하면 level17의 권한으로 셸을 실행하는 함수 shell 함수와 단순 출력을 하는 printit 함수를 선언하고 call 포인터에 printit 함수를 저장하고 main()의 마지막부분에서 호출한다. 그렇다면 printit을 가르키고 있는 call의 주소 값을 shell 함수 주소로 변조하면 어떻게 될까?
문제를 해결하기 위한 방법을 생각해보자.
1 : buf[20] 에서 부터 *call 까지의 거리
2 : shell 함수의 주소 가져오기
3 : *call위치에 shell 함수 주소를 덮어 씌우는 페이로드 제작
우선 buf[20] 에서부터 *call 까지의 거리를 확인해보자
디버깅을 위해 attackme 파일을 tmp/로 복사
0x08048530 <main+24>: lea eax,[ebp-56] 해당 부분을 확인해보면 buf에서부터 ebp의 거리를 확인할 수 있다.
buf[20]에서 부터 ebp 까지의 거리 = 56
0x0804853c <main+36>: mov eax,DWORD PTR [ebp-16] 해당 부분을 확인해보면 call 에서부터 ebp의 거리를 확인 할 수 있다.
call 에서부터 ebp 까지의 거리 = 16
buf[20] 에서부터 call 까지의 거리 = (buf[20]에서부터 ebp까지의 거리) - (call 에서부터 ebp 까지의 거리) = 56 - 16 = 40
이제 p 명령어로 shell 함수가 위치해 있는 주소를 확인해보자
shell 함수가 위치한 주소 = 0x80484d0
이제 본격적으로 페이로드를 작성해보자
기본적으로 페이로드는 [buf~call 거리] + [shell 함수 주소] 이런식으로 작성할 것이다.
최종적인 페이로드는 (python -c 'print "\x90"*40+"\xd9\x84\x04\x08:';cat) | ./attackme
성공적으로 call 포인터가 shell 함수주소를 불러오게 변조되어 셸이 실행됬다. my-pass 명령어로 level 17의 패스워드 출력
level16 clear ~
'System Hacking > FTZ' 카테고리의 다른 글
FTZ level18 풀이 (0) | 2017.07.04 |
---|---|
FTZ level17 풀이 (0) | 2017.07.04 |
FTZ level15 풀이 (0) | 2017.07.04 |
FTZ level14 풀이 (0) | 2017.07.04 |
FTZ level13 풀이 (0) | 2017.07.04 |