농소

The Lord Of The BOF // golem -> darkknight (fake ebp) 본문

Wargame/The Lord Of The BOF

The Lord Of The BOF // golem -> darkknight (fake ebp)

농소 2018. 2. 13. 04:42

이번에도 문제를 풀어봅시다.




c코드를 보면 argv[1]의 인자를 받아 인자값을 strncpy를 통하여 버퍼에 복사를 진행하네요

그런데 strncpy함수를 잘 보시면 버퍼크기는 40byte인데 복사를 41byte 까지 할 수 있게 해놨네요

즉 1byte를 overflow 하게 만들도록 설계를 해두었습니다.

구조를 보면 이 1byte 오버플로우 되는곳이 해당 problem_chile 함수의 ebp값을 오버플로우 할 수 있겠네요



우선 gdb로 들어가서 해당 ebp값을 오버플로우 해보도록 하겠습니다.



네 정상적으로 ebp의 1byte를 overflow하여 해당 버퍼의 중간주소쯤으로 변조시켜줬습니다.

그러나 bof원정대를 진행하면서 스택메모리를 이용하여 overflow시킬때 항상 eip의 값을 이용하여

변형을 시켜 주었는데요 여기서는 eip를 이용할 수 없습니다.

그러면 ret값을 이용하지 못하면 쉘을 삽입하더라도 해당 위치로 옮길수 없지 않느냐?

재미있게도 다른방법이 존재합니다 ebp를 이용하여 overflow할 수 있는 방법이 있습니다.

바로 fake ebp라는 기법인데요



이것은 에필로그가 두번 발생할 때 생기는 취약점입니다.

func의 에필로그에서 leave를 진행하였을 때 ebp는 이미 오버플로우를 통해

 변조가 되어 저장이 되어있음을 알 수 있습니다.

그리고 다음으로 esp는 main문으로 돌아가는 ret을 가르키고 있군요 여기까지는 문제가 없습니다.



자 이제 main함수의 에필로그입니다.

다시한번 pop ebp를 통해 변조된 ebp의 값을 나타내고 있고요

여기서 esp가 변조된 ebp+4의 위치를 나타내고 있습니다.

이러한 에필로그의 취약점을 이용하여 ebp변조를 통해 fake ebp+4에 위치해 있는 fake eip를 통하여

공격코드 를 실행할 수 있게 됩니다.


이제 원리를 알게 되었으니 실제로 쉘이 떨어지는지 확인하겠습니다.



저는 fake eip를 nop으로 설정하여 바로 다음쉘이 실행되도록 만들었습니다.


해당 메모리 주소가 바뀌면서 illegal instruction이 발생했네요

 16바이트씩 변형시켜 실행해 주었더니 쉘이 정상적으로 실행이 되었습니다.