system hacking

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

leesu0605 2022. 9. 21. 01:13

일단 파일을 내려받아 아이다로 열어보았다.

bss 세그먼트에 있는 name변수에 첫번째 문자열을 입력받고, s에 gets로 두번째 문자열을 입력받고 있다.

일단 스택부터 살펴보자.
문자열 s에 gets 함수를 통해 입력받고 있는데, 길이 제한이 없으므로 main의 ret 주소를 오버플로우 시킬 수 있다.

따라서 20바이트의 배열 + 4바이트의 sfp + 4바이트의 ret 로 페이로드를 날리면 ret 주소 오버플로우가 된다.

그런데 쉘을 실행시켜주는 함수가 함수 리스트에 존재하지 않는다.
이럴 땐 어떻게 해야될까?

바로 쉘코드를 어떤 위치에 직접 주입해서 함수가 리턴될 때 eip가 그 주소로 가도록 조작하는 방법을 쓰면 된다.

따라서 name 배열에 쉘코드를 주입하고, 리턴 주소를 name의 주소로 변조하면 main이 리턴될 때 쉘코드가 실행될 것이다.
한 번 페이로드를 구성해보자.

이렇게 구성을 완료했다.

일단 name에 문자열을 입력받을 때 shellcode를 입력했고,
input에 문자열을 입력받을 때 '24바이트의 dummy값 + name 배열 주소를 p32로 패킹한 값'을 보내 리턴할 때 eip가 쉘코드를 가리킬 수 있도록 해주었다.

한 번 실행시켜보자.

정상적으로 쉘코드가 따졌고, 플래그도 읽을 수 있는 걸 볼 수 있다.

flag : L7{b779392f0959f55e6b7581133a47fa3b}