[Hackerschool] FTZ level 17

level16과 동일하게 attackme, hint 파일이 존재한다.
먼저 printit() 함수가 선언되었다.
printf를 사용하여 "Hello there!"를 출력한다.
main()함수가 선언되었다. int형의 carp, void형의 함수 포인터 printit이 선언되었고.
char형의 buf 리스트가 20byte 크기로 선언되어 있다.
fget 함수를 사용하여 표준 입력 방식으로 48byte를 buf에 대입한다.
setsuid 함수로 권한을 level18로 바꾼 후에 call 함수를 호출하며 main 함수가 끝난다.
buf는 20byte이나 fgets에서 48byte를 대입하므로 오버플로우가 발생할 수 있다.
지난번 문제와의 차이점은 shell을 실행하는 부분이 없다.
때문에 환경변수를 사용하여 직접 쉘을 실행시켜야 한다.

attackme 파일을 분석하기 위해 tmp 디렉토리로 복사했고
ls를 사용하여 복사된 것을 확인하였다.

gdb 명령어로 attackme 파일을 분석하였다.
crap(4) + void(4) + buf(20) = 28byte 이나 0x38( 56byte )가 할당되어 있으므로
56byte에서 28byte는 dummy라는 것을 알 수 있다. 지난번 문제와 메모리 구조가 동일하다.
환경변수를 등록하여 *call()의 자리에 환경변수의 주소를 대입하는 방식으로 풀면 된다.
[ 메모리 구조 ]
RET // 4byte
SFP // 4byte
dummy // 8byte
crap // 4byte
*call() // 4byte
dummy // 20byte
buf // 20byte

bash를 실행시키기 위한 쉘 코드 SHELLCODE를 등록하였고,
export 명령어를 사용하여 확인하였다.

test 파일을 만들어 SHELLCODE 환경변수의 주소값을 확인했다.

[ 페이로드 ]
buf ( 40byte ) + dummy ( 40byte ) + 환경변수 SHELLCODE 주소값
" A " * 40 + "\x1b\xfc\xff\xbf"
페이로드를 대입하여 level18의 권한을 얻었고, my-pass로 비밀번호를 얻었다.
level18의 패스워드는 " why did you do it "