system hacking

Layer7 포너블 2차시 과제 - change_ret64 풀이

leesu0605 2022. 9. 21. 00:48

일단 파일을 아이다로 열어 C로 디컴파일 해보았다.

32비트 버전과 main함수는 같았고, vuln 함수로 들어가보았다.

vuln 함수도 32비트 버전과 같았고, s의 길이만 달라졌다.
또, win 함수도 있으므로 전 문제와 똑같이 vuln에서 s에 입력받을 때 배열 길이보다 훨씬 더 많은 길이의 문자열을 입력받는다는 취약점을 이용해 ret주소를 win 함수 주소로 변경하면 된다.

한 번 페이로드를 구성해보자.

32바이트 배열+8바이트 sfp까지 dummy값으로 채웠다.
그 후, win함수의 주소를 p64로 패킹해 덧붙여주었고, 이는 vuln의 ret 주소에 들어가게 된다.

다만, win의 주소에 1을 더해서 넣어준 걸 볼 수 있는데..
이는 system 함수와 관련 있는 오류 때문이다.
system 함수 내에선 movaps라는 명령어를 쓰는데, 이 명령어의 피연산자의 주소가 16바이트 단위로 정렬돼있어야 하지만, win 함수의 push 함수로 8바이트가 밀린다.
따라서 push 함수를 건너뛰어주면, system 함수 내부에서 제대로된 명령어가 실행될 환경이 된다.
(알려준 사람 : sechack)
(참고 블로그 : https://hackyboiz.github.io/2020/12/06/fabu1ous/x64-stack-alignment/)

어쨌든 이 코드를 직접 실행해보자.

이렇게 쉘이 정상적으로 따지고 플래그를 읽을 수 있게 된 걸 볼 수 있다.