level 15

2020. 9. 8. 20:46

 

이번에는 '\xbf', '\x40'를 검열하는 것으로 보아 스택과 공유 라이브러리를 못쓰게한 것 같네요.

처음엔 이것을 그냥 그저 안쓰려고 하고, 힙과 데이터 영역에서 그 해답을 찾고있었습니다.

하지만, 조금의 힌트를 얻고자 검색을 했습니다.

그러자 RET Sled를 이용하라고 하더군요.

딱 이거 읽자마자 나왔습니다.

 

RET Sled, 무슨 뜻일까요?

지금까지는 NOP Sled만 이용해왔습니다.

NOP 바이트는 아무것도 수행하지않는 어셈블리어 연산으로 눈썰매 타듯이 내려가 쉘코드를 실행하곤 했죠.

그렇다면 RET Sled도 ret를 여러번 실행하는 것일까요?

저는 차근차근 생각해보기로 했습니다.

ret를 여러번 실행하게 되면 어떻게 되지?

RET에는 주소가 담겨있습니다. 이를 POP하며 4바이트를 더함과 동시에 JMP하여 그 주소로 이동합니다.

그렇다면 RET를 여러번 사용하려면 어떻게 해야할까요?

바로 RET 주소에 RET 주소를 넣으면 됩니다. 약간 모양이 재귀와 비슷하죠.

두번째 실행된 RET는 어디로 보내야할까요? 잠깐, 두번째 RET의 값에는 검열이 있었나요?

없었죠. 검열은 첫번째 RET의 값에만 argv[1]의 검열이 있었습니다. 하지만, 두번째 RET의 값으로 들어갈 인자는 검열이 없죠. 그렇다는 의미는 여기에 쉘코드의 주소를 넣으면 된다는 소리입니다.

 

이제 RET의 주소를 알아보겠습니다.

먼저, 파일을 복사합니다.

 

 

디버깅을 통해 disas 명령어로 main 함수의 각 주소를 알아봅시다.

 

 

RET의 주소는 0x0804851e라고 나오네요.

 

이제 쉘코드가 있는 주소를 알아보겠습니다.

 

 

0xbffffbf0이 적당하겠네요.

 

payload를 작성하겠습니다.

"A"*44 + "\x1e\x85\x04\x08" + "\xf0\xfb\xff\xbf" + "\x90"*100 + "~~"(ShellCode)

 

 

성공!

'[▒] 보안 > LOB' 카테고리의 다른 글

level 17  (0) 2020.09.10
level 16  (0) 2020.09.09
level 14  (0) 2020.09.08
level 13  (0) 2020.09.08
level 12  (0) 2020.09.08

BELATED ARTICLES

more