프로젝트

SEH overwrite

Dalseung 2020. 2. 17. 16:31

이번에는 SEH(Structured Exception Handling)가 걸려 있는 코드를 가지고 exploit을 해보도록 하겠다. 

앞서서 SEH이란 WINDOWS OS 에서 제공하는 예외처리방식이다.

Stack Cookie옵션이 걸려 있는 상황이다.

Stack CookieRET, SFP 이전에 랜덤 한 4바이트의 쿠키 값을 삽입하는 것이며,함수가 종료되기 전 해당 쿠키 값이 기존의 값과 동일한지 검사하는 코드가 있다.

이러한 방어기법을 뚫으려면 SEH에 대해서 알아야한다.

SEH(Structured Exception Handler)란 윈도우의 예외 처리 기술로써 해당 기술은 프로그램 상에서 발생하는 다 양한 예외에 대한 처리를 지원하기 위한 것이다.

컴파일러는 SEH 체인을 만들고 관리하며, 예외가 발생하면 우선적으로 미리 등록된 체인의 Handler를 실행하고, 해결되지 않으면 다음 단계의 Handler를 실행한다.

 

그렇다면 어떻게 공격을 할 수 있을지 생각을 해보자

 

우선 Stack Cookie검사 코드가 실행이 안되게 만들면 된다.

그렇게 RET를 지나 SEH record까지 덮어서 등록된 Handler

Next SEH record pointer의 주소를 바꾸는 것이다.

그리고 Next SEH record pointer의 주소가 Shellcode를 가리키고 있으면 실행이 될 것이다.

 

좀 더 구체적으로 말하자면

Stack의 끝까지 A로 채우면 예외가 발생해 등록된 Handler가 실행하면서 pop pop ret 명령어가 실행이 되고 Next SEH record로 이동이 되어 그곳에 있던 ShellcodeJMP하는 명령어가 실행이 되어 Shellcode로 이동하여 Shellcode가 실행될 것이다.

바로 시작해보자.

reader.exe의 소스코드는 전과 동일하다.

이 코드를 실행을 하면 test.txt가 만들어지는데 이를 인자로 두고 Immunity debugger를 실행한다.

그러면 이렇게 SEH handlerNext SEH record가 각각 CCCCBBBB로 채워진 것을 볼 수 있다.

이제 mona를 써서 pop pop ret가 있는 주소를 찾아보도록 하자.

“!search pop r32\npop r32\nret”이 명령어를 치면 다음과 같은 결과가 나온다.

여기서 나는 401246이라는 주소를 쓸 것이다

17SEH부분에 방금 찾은 주소인 401246을 넣고 18 NSEH부분에는 JMP Gadget909006eb를 넣는데 9090은 좀더 수월하게 하기위해 NOP을 끼워 둔 것이다.

이 코드를 실행하여 나온 test.txt를 인자로 넣고 Immunity debugger을 돌리면

이렇게 Next SEH recordSEH Handler에 값이 잘 들어가 있는 것을 볼 수 있다.

그리고 그 뒤에는 Shellcode가 있는 것을 볼 수 있다.

제대로 실행보면

이렇게 원래는 printbuf의 내용을 출력해야 할 프로그램이 Exploit코드에 의해 내가 넣은 Shellcode대로 수행되는 것을 볼 수 있다.

 

여기까지가 SEH Overwrite 실습이었다.

 

출처: 윈도우 소프트웨어 시스템해킹 가이드

'프로젝트' 카테고리의 다른 글

Network basic training  (0) 2020.06.25
Windows Software Zer0-day hunting  (0) 2020.02.21
1-day Exploit 실습  (1) 2020.02.21
Trampoline Technique  (0) 2020.02.16
Basic Stack BufferOverflow  (0) 2020.02.16