PE Spin 언패킹

악성코드 및 포렌식|2021. 3. 28. 12:36

with 보안 프로젝트

 

 

 

PE Spin

 

 

upx보다 더복잡한 것을 합니다.

 upx는 compress한다면

이거는 보호하는 역할을한다

 

분석가능한 수준까지만 언팩을한다.

 

 

 

Antidump protection 떄문에 덤프가 잘 되지않습니다.

 

pe헤더쪽에 데이터를 넣게되는데

 

 

 

 

 

 

msgbox.exe 를 보호해보자

 

 

 

 

 

잘보니까 PeSpin으로한다

 

unpack 을 위한 툴은 잇기는하지만

해봐라 라고 힌트를 주긴하지만 이거를 하면 

block처리를 하면

올리디버거가 열리지도 않습니다

 

즉언패킹하기어렵다 라고말해준다.

 

 

 

 

 

이파일을 ollydbg로 열어보게되면

 

code 섹션 밖에 entry point가 존재한다고 오류가납니다.

 

 

코드섹션이 아닌곳에서 실행을 하고있다는 의미입니다.

 

실행가능한 영역이기때문에 일단은 본다.

 

 

 

 

 

여기서 만약 f8 을 누르게되면

 

 

 

 

바로 pushad로 넘어가게되는데

 

이 안티 디버깅 방법이 뭐냐면

 

강제적으로 d7로 이동해서보이는 겁니다.

 

마우스를 위로하면 원래대로돌아옵니다.

 

 

실제로 마우스를 그냥 위로만 스크롤로 올려도 pushad 가 안보이고

다른것들이 나오게된다

 

 

이게왜그러냐면 올리디버거가 메세지를 분석할떄 디셈블러로 번역할떄

 

어떤 순서 시퀀스가있는데 일정한 바이트만큼 짤라서 읽는데

순서를 무시하고 중간에 툭 들어온다

 

그래서 c를 누르면 다시돌아오고

 

 

 

 

60이라는 byte가 pushad 를 뜻합니다.

 

 

 

 

 

올려면 60이 0168 60 에 녹아져있는것이 확인이 가능하다.

 

 

 

 

 

 

 

 

 

 

PUSHAD 는 POPAD랑 짬뽕이니까

 

PUSHAD가 나오면 POPAD가 거의 나오기떄문이다

 

 

 

 

 

 

CTRL + S 를 해서 POPAD 를 찾아봅니다.

 

근데 여기서 문제점이 POPAD가 너무 많기때문에 예상을 하지못합니다.

 

 

모든것에 브레이크 포인트를 걸면 추측성으로 가니까 안좋다

 

 

PUSHAD를 하면 특징이 존재하는데

레지스터를 스텍에 몰아 넣는다 라는 특징이있는데.

 

데이터를 꺼내오기위해서는 스택들을 건들이게되는데

Hadware 브레이크 라고있습니다.

 

우리는 소프트웨어 브레이크 했던거 f2로했던거

 

 

하드웨어 브레이크를 통해서

 

이메모리에 실행하게되면 브레이크 포인트를 걸겠다 라는 조건을 걸어 놓는것입니다.

 

 

 

 

 

 

 

 

 

 

이 두부분에서 가능이한데

 

우리는 스택에다가 걸을것이다

 

 

 

 

 

 

 

덤프창에서 ctrl+g 를 누르고

 

이렇게 우리가 원하는 것은 esp 가 가르키는 즉 스택이 가르키는 곳을 가보자

 

 

 

 

왼쪽에 덤프는 오른쪽의 스택을 쫘악 펼쳐서 보여주는 것

 

 

 

 

여기 스택 28 이 pushad로 넣은 스택이기 때문에

 

 

 

 

 

 

그러면 하드웨어 브레이크 포인트가 걸리는거고

 

 

 

보면 이렇게 추가도 된것을 알 수 있습니다.

 

 

 

 

 

breack point를 걸고

 

f9 를 누르게되면

 

브레이크 포인트로 안걸리고 좀 이상한 곳에 걸립니다.

 

 

 

 

 

이렇게 오류까지 확인이 가능했다.

하드웨어 브레이크 포인트가 나와야한다. 원래는

 

FFFFFFFF 이것은 커널 영역을 읽으려고 하는 해서는안되는 일을 하고 있다.

 

 

이런오류가날때는 SEH라는 구조체를 불러와 예외처리를 합니다.

 

 

에러를 발생시켜서 이미 예외 처리가 등록된 것을 실행시킨다.

 

 

 

 

 

 

스택쪽에서 CTRL+ G를 누르고

 

 

가보게된다면

 

 

스택 창에

 

SE handler가 존재하게 됩니다.

 

exception handler 같은건데

 

이게 구조화 된 예외처리 기능을 가지고 있는것

 

예외처리하는 곳으로 쫓아 가면

 

