level 9
2020. 9. 6. 02:08
오 이번엔 방해꾼이 별로 없네요.
인자 개수도 자유이고(두개이상), 48번째 == "\bf", 47번째 != "\xff" 밖에 없네요.
그러면 어떠한 인자의 주소가 0xbff(0~e)~~ 이여야 한다는 소리죠.
어떻게 해야할까요?
정답은 메모리 구조를 살펴보면 있습니다.
커널은 c0000000 ~ ffffffff까지 존재하죠. 전체의 1/4입니다.
커널의 메모리가 덮여지면 아주아주 큰일이 나겠죠? 아예 고장날겁니다.
그래서 메모리는 높은 주소에서 낮은 주소로 상승하게 되어있습니다.
'커널 영역'에 메모리가 덮여지는 것을 방지하기 위해서 말이죠.
그렇다면, 우리가 main 함수의 인자에 무지막지한 길이의 문자열을 전달한다면 과연 높은 주소로 길어질까요, 낮은 주소로 길어질까요.
위의 내용을 이해했다면 당연히 낮은 주소로 길어진다고 답할 것입니다.
따라서 이 문제의 핵심은 인자의 주소 혹은 buffer 변수의 주소를 즉, main 함수를 낮은 주소로 끌어올려라 라는 말을 하는 것입니다. 그렇다면 무지막지한 길이를 주면 되겠죠?
buffer 변수 혹은 argv[2] 이든 상관없습니다.
저는 쉽게 argv[2]에 focus 하겠습니다.
A를 10만개 줬습니다.
ff가 아닌 fe로 성공적으로 나오네요.
41이 들어간 자리 모두 NOP 바이트가 들어갈 자리입니다.
따라서 아무자리나 골라보죠.
저는 0xbffe75f0을 고르겠습니다.
payload를 작성해보죠.
`"A"*44 + "\xf0\x75\xfe\xbf"`, `"\x90"*100000 + "~~"(ShellCode)`
음하하 또 성공이네요.