728x90

Asprotect Unpacking Tip

현재까지 테스트한 버전 : ~ aspr 1.23 RC4 x (release ver.)      //      aspr 1.3x (beta ver.)
테스트 환경 : Win98SE, Soft-Ice 4.0.5 B334

1. 기본적인 디버깅 방법

Aspr은 크게 두가지 형태로 쓰레기코드를 만들어낸다.

a. 1000  jmp 1003
1004 add eax, ebx

이것은 아주 전통적인 방법으로 1바이트짜리 명령어를 중간중간 놓아둠으로써 디버깅을 어렵게 한다.
몇 번해보면 익숙해진다.

b. yyyy  call xxxx
xxxx  pop eax\

이러한 루틴은 흔히 ret 코드 앞의 콜에 나타난다. 콜 이후의 리턴주소를 끄집어내어 파괴시켜 버린다.
따라서 리턴이전의 콜은 반드시 들어가봐야 한다. 또한 이러한 콜은 명령문 중간에도 나타날 수 있다.
즉 가장 기본적인 디버깅은 F8을 눌러 스텝인하는 것이다. 중요한 것은 콜을 건너뛰느냐 들어가느냐 하는 것인데, 들어가야할 콜은 두가지이다. 명령문 중간에 나오는 콜 중, callee의 주소가 ret 이전에 있는 것. 나머지 하나는 ret 이전 혹은 ret 이전에 커널함수가 있다면 커널함수 이전의 콜이된다.

2. anti-debug 루틴

이것은 unmapviewoffile 이후에 나타나는 가장 처음의 두 개의 다음과 같은 명령문을 살펴보면 된다.
cmp byte ptr [aspr's address], 00

만일 anti-debug 루틴을 실행하는 경우라면 위의 값이 1로 셋팅되어 있으므로 그것을 0으로 수정하여주자. 플래그 셋팅은 소용없다.

3. SEH

이것은 중단점을 지워 버리는 기술이다. 중단점은 DR7에 기록된 값에 의존한다. 이러한 루틴은 다음과 같은 형식이다.

XOR [EAX], EAX

이것을 무력화시키는 방법은 r eip eip+2 가 된다.

4. Faked OEP 찾는방법

이것은 원리를 알면 굉장히 간단한 방법이며 다른 팩커들에게도 써먹을 수 있다. 우선 aspr의 코드의 주소에 진입한뒤, 실제 실행파일의 코드가 최초로 실행되는 순간을 잡으면 된다. 먼전 aspr의 루틴에 진입하자.

bpx virtualfree

리턴 후 aspr의 루틴에 있을 것이다. 그러면 실제 실행파일의 색션을 살펴보자.

map32 target

첫 번째 색션의 값이 400000 ~ 400FFFF 이라면,

bpr 400000 400FFFF R IF eip<400FFFF\

하면 faked oep를 찾을 수 있다. 만일 stolen bytes가 없는 경우라면 실제 OEP가 바로 찾아지며, 그렇지 않은 경우라면 faked oep를 바로 찾을 수 있다. 주의할 점은 rw 옵션을 쓰면 가끔 시스템이 정지되어 버린다는 것이다. 또한 저 값들은 자신이 예상해서 임의로 줄 수도 있다. 이 방법은 내가 찾은 가장 빠른 방법으로 1분 이상 걸리지 않는다. 아마 OEPfinder와 같은 툴을 쓰지 않는 이상 가장 빠른 방법이 아닌가 생각한다. Olly 쓰시는 분들도 SEH 옵션을 재설정 하시면 가능할 것이다.

5. stolen bytes

이것은 aspr-map에서 aspr에서 얻은 리턴주소들 중 가장 상위의 값을 기본으로 하여 찾아가거나, 혹은 faked oep에서부터 역추적해오는 것이 가장 확실한 방법이다.

6. 도움이 될 만한 문서들

a.
aspr-map : by copywrite, 초반부에 중요한 값을 찾아가기위한 디버깅팁을 약간집어넣기 위해 조금 수정함.

원문 :
http://web.kaist.ac.kr/~taekwonv/aspr_tip.htm

728x90

+ Recent posts