wonder

정보보안 스터디 - 18주차 7일 - unpakcing 방법 종류 본문

Security/리버싱

정보보안 스터디 - 18주차 7일 - unpakcing 방법 종류

wonder12 2023. 2. 16. 07:56

 

 

 

☞ ollydbg를 이용한 수동 unpacking 방법 

 

upx는 나온지 워낙 오래되었기도 하고 흔하기 때문에 unpack하는 방법이 쉽게 나옵니다.

ollydbg의 외부 함수인 플러그인에 dump기능을 사용하여 dump파일을 생성한 후, importSEC으로 해당 실행중인 프로그램의 dll, 함수를 추출하여 entry point나 사이즈를 맞춘 뒤 dump파일과 연결하여 fix하는 방법이 있습니다.

 

이렇게 했는데도 실행이 안된다면 함수가 모두 포함되도록 사이즈공간을 주는 것이 필요합니다.    

 

결국 분석과정에서 IAT를 봤는데 dll 목록이 안보이고 이상하다 싶으면 packing된 파일인지 알 수 있을 것입니다.

패킹이 되었다면

ollydbg에서 확인했을 때

PUSHAD 

POPAD가 한쌍 또는 여러 쌍이 있을 것입니다.

여기서 PUSHAD란 EDI, EAX 등 8가지의 레지스터를 스택에 PUSH 하겠다는 의미입니다.

패킹된 파일이라면 POPAD까지 과정이 있고 entry point부터 원본 파일의 시작입니다.

 

 

직접 수정가능한 수준의 쌍개수라면 ctrl+S 로 popad의 위치를 가서 F2 break point를 걸고 실행시켜

원본 시작 주소인 entry point의 주소를 찾을 수 있을 것입니다.

 

하지만 너무 많아서 복잡한 쌍개수라면

소프트웨어 BP로는 일일이 이동하여 처리하기가 번거롭습니다. 물론 개수 제한은 없지만.

그래서 4개의 개수제한이 있는 하드웨어 BP를 사용합니다. 하드웨어 BP란 메모리 상에서 바이트에 직접 BP를 걸어서 스택에서 중간에 왔다갔다 쌓였다가 제거되는 과정에서 다시 그위치가 올 때는 스택에 저장된 프로세스 주소를 꺼내오려고 하는 뜻이기 때문에 즉 POPAD라는 말이기 때문에 거기서 실행 후 멈춥니다.

그러면 처음 걸었던 PUSHAD 쌍에 맞는 POPAD를 찾게 되고 중간POPAD를 건너띄어줍니다.

그렇게 해서 entry point를 찾아야합니다.

 

 

 

 dll 수동 언패킹

 

더 강력하게 패킹하는 방법으로는 ollydbg말고도 

두가지가 더 사용했습니다.

 

용량이 큰 파일이라면 olly에서 dump하기가 오래걸립니다.

그래서 loadPE같은 프로그램을 이용해 dump합니다. > fix dump까지합니다.

 

해당 파일은 악성코드인데 

exeinfo를 확인해보니 mpress 패킹을 사용했다고 나옵니다.

dll 형식이므로 ollydbg는 exe로 바꿔줘야합니다.

이럴 경우에는 PEview에서 characteristics > dll 형식 offset주소를 확인 후 HxD에서 exe파일 형식 바이트로 바꿔줍니다. 또한 exe파일명으로 변경까지 해주면 exe로 실행이 됩니다.

 

패킹되어 있는데 이걸 OEP(address of entry point)를 수정하여 패킹하기 전 원본 시작위치와 같게 만들어야합니다.

일단 실행을 하면서 entry point를 찾아서 break point를 걸고 그부분에서

importSEC을 열어 entry point를 수정하고 사이즈도 dll 및 함수 길이 맞도록 수정하여 dump 파일과 연결시킵니다.

그러면 분석도 되면서 실행까지 됩니다. 그러니까 결국 키값을 몰라도 사용하도록 크랙하는 과정입니다. 

 

 

완료 후에 PEview 함수를 분석해보니

소켓을 연결하고, 레지스터에 시작 시 실행되도록 하는 등의 악성코드로 판단이 되었습니다. 

보통 IAT가 가장 중요하게 보고 기준으로 api위주로 악성코드 분석하는 것이 대부분입니다.

그 다음 IDA를 통한 구성 확인 및 정적분석, ollydbg에서 실행하면서 함수 명령어를 분석하는 동적분석 단계로 진행됩니다.

 

 

 

 

 

  패커의 프로텍터 기능

 

나머지 하나는 PEspin이라는 프로그램으로 패킹한 파일입니다.