저 0040564D 주소를 실행 합니다.

 

 

프로그램은 0012FFA0을 실행하는것이 당연하지만

디버깅 중이라면 디버거한테 넘겨주는게 당연하니까 0040564D 로 넘겨주게 됩니다.

 

해서는 안되는 일때문에 오류가나고 예외처리를 넘어가야하는데

우리한테 신호를 주고있는것

 

 

 

 

 

 

우린 다시 이것을 예외처리 기능한테 넘겨주는게 Shift + f9 를 하는것

run을 쭉 실행 시킵니다

 

근데 또 오류가 납니다.

 

여기서

 

integer division by zero

 

어떤숫자를 0으로 나누고있는데 BL을 가르기고있고 ebx는 0 이니까 나눌수가 없는데

 

나눌려고해서 문제가 발생한다

 

이런것을 통과할려면 똑같이 

shift + f9 를 합니다!!!

 

 

 

 

 

 

또 쭉실행시키면

 

STI가 나옵니다.

 

 

 

 

이것은 특권이 필요한 기능인거같다

그래서 에러가 발생하지만 프로그램에서 인위적으로 만든 에러여서 Shift +f9 를 한다.

 

 

 

 

 

 

 

 

 

계속 shift+f9를 하게되면

 

 

 

 

 

test가 떠서 하드웨어 브레이크를 우리가 잘못 걸었다는 의미가 됩니다.

 

 

원래 예외 처리를 다 지나가면 test가 안떠야 한다.

 

 

 

 

아까 브레이크 포인트를 execution에다 걸었었는데

이번에는 on access -> byte로 걸어봅시다.

 

execution은 실행할떄 사용하는거

 

 

 

f9 누르고

 

shift + f9 를 해보니까

 

Hardware breakpoint 2 라는 것이 드디어 나오게되고

막상보면 popad가 보이지가 않는다

 

다꼬여있는데 hardware breakpoint 가

어떤 명령을 실행한 다음에 거기에조건이 있으면 그떄 멈춘다.

 

 

 

 

 

 

그래서 스크롤을 올려보면

 

POPAD를 실행하자마자 바로 하드웨어 포인트가 걸린다는 것이 특징입니다.

실행하고 멈춘다!

 

 

 

 

 

 

 

조금만 더 F8로 진행하면 알아볼 수 없는 디스어셈블리 언어들이 나오게되는데

 

이런형상은 없던영역인데 여기다가 데이터를 쓴것입니다.

올리디버거 어느시점에 디스어셈블을 분석을 하냐면

프로그램이 시작될때합니다

하지만애네는 분석이 실행되지 않은 것입니다.

 

프로그램이 실행할때는 애네가없었고 프로그램이 실행되면서 여기에 데이터를 쓴것입니다.

 

 

 

 

 

 

여기 이쪽을 우리가 알아볼수 있는 어셈블리 언어로 바꾸게되면

 

 

 

 

 

신기한 내용이들어가있지 않지만 이쁜 코드로 보기위해서 해봤다.

 

 

쭉 실행을 해보면 별내용이 없다,...

 

그래서 넘어가보면

 

 

 

 

OEP 는 여기로 봐도 무방하다.

 

밑에를 보면 PUSH를 3번 하고 CALL 실행을 하고있는데

 

OEP 라고생각하면될듯하다

 

 

 

 

 

원본파일과 비교를 해보니까

 

저렇게 JMP 가보여서 엔터로 들어가게되면 우리가 분석하고있는곳인데

 

 

 

원본은 401080으로 점프를 하지만

 

 

 

 

 

애가 PE헤더 쪽인데

PE헤더에 뭔가 변화를 준것이다. PE헤더를 복구하지 못하게 만들기떄문에

완전 복구가 불가능 하다.

 

 

 

 

 

 

우리가 본곳이 타고타고 하니까 원본과 완전 똑같다.

 

 

PE헤더쪽에 변화가 가있지만 PE헤더를 망치는 내용때문에 완벽복구가어렵다는것을 깨달았다.

 

그래서 조금만 복구를 해주면

 

 

 

dump를 시작

 

 

dump를 한뒤에  살려봅시다.

 

 

 

 

 

 

 

커널도 되있어서 오류가 나니까 이미지 사이즈를 조정하고

 

dump full을 해주면 또다른 덤프 방법이다.

 

 

 

 

 

 

imports 를 복구하자

 

pe헤더를 덮기때문에 fixdump를 해도 완벽히 동작을 하지않는다.

 

그전에 pe헤더를 망가뜨렸으니까

 

올리디버거에서는 오류가납니다

 

 

 

 

 

그래서 peview로는 좀확인이 가능한데

 

어느정도 복구는 했다는 것을 보여줄 수가있습니다.

 

어느정도 확인이 가능한 형태로만 복구를 해봤습니다.

 

 

 

 

 

댓글()