system hacking

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

leesu0605 2022. 9. 21. 00:20

파일을 다운받아 아이다로 열어보았다.

vuln이라는 함수가 보여 거기로 들어가봤다.

20바이트짜리 s 배열을 선언해줬고, 입력을 받고 있었다.
그러나, 배열의 크기는 20바이트인데, fgets에선 80바이트만큼 입력받고 있었고, 여기서 취약점이 터진다는 사실을 알아냈다.
다른 코드 로직이 보이지 않는 걸로 보아 vuln 함수의 ret 주소를 변조해 vuln에서 리턴할 때 쉘을 실행시키는 함수로 이동해야하는 것 같았는데, 마침 win이라는 수상한 함수가 보였다.
그래서 내용을 확인해보니,

역시 쉘을 실행시키는 코드가 탑재되어 있었다.

따라서 win의 주소값으로 vuln함수의 ret주소를 변조하면 문제가 풀릴 것이다.
win의 주소값은 어셈블리어 코드로 변환해 구했다.

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

sendlineafter 함수 부분을 보면, 24바이트의 dummy값을 보내 배열의 크기 + sfp까지 덮고, 함수의 주소를 p32로 패킹해 보내며 ret 주소를 win 함수로 변조하고 있다.

이런 식으로 페이로드를 구성하면 vuln 함수가 끝날 때 main 함수가 아닌 win 함수로 리턴해 쉘 함수를 따낼 수 있을 것이다.

한 번 실제로 적용되는지 확인해보자.

익스플로잇이 성공적으로 먹혀 쉘을 따냈고, 플래그를 읽을 수 있는 권한이 주어졌다.

flag : L7{64b097ed6de6da86b257aebcbbd11a31}