Unpacking

    CodeEngn Basic 14

    Name에 따라 Serial 이 바뀌는 문제입니다. 우선 간단한 정보를 얻기 위해 PEiD를 이용하겠습니다. UPX로 패킹된 것을 볼 수 있습니다. Ollydbg를 통해 언팩을 하겠습니다. UPX 언팩은 언제나 간단합니다. 우선 코드를 조금 내려 POPAD아래의 JMP를 찾습니다.(OEP) 해당 부분에 브레이크 포인트를 걸고 실행시켜 OEP로 넘어가기 전에서 멈춘 후 OEP로 이동합니다. Plugins -> OllyDump(플러그인입니다. 없으면 받으셔야 해요) -> Dump debugged process 를 차례대로 클릭합니다. 아래 Rebuild Import 에 체크를 해제하신 후 Dump를 클릭하면 됩니다. 완벽하게 복구가 되지 않았기 때문에 실행하면 오류가 발생합니다. LordPE 툴을 이용하여 ..

    CodeEngn Basic 11

    OEP와 Stolenbyte를 찾는 문제입니다. PEiD로 보시면 UPX 패킹인 것을 알 수 있습니다. 올리디버거를 통해 코드를 열어 아래로 내려가시면 Stolenbyte를 구할 수 있습니다. OEP는 StolenByte를 복구한 OEP로 적으셔야 합니다.

    CodeEngn Basic 10-2

    다음은 이 프로그램에서 쓰인 스트링들을 보여주는 창입니다.(코드창에서 마우스 우클릭 -> Search for -> All referenced text strings) 프로그램을 실행했을 때 아래에 나온 스트링을 검색하려 했으나 창이 뜨자마자 성공했을 경우의 스트링이 보이는 군요. 해당 위치로 이동하겠습니다.(스트링 더블 클릭) 위치로 이동한 후 조금 위로 올라가면 조건 분기점을 보실 수 있습니다. 명령어가 JNZ(Jump if Not Zero) 이므로 Zero flag를 이용해 참, 거짓을 판단한 후 실패인 경우와 성공인 경우의 코드로 이동하겠군요. 따라서, 우리가 원했던 OPCODE는 7555가 됩니다.

    CodeEngn Basic 10-1

    OEP와 분기점의 OPCODE를 구해야 겠군요. 다음은 실행화면 입니다. 다음은 PEiD로 본 프로그램 정보입니다. ASPack 으로 패킹된 것을 보실 수 있습니다. ASPack은 UPX같은 패커가 아닌 프로그램을 보호하기 위한 프로텍터입니다. 이 프로텍터의 언패킹 방법을 알아보겠습니다. 아래는 Ollydbg로 열었을 때의 화면입니다. PUSHAD 명령어로 레지스터들을 전부 스택에 올리는 것으로 프로그램을 시작합니다. 이는 나중에 패킹이 모두 풀리고 난 후 POPAD 명령어로 레지스터들을 돌려받게 됩니다. 그렇기 때문에 PUSHAD 명령어를 실행했을 때의 ESP에 브레이크 포인트를 걸어놓으면, 패킹이 모두 풀리고 프로그램이 시작하는 위치로 이동할 수 있습니다. 구체적인 순서는 우선 PUSHAD 명령어를 ..

    CodeEngn Basic 09

    StolenByte를 구해야 하는 문제입니다. 여기서 StolenByte 란 Packer 가 Packing 시 원본 코드의 코드 중 다른 곳으로 이동 시킨 코드로써 OEP의 몇 줄의 코드입니다. 원본 코드의 일부분이 다른 곳으로 이동되었기 때문에 일반적인 방법으로 Unpacking을 하면 비정상적인 동작을 하며, 이 StolenByte 부분을 원래대로 돌려준 후 Unpacking을 해야 제대로된 원본 프로그램을 얻을 수 있습니다. PEid 툴을 이용해 UPX 패킹임을 확인할 수 있습니다. 아래는 그냥 언패킹을 했을 때 실행시킨 모습입니다. 비정상적으로 실행되는 것을 볼 수 있습니다. 그럼 이제 제대로 StolenByte를 구해서 복구해보겠습니다. 먼저 OEP로 점프하는 코드로 가보겠습니다. 자세히 보시면..

    CodeEngn Basic 08

    OEP 를 구하라고 하는 것을 보니 Unpacking 쪽으로 방향을 잡아야 할 듯합니다. 윈도우 계산기 입니다. UPX 패킹을 확인하였습니다.(Basic 05-1 참조) Ollydbg로 실행시킨 후 조금 아래로 내려가면 평소처럼 POPAD를 찾으실 수 있습니다. 그리고 좀더 내려가시면 JMP 08.01012475 를 찾으실 수 있으며, 이전 문제를 풀어보신 분들은 저것이 OEP 라는 것을 아실 것입니다.

    CodeEngn Basic 05-2

    Ollydbg로 열었을 때 나오는 내용입니다. PUSHAD 는 모든 범용 레지스터들(EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI)를 스택에 올리는 명령어입니다. 저기서 조금 내려가다 보면 아래와 같이 POPAD와 JMP라는 무조건 분기하는 곳이 있습니다. 프로그램이 제대로 동작하기 위해서는 자신도 또한 Packing을 풀어 원래 자신의 코드로 돌아가야 하므로 JMP 05.00441270 과 같이 원래 코드로 이동하는 부분이 있으며 이동한 곳이 바로 OEP 가 됩니다. 참고로, POPAD 명령어는 PUSHAD와는 반대로 스택에 존재하는 값들을 레지스터로 POP 하는 역할을 합니다. 다음은, OEP로 이동하여 원래 코드가 보이는 화면이며 OllyDump 플러그인을 이용해 Dump를 ..

    CodeEngn Basic 05-1

    이번 프로그램을 실행 시키면 다음과 같은 창을 띄우게 된다. 이번에는 PEiD 라는 툴을 이용하여 이 프로그램의 정보를 확인해보겠습니다. 아래쪽을 보시면 UPX 0.89 ~ 라고 쓰인 것을 볼 수 있는 데요. 이는 UPX라는 Packer를 이용하여 원래 프로그램이 Packing 되어 있다는 의미입니다. 그리고 우리가 제대로 분석을 하기 위해서는 Unpacking을 통해 원래 코드를 얻어야 함을 의미합니다. 여기서 Packing 이란? 기본적으로는 파일 압축이다. 파일의 크기를 보다 작게 줄이기 위해 사용하는 방법. 압축프로그램을 이용한 것과는 달리 바로 실행된다는 이점이 있다. 여기서 시간이 지나면서 자신의 코드를 타인의 리버싱으로 부터 보호하기 위한 Protector를 이용하여 Packing을 하기도 ..

글을 읽어주셔서 감사합니다.

이 블로그는 Google 광고 수익으로 콘텐츠를 만들고 있습니다.