전체 글

전체 글

    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 07

    C 드라이브의 이름이 CodeEngn 일 경우에 대해 풀어야 하므로 일단 C 드라이브의 이름을 CodeEngn으로 변경하고 시작하겠습니다. 방법은 폴더 이름 바꾸듯이 하시면 되요. 어떤 식으로 동작하는 지 대략적으로 파악합니다. 마우스 우클릭 -> Search for -> All referenced text strings 를 가면 역시 친절하게 문제풀이에 도움이 될 문자열이 보입니다.(계속 이렇게 푸니 이젠 습관이 됐네요 ㅎㅎ) 입력한 값이 시리얼인 경우 혹은 아닐 경우의 문자열을 더블 클릭하여 해당하는 위치로 이동하면 값을 비교하는 곳과 조건분기점을 찾을 수 있습니다. 다음은 위와 같이 브레이크 포인트(F2)를 걸어 놓고 Ollydbg에서 실행(F9)한 후 임의의 값을 입력했을 때 멈춘 모습입니다. 이..

    CodeEngn Basic 06

    PEiD 툴로 확인해 보면 UPX로 확인된 것을 볼 수 있습니다.(UPX 언팩은 Basic 05-1 글을 참고) 잘못된 시리얼을 입력했을 시 Wrong serial!! 메시지가 나타나는 것을 확인할 수 있습니다. 이번에는 Ollydbg의 Back to user 모드를 이용하여 문제를 풀겠습니다. Back to user 모드란 프로그램이 멈춘 상태에서 지금 사용하고 있는 이벤트가 있는 코드로 이동하는 모드입니다. 이 모드를 사용할 때는 프로그램이 멈춰 있어야 합니다. 먼저, Ollydbg에서 프로그램을 실행(F9)시킨 후 임의의 문자열을 입력하여 메시지 창을 띄웁니다. 이 상태에서 Ollydbg를 활성 시킨 후 일시정지(F12) 시킨 후 AlT + F9를 눌러 오른쪽 아래를 Back To User로 바꾼 ..

    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를 ..

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

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