[어설픈] LOB 16번 assassin 문제풀이

2019. 4. 8. 15:41System Hacking/[LOB] Hacker School

안녕하세요!

오늘은 LOB 16번 문제인 

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

소스코드는 아래와 같습니다!

 

힌트에서 FEBP라고 적혀있네요!

FEBP는 fake ebp로!

제가 FPO 풀 때도 설명드렸었는데!

ebp+4의 위치에 ret_address가 있으므로

 

ret_address에 leave, ret gadget을 넣고!

ebp 주소를 변조해서 

변조된 ebp 상태서 

leave 명령어(mov esp,ebp , pop ebp)가 실행되면

ret도 원래 자리에서 안하고

엉뚱한 자리에서 ret 이 이루어지는 그런 공격기법입니다!

 

더 자세한 부분은 구글에서 검색해보시고 공부하시면 좋을 것 같습니다!

 

소스코드는 별거 없는거 같습니다!

argv[ ] 형식으로 인자를 전달받고

버퍼[40] 할당

argument 2개 이상

리턴을 바이너리와 라이브러리로 못함!

마지막으로 strncpy!

(strcpy가 아니라 딱 48byte만큼만!)

일단 gdb를 실행시켜서

break point를 main이랑 

main+159에 둬봤습니다!

(근데 main에 걸 필요는 없었어요..)

여기에 바로 밑에 보시면

leave, ret gadget 있죠?

main+159 =  0x080484df!

그래서 아래와 같이 abcd를 총 48개 넣어보았습니다!

이건 main에서의 breakpoint인데 이건 패스하구요!

저희는 이번에 argv 주소 말고

버퍼 직전의 주소를 활용해서 풀려고 하기때문에! ㅎ

여기 $ebp+0xffffffd8 부분을 보시면

아래와 같이 저희가 버퍼에 넣은 값들이 있습니다!

($ebp+0xffffffd8은 gdb에서 인자 push되는거 보고 찾은거에요!)

 

근데 여기 주소 값에서 -4를 해보면!

아래와 같이 버퍼의 주소를 가리키는 

주소 값이 딱 setting이 되어있네요!

 

그럼 저희는 어디로 ebp를 조작하느냐?

0xbffffa8c-4한 부분으로요!

그래야지! pop ebp 하고 나면

esp가 0xbffffa8c로 오죠!

 

그래서 아래와 같이 최종 payload를 작성해보았습니다!

\x90 5개 + 25 쉘코드 + \x90 10개 + 저희가 조작할 ebp 0xbffffa88 + leave, ret gadeget 주소 (gdb에서 있음)

 

그러면 아래와 같이 ret address에서

다시한번 leave,ret 이 일어나면서

저희가 입력해둔 ebp로 조작이 되고

엉뚱한(=저희가 원하는) 곳에서 

리턴이 실행되어 

쉘이 따지게 됩니다!

 

고생하셨습니다