이건 프로텍터 기능이 추가된 패커입니다.

개발자는 패킹이 풀려도 제 3자가 분석하는 것을 원치 않아할 수 있기 때문에

분석방해하는 요소들을 추가하는 프로텍터를 사용합니다.

이 경우에는 unpack을 하더라도 함수 목록 등 IAT 분석이 어려워서 어떻게 동작 하는지 확인하는 것이 어렵습니다.

 

즉 OEP를 안보이게 하거나  하는 식입니다.

 

다행히 시그니처가 있어서 그런지 PEspin이라고 exeinfo에서 확인됩니다.

 

 

브레이크 포인트를 걸고 실행을 했을 때 violation 예외 처리되서

실행이 불가하기 때문에

건너띄려면 shift F9를 8번 합니다.

원본 프로그램에서는 call 호출이지만 jmp로 되어있음을 확인합니다.

하드웨어 bp로 이동하지만

 

특이한 코드들이 중강중간보이고

F8진행하다보면 점프가 되었을 떄는 ctrl A를 눌러 코드 덜풀린 걸 풀어 확인해줍니다.

 

그래서 결국 entry point를 찾아 잡고 getimport를 하지만

 KERNEL32.DLL 정보가 정확히 나오지 않고 제대로 복원이 불가능합니다.

프로텍트기능이 있기 때문에 코드 분석이 어렵다고 보면 됩니다.

남은 방법은 olly에서 일일이 실행하고, 원본코드를 찾아서 분석할 수 밖에 없습니다.

 

 

 

 

 

 리버싱 CTF level 1,2

 

다음은 lena라는 리버싱 CTF문제입니다.

 

 

여기서는 프로그램을 분석했을 때

key파일을 열어 만약 키값이 맞다면 통과 주소로 점프하여 올바른 값이라는 메세지 박스가 뜹니다.

키값을 불러와서 비교해보고 만약 키값이 틀리다면 키 값이 틀리다고 뜨고,

없을 경우도 없다고 뜹니다.

 

그래서 이 경우에는 ollydbg 자체에서 수정하여 키값을 모르더라도 올바른값이라는 결과값을 얻도록 크랙하는 작업이 필요합니다.

 

 

 

 

크랙 방법에는

1. 문자열을 찾아서 거기에 해당하는 주소로 이동한 뒤 점프되는 명령어를 수정하여 바로 주소로 이동하도록 하는 방법이 제일 쉬우면서 직관적인 방법입니다.  

2. 또는 주소를 확인했다면 주소로 점프할 수 있도록 제로플래그 등을 바꾸는 방법입니다. 변경하게 되면 점프를 참/거짓으로 유도할 수 있으므로 올바른값 주소까지 실행합니다.

3. 제로플래그 말고도 명령어를 수정하거나 값을 점프 조건에 맞도록 변경하는 방법이 있습니다.

 

 

제대로 분석을 해보니

처음에는 아이콘 리소스나 커서를 로드해오는 함수가 실행이되구요

LOAD ICON, CURSOR

 

CreateFileA함수의 경우

파일을 생성하거나 읽는 기능이지만 정확한건 인자값(7개)을 확인하여

파일이 있을 경우 읽는 것을 확인합니다.

 

결국 파일의 내용까지 읽은 후

파일없음 / 파일있는데 키값틀림 / 키값맞음 으로 분류됩니다. 

 

즉  파일이 없다면 eax에 -1(FFFFFFFF) 값을 결과로 주고

파일이 있는데 키값틀렸다면 eax 44값을 결과로 주는 식입니다.

   

 

종합적인 분석으로는

해당 키값은

16비트 보다 큰 17비트여야 하며(GGGGGGZZZZZZZZZZZ0000~ 이므로 0일 때 충족함) 

CMP AL, 47

글자내용을 확인하여 글자내용이 16진수로 47 즉 G(예시)임을 확인하는 명령어가 있습니다.

 

또한 INC ESI 후 위로 점프시키는걸 보니 for이든 while문이든 증가 반복문인 것을 확인할 수 있습니다. 

8번을 반복해야하므로 

글자내용 G가 8번이 나와야 충족됩니다.

 

 

 

참고로 하드코딩은 아이디, 비밀번호 등 입력 받아와야할 값을 고정으로 설정해둔 것을 말합니다. 따라서 리버스 엔지니어링으로 인한 보안에 취약합니다.
그와 반대로 소프트코딩(로딩)은 외부에 데이터파일을 두고 관리하여 불러오는 개념으로 보안에 더 좋습니다.

 

 

 

Comments