system hacking

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

leesu0605 2022. 9. 21. 08:14

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

보아하니, 처음에 buf char형 배열의 주소를 출력하고, 몇 바이트를 입력받을지 nbytes에 받아낸 후 그 바이트만큼 buf에 입력받을 수 있게 해주는 프로그램 같았다.

그러나 nbytes의 크기에 제한이 없기 때문에 buf의 크기보다 훨씬 더 많은 양의 내용을 입력할 수 있었다.
그러므로 우린 256바이트의 dummy값 + 4바이트의 sfp값 + 4바이트의 변조할 주소를 입력하면 main의 ret주소를 변조해 main이 리턴될 때 특정 위치로 eip를 이동시킬 수 있다.

이를 구현한다면,
1. 첫 줄에 출력하는 buf address 를 파싱을 통해 구해준다.
2. 페이로드의 길이를 size 에 입력한다(여기선 264를 넘겨주면 된다).
3. 쉘코드와 (260바이트-쉘코드의 길이)의 무작위값을 입력하고, 파싱을 통해 구해준 buf address를 p32로 패킹해 보내주면 main에서 리턴할 때 buf의 시작주소로 eip가 이동되어 아까 buf에 넣어준 쉘코드가 실행될 것이다.

한 번 직접 구현해보자.

일단 buf의 시작 주소를 처음에 한 줄 입력받고, 14번째 문자부터 23번재 문자까지 사용해 주소 부분만 파싱한 걸 볼 수 있고,
두 번째 size 입력 칸에 페이로드의 길이인 264를 넣어줬다.

마지막으로, input 입력 칸에 shell코드 + (260-shell코드의 길이) + p32(해독한 buf) 를 입력해 buf에 쉘코드가 들어있게 하고, main의 ret 주소를 buf의 주소로 변경한 걸 볼 수 있다.

이를 실행시키면,

main함수가 리턴되며 쉘이 정상적으로 따진 걸 볼 수 있다.

flag : L7{4602bc6724e937de9a653b0118ae4df8}