OutDoorFrog의 리버싱 이야기

윈도우즈 시스템 프로그래밍 [SEH] (수정중) 본문

공부/언어

윈도우즈 시스템 프로그래밍 [SEH] (수정중)

OutDoorFrog 2018. 9. 13. 14:34

안녕하세요 블로그의 주인장 OutDoorFrog 입니다.



오늘은 SEH에 대해서 알아가 봅시다.




1. 공부하게된 이유!






음 저의 이상한(??) 공부 방법 중에 하나입니다.
모르는 단어, 현상, 함수, etc... 등이 나온다면 관련 내용을 훑어보는 겁니다.


실행파일을 따로 만들어서 저 2 패턴을 나오게 만드는게 목표입니다.









2. 구글링


위 블로그에서 SEH 라는 단어를 찾으시면! 힌트가 나옵니다!



__try / __except 와 같은 구조화된 예외처리 구조를 사용했을때

런타임 스택에 예외 프레임을 만들어내는 코드를 프롤로그, 에필로그 부분에 생성합니다.



좋은 내용이 많은 블로그입니다! BookMark 해둬야겠군요!




3. Error와 Exception의 차이?


  • 에러컴파일 에러런타임 에러가 있고 프로세스의 심각한 문제를 일으킴으로 반드시 고쳐야합니다.

  • 예외 예기치 못했던 상황이 발생하는 것으로 반드시 처리해줘야 합니다.


예외를 처리해주기 위해서 있는 것이 바로 SEH(구조적 예외처리 기법)를 

사용해주는 겁니다.





4. 한번 사용해보자.


롸업.cpp


해캠 때 작성한 코드들은 헤더 파일로 박제했습니다!



(코드 설명은 생략한다)



(결과가 나왔군요)


위 실행파일로 __SEH_prolog4, __SEH_epilog4를 찾아봅시다.


리버싱 난이도를 낮추기 위해 출력 문을 MessageBoxA로 표현합시다.


롸업.cpp


음.. 삼항 연산자, try, excpet 구문을 처음 써봅니다.(난이도 하향)
참고로 영어로 출력해야 IDA에서 인자값도 보여줍니다.






5. 리버싱을 해보자.


__try, __except 이외에 다양한 구문이 있지만 이것부터 해봅시다.

일단 알아야할 사항이..



1. Access_Volation이라는 함수가 있다.

2. 함수 호출 전에 MessageBoxA가 있다.

3. 각 구문에 하나씩 MessageBoxA가 호출되어 있다.



쉬운 코드부터 리버싱해서 악성코드의 내용까지 판별할 수준으로 갑시다.




잘 안보시겠지만 MessageBoxA가 3번 호출되었습니다.



5.1 IDA로 리버싱


5.1.1 EP에서 볼 수 있는 코드





아마 SEH_prolog4, SEH_epilog4 는
SEH 구문을 사용하면 나오는 이정표 같은 역할인듯 합니다.






5.1.2 Main 함수 확인




프롤로그, 항상 보이는 패턴, MessageBox 호출, AV 함수 호출


확실히 소스 코드에서 작성한 대로 나왔습니다.


Access_Volation(AV)로 들어가볼까요??






5.1.3 try 구문 확인




구문 사용만으로 통상적인 개형이 꽤 바뀌었군요.


세로 길이가 가장 큰 부분부터 살펴봅시다.




__try 구문을 사용했다는 것을 증명할 수 있는 이정표를 찾읍시다.


  • mov [ebp + TryLevel], 0xFFFFFFFE 는 __try 구문의 끝을 의미하는 듯 합니다.

  • mov [ebp + TryLevel],0 은 __try 구문이 시작되었다고 알려주는 이정표인듯 합니다.


찾을 수 있는 이정표는 이 두 개인듯 싶습니다.




5.1.4 거쳐가는 함수 확인




MessageBoxA가 없기에 __except 구문은 아닙니다!


__try 블록 이후로 거쳐가는 함수인듯 싶습니다.


어떤 함수를 호출하는데 확인해봅시다.





5.1.5 sub_42B32E 확인




리버싱할 때 자주봤던 패턴입니다.


음.. 플래그에 직결되진 않아서 분석하진 않았었습니다만...


언젠가 한 번 분석해봅시다.




5.1.6 __except 구문 확인




__except 가 사용되었다는 이정표를 찾읍시다.


  • mov esp, [old_esp] except에서 찾아볼 수 있는 패턴인 듯합니다.

  • mov [TryLevel], 0xFFFFFE 아마 블럭이 종료될 때 사용되나 봅니다.


일단 첫 프로그램의 분석이 끝났습니다.




6. 마치며


SEH를 썼다는 이정표 4개 정도를 확인할 수 있었습니다.


리버서에게 어떠한 구문을 썼는지 확신할 수 있는 이정표는 굉장히 중요합니다.


코드를 복구할 때 참고할 만한 사항이기도 하며 이러한 이정표를 굉장히 많이 안다면


힘든 분석도 점점 편안히 할 수 있을 듯 합니다.


아직 __Finally 는 써보지 않았습니다!




7. 내일 공부할 것


그리고 ms_exc가 뭔지 궁금해서 검색해 보았습니다.


구조체인 듯 싶은데 SEH를 사용할시 자꾸 눈에 띕니다.


RCE Forum 확인하기


관련 이터널 pdf 문서 확인하기


SEH, 안티 디버깅에 대한 내용 확인하기


OPENRCE 외국 자료 해석 및 정리


익셉션 핸들링에 관련된 다른 구문 사용



정도가 되겠군요. 감사합니다!











'공부 > 언어' 카테고리의 다른 글

Go언어 리버싱  (4) 2018.11.15
Python 준비  (0) 2018.09.05
세마포어 뮤텍스 준비  (0) 2018.09.05
Comments