Security&Hacking/리버싱

Lena Reversing - tutorial 22

Dior2ky 2020. 3. 16. 00:12
반응형

Lena Reversing tutorial 22

이번 단계에서는 API Redirect 라는 기능에 대해서 배우는 것이 목적이다. 

20, 21 단계에서 많은 수의 프로그램을 진행했는데 이번엔 다행히 프로그램이 하나다. ㅎ

 

Ollydbg로 프로그램을 열어준다.

패킹되었을 때 자주 보였던 PUSHAD 가 가장 먼저 보인다. 

ESP 를 이용해서 OEP를 구해준다.

PUSHAD를 지나자 ESP 값이 변한다.

12FFA4에 hw bp를 걸어준다. 

F9를 눌러 진행해준다.

break가 걸린다. POP을 두번한 후 CALL을 하고 있다. F8을 진행해서 CALL 하는 EAX 값을 확인하면 4331B8이다.

이 값을 OEP로 추정할 수 있다.

Import REC를 통해 dump해준다.

Import REC를 열고 프로그램을 선택한 뒤 오른쪽 마우스를 눌러 Select Code Section을 눌러 dump 해준다. 

OEP 부분을 이전에 구한 값을 넣고 IAT AutoSearch를 눌러준다.

Get Imports 버튼도 눌러준다.

몇몇 모듈이 Valid가 NO로 되어있다. 

이상한 값들이 들어있다면 잘라내면 되지만 살펴보면 실제 값들을 가지고 있다. 

Memory map을 열어서 확인해준다.

ptr 포인터의 주소를 확인하면 모두 SFX 영역에 들어있는 것을 확인할 수 있다.

하나 찾아서 들어가준다. 004594C5를 찾아가본다.

USER32의 LoadImageA 가 실행됨을 알 수 있다. 그 아래로 줄줄이 함수들이 나온다. 

프로그램을 재시작 해서 해당 주소로 이동한다.

값이 하나도 없음을 확인할 수 있다.

이를 통해서 언패킹 루틴이 돌아가면서 해당 주소에 함수들에 대한 코드가 작성 된다고 판단이 된다.

따라서 언패킹 루틴이 돌기 전 바로 OEP를 바꾸어 패치해주게 되면 해당 함수를 찾을 수 없는 것이다.

언패킹 루틴에서 redirect 하는 부분을 찾아주도록 한다. 

이 값을 가지고 진행하도록 한다.

프로그램 재시작 후 RVA값이 388C0이기 때문에 4388C0에 hw bp를 걸어준다.

F9를 눌러가면서 계속 확인한다.

다음과 같이 break가 걸리고  7E427C08로 변한 것을 확인할 수 있다.

F8을 눌러가면서 확인해준다. 

4536F0를 지나면서 이번엔 4594C5로 변했다.

4536F0에 있는 Call이 리다이렉트 함수라고 생각하면 된다. 

그리고 전체적인 흐름을 살펴보면 CALL이 실행되지 않는 분기문도 존재한다.

해당 CALL 내부로 들어간다. 

쭉 보다보면 중간에 VirtualProtect 가 호출된다. 

스택을 확인하면 004388C0 의 주소가 인자로 들어감을 확인할 수 있다.

즉 함수가 리다이렉트 될 때마다 VirtualProtect 가 호출된다.

VirtualProtect 함수는 프로세스의 가상 주소 공간안의 commit 된 페이지의 액세스 보호 설정을 변경한다.

 

패치를 진행해준다. 

이전에 리다이렉트를 하는 CALL인 00453E90을 지나지 않고 분기하는 부분이 존재했다.

004536DF 부분을 고쳐주면 될 것이다. 

이 부분을 JMP로 바꾸거나 CALL 부분을 NOP 처리 해주면 될 것이다.

처리 후 OEP를 찾아가서 Import REC에서 열어준다.

이전처럼 OEP를 입력하고 IAT Autosearh , Get Import를 해준다. 

 

이번에는 Valid가 모두 YES로 나온 것을 확인할 수 있다. 

Fix dump 해서 마무리 해준다.

끝.

반응형