OutDoorFrog의 리버싱 이야기
윈도우즈 시스템 프로그래밍 [SEH] (수정중) 본문
안녕하세요 블로그의 주인장 OutDoorFrog 입니다.
오늘은 SEH에 대해서 알아가 봅시다.
1. 공부하게된 이유!
음 저의 이상한(??) 공부 방법 중에 하나입니다.
모르는 단어, 현상, 함수, etc... 등이 나온다면 관련 내용을 훑어보는 겁니다.
실행파일을 따로 만들어서 저 2 패턴을 나오게 만드는게 목표입니다.
위 블로그에서 SEH 라는 단어를 찾으시면! 힌트가 나옵니다!
__try / __except 와 같은 구조화된 예외처리 구조를 사용했을때
런타임 스택에 예외 프레임을 만들어내는 코드를 프롤로그, 에필로그 부분에 생성합니다.
좋은 내용이 많은 블로그입니다! BookMark 해둬야겠군요!
3. Error와 Exception의 차이?
에러는 컴파일 에러와 런타임 에러가 있고 프로세스의 심각한 문제를 일으킴으로 반드시 고쳐야합니다.
예외는 예기치 못했던 상황이 발생하는 것으로 반드시 처리해줘야 합니다.
예외를 처리해주기 위해서 있는 것이 바로 SEH(구조적 예외처리 기법)를
사용해주는 겁니다.
4. 한번 사용해보자.
해캠 때 작성한 코드들은 헤더 파일로 박제했습니다!
(코드 설명은 생략한다)
(결과가 나왔군요)
위 실행파일로 __SEH_prolog4, __SEH_epilog4를 찾아봅시다.
리버싱 난이도를 낮추기 위해 출력 문을 MessageBoxA로 표현합시다.
음.. 삼항 연산자, 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를 사용할시 자꾸 눈에 띕니다.
익셉션 핸들링에 관련된 다른 구문 사용
정도가 되겠군요. 감사합니다!
'공부 > 언어' 카테고리의 다른 글
Go언어 리버싱 (4) | 2018.11.15 |
---|---|
Python 준비 (0) | 2018.09.05 |
세마포어 뮤텍스 준비 (0) | 2018.09.05 |