[어설픈] LOB 15번 giant 문제풀이

2019. 4. 6. 18:00System Hacking/[LOB] Hacker School

안녕하세요!

오늘은 LOB 15번 문제인

giant 문제풀이를 해보도록 하겠습니다!


소스는 아래와 같습니다!

RTL도 못하고 Stack도 사용 못한다고 적혀있네요!


1) 버퍼 [40] 선언되고


2) argument 는 2개 이상!


3) argv[1]의 48번째 값이 \xbf면 

exit되고 (stack으로 return 하지마라)


4) argv[1]의 48번째 값이 \x40이면

exit되고 (library로 return 하지마라)


5) 버퍼도 깔끔하게 비우네요!


저는 여기서 최대한 나에게 주어진 조건이 뭔지

판단해봤습니다


1) return 뒤에 코드를 덮을 수 있고

(이게 굉장히 큰 merit)


2) argv[ ]들을 초기화 안 함


근데 return 뒤에 코드를 덮을 수 있으니

return에 pop pop return gadget을 넣으면

FTZ 19번처럼 


새로운 곳에서 return이 가능할텐데!!!

(=return 우회) 


그래서 objdump 명령어를 통해서 

혹시나 pop pop return gadget이 있나 확인해봤는데....

해당 gadget이 없네요..


그래서 생각을 좀 하다가

떠오른 게

RET SLED을 이용하면 되겠구나!


간단하게 설명하면 

return 주소에 return 주소를  넣는 거에요!

그러면 ret+4 주소에서 ret이 일어나요!


상황 1)    ret <- esp

   ret+4


통상적으로 ret을 하면

pop eip를 해서

esp가 아래와 같이 내려가요!


상황 2) ret + 4 <-- esp


그리고 이 상황에서 

ret의 마지막 명령어 jmp eip

(eip엔 return gadget이 들어가있음)


그러면 ret이 한번 더 일어나서

ret+4가 eip로 가서 return 조작 가능해요!

pop eip, jmp eip가 한번 더 일어나기 때문이죠! 

  

gdb 사진 넣은 이유는 스택구조 보다가 생각났어서...



자 그러면 ret을 조작할 수 있게 되었는데!

어떻게 문제를 풀까요?


system 함수 rtl로도 풀 수 있고 

execve로도 풀 수 있고

뭐 다양하게 있겠지만


저는 제가 아까 말한 두 번째 조건

argv[ ] 초기화 안 한거를 활용할게요!


argv[1]의 주소를 찾기 위해서 

아래와 같이 \x90과 쉘코드를 넣고

main에 breakpoint를 걸고!



x/2x 0xbffffb24 명령어를 통해서

0xbffffc30에 저희가 입력한

\x90과 쉘코드가 있는 것을 확인했습니다!



그러면 payload는 끝났죠

\x90 + 25byte쉘코드+\x90 [44byte] + gdb에서 있는 ret 주소 [4 byte] + argv[1] 주소 [4byte]


그랬더니 아래와 같이 exploit이

완료되었습니다!


고생하셨습니다!