Reverse Engineering
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 명령어를 ..
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)한 후 임의의 값을 입력했을 때 멈춘 모습입니다. 이..