level13
먼저 힌트를 확인했다. 여태까지 풀었던 버퍼오버플로우 문제들과 비슷했는데, 한 가지 다른 점은 변수 i를 두어서 그 값이 변하면 버퍼오버플로우 경고를 띄우며 프로그램이 종료되도록 설계되었다.
gdb로 프로그램을 살펴보면 총 418 byte(10진수로 1048)만큼 할당하고 마지막 12 byte는 0x1234567로 채운다.
프로그램을 먼저 실행해 어느 부분에서 경고가 발생하는지 확인했는데, 1048에서 12를 뺀 1036 byte의 인자를 넣었을 때는 경고가 발생하고 그보다 작은 1035 byte의 인자를 넣었을 때는 경고가 발생하지 않았다.
다음으로는 gdb에서 1035 byte의 인자를 대입한 후 값이 어떻게 변하는지 확인해보았다.
41으로 값이 채워지며, 마지막에 i의 값인 0x01234567이 들어있는 것을 확인할 수 있었다.
그리고 i 값이 변조되는 것을 막기 위해 "0x01234567"을 대입해주었다. 리틀 앤디안 방식으로 정리해서 대입했는데, 67이 원래 자리가 아니라 그 앞에 붙었다.
"A"를 1035 byte에서 1036 byte로 늘려주니 정상적으로 값이 들어갔다.
메모리를 확인했으니 쉘을 실행하기 위해 지난 번과 같이 환경변수를 만들고 그 주소를 찾았다.
i의 값이 변조되지 않도록 1056 byte를 채우고 쉘 주소를 붙여주니 쉘이 실행되어 패스워드를 구할 수 있었다.
what that nigga want?
'CTF > 시스템' 카테고리의 다른 글
해커스쿨 FTZ level15 (0) | 2020.09.24 |
---|---|
해커스쿨 FTZ level14 (0) | 2020.09.22 |
해커스쿨 FTZ level12 (0) | 2020.09.17 |
해커스쿨 FTZ level11 (0) | 2020.09.17 |
해커스쿨 FTZ level10 (0) | 2020.08.27 |