Study

    CodeEngn Basic 16

    이번에도 같은 방식의 문제입니다. 다음은 실행 모습입니다. 올리디버거를 통해 풀어보겠습니다. 여태 풀어왔던 방식대로 문자열을 찾아보니(코드창에서 마우스 우클릭 -> Search for -> All referenced test strings 클릭) Wrong password! 문자열이 바로 보입니다. 해당 위치로 이동한 후 위로 올라가면 축하 문자열이 보이고 그 위에 분기점을 찾을 수 있습니다. 그 바로 위에 비교문을 보시면 EAX와 스택의 어떠한 값을 비교하는 걸 보실 수 있습니다. 해당 부분에 BreakPoint(F2)를 지정한 후 실행하여 임의의 값을 입력한 후 결과를 분석하겠습니다. 실행 결과화면 입니다. 비교문에서 BreakPoint에 의해 멈춰있으며 제가 입력한 12345의 16진수 값인 303..

    CodeEngn Basic 15

    한 번 실행해서 임의의 Serial을 입력해보겠습니다. 어떤 프로그램인지 확인했으므로 이제 올리디버거를 이용해 풀어 보겠습니다. 언제나 그렇듯 문자열 검색을 해보겠습니다. 코드창 -> 마우스 우클릭 -> Search for -> All referenced text strings를 클릭합니다. 다행히 이번에는 바로 문자열이 검색되는 군요. 해당 위치로 이동하여 문제를 계속 풀어가겠습니다. 이동한 위치 바로 위에 분기점과 비교문을 볼 수 있습니다. 저 위치까지 실행한 후 비교문에 있는 주소를 덤프창에서 찾아가보겠습니다. EAX의 값은 0x3039 이고 비교하는 주소에 저장된 값은 0x6061 입니다. 어떤 값인지 계산기를 통해 알아보면 EAX는 입력한 값인 12345 이며, 45B844에 저장된 값은 246..

    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 13

    문제가 아무것도 없습니다…..simple 그 자체입니다… 다운받아서 실행시키면 아래와 같이 콘솔창에서 실행됩니다. 이번에도 key를 찾는 것이라 생각됩니다. 여느 때와 같이 올리디비거에서 실행해보겠습니다. 실행시키면 아래와 같은 에러 메시지를 띄웁니다. 무슨 파일이길래 이러는 지 확인하기 위해 PEiD를 이용하겠습니다. .NET 을 이용하는 C# 프로그램이었습니다. 지금까지 풀어온 문제 파일들과 뭐가 다른가 하면 지금까지의 프로그램은 전부 Window에서만 실행이 가능한 PE 파일들이었습니다. 이런 프로그램들은 리눅스에서 실행이 불가능합니다. 하지만, JAVA나 C# 같은 언어는 운영체제(OS: Window, Linux 등)에서 바로 실행되는 것이 아니라 각각 JVM, CLR 등을 통해 실행되기 때문에 ..

    CodeEngn Basic 12

    Key값을 구한 후, 성공메시지 부분을 HexEditor로 수정하는 문제입니다. 먼저 올리디버거를 이욯하여 Key값을 알아보겠습니다. 보통, 성공 메시지를 찾아서 분기점을 찾는 식으로 풀었는데 바로 보이네요…;; 그래도 찾는 방법을 알려드리겠습니다. 코드창 -> 마우스 우클릭 -> Search for -> All referenced text strings 를 클릭하시면 아래와 같이 문자열을 찾을 수 있습니다. 성공했을 경우의 문자열에서 흐름을 거꾸로 거슬러 올라가면 조건분기의 조건이 EAX의 값이 7A2896BF이면 성공임을 알수 있습니다. 계속 거슬러 올라가면 어떠한 처리를 하는 것을 알 수 있으며, GetDlgItemInt 라는 함수를 불러오는 것을 볼 수 있습니다. 이 함수는 대화상자 컨트롤의 텍스..

    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 명령어를 ..

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

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