no image
CodeEngn Basic 14
문제 확인 풀이UPX 언패킹 후에 프로그램을 실행시 쉽게 성공분기점을 찾을 수가 있다. CMP EAX,ESI를 통하여 ID에 해당하는 시리얼키는 금방 찾을 수 있지만 나는 위의 알고리즘까지 공부를 할 겸 분석을 하였다. 알아보기 힘들 겠지만 주석에 달아 놓은 바와 같이 하나씩 인자로 전달을 받으며 n번쨰의 글자만 16진수로 인식을 한 후에 X = (x*x)-SAR_1(x)+x 의 과정을 거친다. 그리고 이렇게 구한 값들을 모두 더해준 것이 바로 ESI가 된다.
2015.06.02
no image
CodeEngn Basic 13
문제 확인 우선 PEID를 통하여 파일을 확인 해보면 아무 이상이 없는 것 같다. C#/.NET로 만들어졌다는 점을 유의하여야한다.실행시 아래와 같이 키값을 입력하는 문제이다. 디버거를 통해 분석을 시도 했지만 작동하지 않는다. 풀이HexEditor, PEView, BinaryText 등을 통하여 치열하게 확인을 해봤지만 계속 된 실패를 맞이했다. 하지만 .NET Reflector를 통해서 문제를 풀 수가 있었다. 이 프로그램을 통해서 손상된 이 프로그램을 디컴파일 할 수가 있었다. 디컴파일 후에 Visual Studio를 통하여 열어 보면 아래와 같이 확인을 할 수가 있다. If ReadLine이 plainText와 같을 경우에 성공문으로 가는 것이지만 정작 중요한 plainText가 나타나 있지 않다..
2015.06.02
no image
CodeEngn Basic 12
문제 확인 풀이아래와 같은 지점을 확인 할 수가 있다. 시리얼 값을 찾다가 알고리즘을 만나 저 부분이 중요한 듯 하였으나 정작 중요한 것은 CMP EAX,7A2869BF; 부분이 중요한 것이였다. 위의 알고리즘은 더미로써 별 기능을 하지 않는 것이다. 따라서 손 쉽게 시리얼 값을 찾을수가 있다. 그리고 문제와 같이 키 값이 출력 되도록 하기 위해서는 MessageBox의 인자를 바꿔주어야 하며 그 지점은 아래와 같다. 그 부분의 덤프로 이동을 하여 Ctrl+E을 통하여 키 값으로 덮어 씌워 주면 키 값이 출력 되는 것을 확인 할 수가 있다.
2015.06.01
no image
CodeEngn Basic 11
문제 확인 문제를 실행 할 경우 09번과 같은 문제임을 확인 할 수가 있다. 그리고 파일 정보를 볼 경우에 upx로 패킹이 되어 있다는 것 또한 확인 할 수가 있다. 풀이아래와 같이 UPX 언패킹 후에 프로그램을 열어보면 아래와 같이 MessageBoxA의 인자가 생략 되어있는 것을 확인 할 수가 있다. 따라서 우리는 언패킹 이전에 OEP로 점프하기 전에 있는 숨겨진 명령어를 찾아야 한다. 아래와 같이 OEP로 점프하기전에 PUSH 0 ; PUSH 402000; PUSH 402012가 있는 것을 확인 할 수가 있다. 따라서 OEP와 StolenByte를 쉽게 구할 수가 있다. 추가로 위의 문제는 09번과 같은 문제로 abex.l2c라는 파일이 있는지를 확인하고 GetFileSize를 통하여 크기를 비교한..
2015.06.01
no image
CodeEngn Basic 10
문제확인 문제를 실행하면 아무것도 입력이 되지 않는다. 대체 어떤 문제인지 디버깅을 해보자. PEID를 통하여 확인을 해보면 ASPack에 의하여 패킹이 이루어져있는 것을 확인 할 수가 있다. 따라서 우리는 이러한 패킹을 언패킹 해야한다. 풀이PUSHAD 이후에 Ctrl+F와 Ctrl+L을 통하여 POPAD와 RETN 0C가 인접해 있는 지점을 찾는다. 그 후 주석에 단 것과 같이 RETN 0C 이후에 PUSH를 통하여 OEP주소를 STACK에 PUSH 하고 있으며, 이를 RETN을 통하여 이동을 하면, 이상한 값 만이 나타난다. 여기서 Ctrl+A를 하거나 아니면 OllyDump+LoadPE를 통하여 Rebuild를 하면 제대로 작동하는 것을 확인 할 수가 있다. 프로그램의 문자열을 검색할 경우 아래와..
2015.06.01
no image
CodeEngn Basic 09
문제 확인 풀이아래와 같이 POPAD를 찾은 후에 JUMP를 통하여 OEP로 가기전에 이루어지는 동작이 바로 StolenByte이다. 아래와 같이 OEP로 점프하기 바로 전에 스택을 보면 위의 붉은 상자 부분이 Stack에 Push 되어 있는 것을 확인 할 수가 있다. 이러한 것이 바로 StolenByte로써 이를 구하는 문제 였던 것이다. 그렇다면 이러한 StolenByte가 제대로 스택에 있는지 확인하기 위해 OEP로 JUMP 해볼 경우 아래와 같이 Stack에는 이미 Push 되어 있는 StolenByte를 확인 할 수가 있다. 추가풀이OEP를 찾은 후를 계속 풀어 본다면 우선 이 프로그램은 키파일이 있는 지를 확인 하는 것이다. 따라서 CreateFile 함수를 통하여 해당 파일이 존재하는지( M..
2015.06.01
no image
CodeEngn Basic 08
문제확인OEP를 찾으면 된다. UPX패킹의 경우 흔히 PUSHAD로 먼저 시작을 하고 끝부분에 가서 POPAD를 통하여 스택을 해제한 후에 JUMP를 통하여 OEP로 이동을 한다. 따라서 이를 유념하고 문제를 풀면 쉽게 풀 수가 있다. 풀이POPAD를 Ctrl+F : POPAD를 통하여 찾은 다음에 Ctrl+L을 통하여 다른 POPAD 또한 찾으면 손쉽게 찾을 수가 있다. OEP지점으로 JMP한 이후에 Ctrl+A를 통하여 코드를 다시 분석을 하면 아래와 같이 기존의 코드를 복원 할 수가 있다.
2015.06.01
no image
CodeEngn Basic 07
문제확인 파일을 실행할 경우 아래와 같이 틀린 시리얼에 의하여 프로그램이 바로 종료가 된다. 풀이손쉽게 성공분기점을 찾을 수가 있으며, 이를 통하여 우리는 GetVolumeInformationA 와 lstrcat과 lstrcmp를 볼 수가 있다. 하지만 여기서 중요한 것은 바로 4562-ABEX 밑 부분에 알고리즘이 있다는 것이다. 이 알고리즘은 4562의 숫자를 1씩 총 두번 상승 시키므로 인하여 결국 6784-ABEX가 위치하게 된다. 알고리즘을 거친 문자열은 L2C-5781뒤에 덧붙여 지게 되어 시리얼을 형성하는 것을 볼수가 있다.여기서 GetVolumeInformationA에서 VolumeNameBuffer의 위치에 바로 드라이브의 이름이 위치하는 것을 볼 수가 있다. 따라서 드라이브의 이름이 C..
2015.06.01

CodeEngn Basic 14

Kail-KM
|2015. 6. 2. 01:28

문제 확인






풀이


UPX 언패킹 후에 프로그램을 실행시 쉽게 성공분기점을 찾을 수가 있다. CMP EAX,ESI를 통하여 ID에 해당하는 시리얼키는 금방 찾을 수 있지만 나는 위의 알고리즘까지 공부를 할 겸 분석을 하였다. 알아보기 힘들 겠지만 주석에 달아 놓은 바와 같이 하나씩 인자로 전달을 받으며 n번쨰의 글자만 16진수로 인식을 한 후에 X = (x*x)-SAR_1(x)+x 의 과정을 거친다. 그리고 이렇게 구한 값들을 모두 더해준 것이 바로 ESI가 된다.




'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 16  (1) 2015.06.02
CodeEngn Basic 15  (0) 2015.06.02
CodeEngn Basic 13  (0) 2015.06.02
CodeEngn Basic 12  (0) 2015.06.01
CodeEngn Basic 11  (0) 2015.06.01

CodeEngn Basic 13

Kail-KM
|2015. 6. 2. 00:30

문제 확인



우선 PEID를 통하여 파일을 확인 해보면 아무 이상이 없는 것 같다. C#/.NET로 만들어졌다는 점을 유의하여야한다.

실행시 아래와 같이 키값을 입력하는 문제이다. 

디버거를 통해 분석을 시도 했지만 작동하지 않는다.



풀이


HexEditor, PEView, BinaryText 등을 통하여 치열하게 확인을 해봤지만 계속 된 실패를 맞이했다. 하지만 .NET Reflector를 통해서 문제를 풀 수가 있었다. 이 프로그램을 통해서 손상된 이 프로그램을 디컴파일 할 수가 있었다.


디컴파일 후에 Visual Studio를 통하여 열어 보면 아래와 같이 확인을 할 수가 있다. If ReadLine이 plainText와 같을 경우에 성공문으로 가는 것이지만 정작 중요한 plainText가 나타나 있지 않다. 따라서 우리는 plainText를 출력하는 명령어를 넣어주면 된다.



그 후 출력된 문자열은 아래와 같다.


이제 본래의 파일에 키 값을 입력하여 보자. 성공이다.



추가


솔직히 이번 문제는 예전에 풀었던 기억이 있기에 겨우 풀 수가 있었다. 하지만 만약 PEID가 아니라 ExeinfoPE를 통해 열어 보았다면 바로 .NET Reflector를 쓰라는 친절한 설명을 함께 볼 수가 있다. 이런 문제는 여러 사람의 글을 참고하는 것 또한 도움이 될 것 같다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 15  (0) 2015.06.02
CodeEngn Basic 14  (0) 2015.06.02
CodeEngn Basic 12  (0) 2015.06.01
CodeEngn Basic 11  (0) 2015.06.01
CodeEngn Basic 10  (0) 2015.06.01

CodeEngn Basic 12

Kail-KM
|2015. 6. 1. 23:33

문제 확인







풀이


아래와 같은 지점을 확인 할 수가 있다. 시리얼 값을 찾다가 알고리즘을 만나 저 부분이 중요한 듯 하였으나 정작 중요한 것은 CMP EAX,7A2869BF; 부분이 중요한 것이였다. 위의 알고리즘은 더미로써 별 기능을 하지 않는 것이다. 따라서 손 쉽게 시리얼 값을 찾을수가 있다.


그리고 문제와 같이 키 값이 출력 되도록 하기 위해서는 MessageBox의 인자를 바꿔주어야 하며 그 지점은 아래와 같다. 그 부분의 덤프로 이동을 하여 Ctrl+E을 통하여 키 값으로 덮어 씌워 주면 키 값이 출력 되는 것을 확인 할 수가 있다.




'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 14  (0) 2015.06.02
CodeEngn Basic 13  (0) 2015.06.02
CodeEngn Basic 11  (0) 2015.06.01
CodeEngn Basic 10  (0) 2015.06.01
CodeEngn Basic 09  (0) 2015.06.01

CodeEngn Basic 11

Kail-KM
|2015. 6. 1. 22:47

문제 확인




문제를 실행 할 경우 09번과 같은 문제임을 확인 할 수가 있다. 그리고 파일 정보를 볼 경우에 upx로 패킹이 되어 있다는 것 또한 확인 할 수가 있다.




풀이


아래와 같이 UPX 언패킹 후에 프로그램을 열어보면 아래와 같이 MessageBoxA의 인자가 생략 되어있는 것을 확인 할 수가 있다. 따라서 우리는 언패킹 이전에 OEP로 점프하기 전에 있는 숨겨진 명령어를 찾아야 한다.


아래와 같이 OEP로 점프하기전에 PUSH 0 ; PUSH 402000; PUSH 402012가 있는 것을 확인 할 수가 있다. 따라서 OEP와 StolenByte를 쉽게 구할 수가 있다.


추가로 위의 문제는 09번과 같은 문제로 abex.l2c라는 파일이 있는지를 확인하고 GetFileSize를 통하여 크기를 비교한다. 해당 파일이 존재할 경우 성공 메세지가 출력이 되고 하나라도 다를 경우에는 실패 문자열이 출력이 된다.

'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 13  (0) 2015.06.02
CodeEngn Basic 12  (0) 2015.06.01
CodeEngn Basic 10  (0) 2015.06.01
CodeEngn Basic 09  (0) 2015.06.01
CodeEngn Basic 08  (0) 2015.06.01

CodeEngn Basic 10

Kail-KM
|2015. 6. 1. 12:40

문제확인



문제를 실행하면 아무것도 입력이 되지 않는다. 대체 어떤 문제인지 디버깅을 해보자.


PEID를 통하여 확인을 해보면 ASPack에 의하여 패킹이 이루어져있는 것을 확인 할 수가 있다. 따라서 우리는 이러한 패킹을 언패킹 해야한다.




풀이


PUSHAD 이후에 Ctrl+F와 Ctrl+L을 통하여 POPAD와 RETN 0C가 인접해 있는 지점을 찾는다. 그 후 주석에 단 것과 같이 RETN 0C 이후에 PUSH를 통하여 OEP주소를 STACK에 PUSH 하고 있으며, 이를 RETN을 통하여 이동을 하면, 이상한 값 만이 나타난다. 여기서 Ctrl+A를 하거나 아니면 OllyDump+LoadPE를 통하여 Rebuild를 하면 제대로 작동하는 것을 확인 할 수가 있다.


프로그램의 문자열을 검색할 경우 아래와 같은 문자열을 확인 할 수가 있다. 경험상으로 미루어보아 Key_File 일 것이라고 충분히 예상할수가 있다. 따라서 cm5.dat이라는 파일을 생성하여 보자.


그 후 계속 분석을 해보면 다음과 같은 알고리즘을 맞이하게 된다. 알고리즘을 통하여 Name으로 부터 키값이 형성이 된다. 그 후 4454D4에서 성공으로 가는 분기점이 나타나는 것을 확인 할 수가 있다. 하지만 여기서 유의해야할 점은 바로 저 분기점이 실행이 될경우 실패메세지가 출력이 되므로 저 부분을 바꾸어 수정을 해야한다. 

처음에는 KEY_FILE에 어떠한 값을 입력을 하면 올바르게 실행이되는건줄 알았으나, KEY_FILE에 ID를 입력해 놓을 경우 그에 해당하는 시리얼을 알아서 출력해주는 프로그램인 것 같다. 알고리즘의 경우에는 반복적으로 보면 충분히 분석 할 수가 있을 것 같다.


KEY_FILE에 Kali-KM이라는 문자열을 넣고 분기점을 성공쪽으로 돌리고 실행을 할 경우 아래와 같이 시리얼 값이 자동으로 나타나는 것을 확인 할 수가 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 12  (0) 2015.06.01
CodeEngn Basic 11  (0) 2015.06.01
CodeEngn Basic 09  (0) 2015.06.01
CodeEngn Basic 08  (0) 2015.06.01
CodeEngn Basic 07  (0) 2015.06.01

CodeEngn Basic 09

Kail-KM
|2015. 6. 1. 01:51

문제 확인








풀이


아래와 같이 POPAD를 찾은 후에 JUMP를 통하여 OEP로 가기전에 이루어지는 동작이 바로 StolenByte이다. 

아래와 같이 OEP로 점프하기 바로 전에 스택을 보면 위의 붉은 상자 부분이 Stack에 Push 되어 있는 것을 확인 할 수가 있다. 이러한 것이 바로 StolenByte로써 이를 구하는 문제 였던 것이다. 

그렇다면 이러한 StolenByte가 제대로 스택에 있는지 확인하기 위해 OEP로 JUMP 해볼 경우 아래와 같이 Stack에는 이미 Push 되어 있는 StolenByte를 확인 할 수가 있다.




추가풀이


OEP를 찾은 후를 계속 풀어 본다면 우선 이 프로그램은 키파일이 있는 지를 확인 하는 것이다. 따라서 CreateFile 함수를 통하여 해당 파일이 존재하는지( Mode = OPEN EXISTING) 확인을 하고 그 해당 파일의 크기가 0x12인지 확인하기 위하여 GetFileSize 함수를 통하여 확인을 한다. 따라서 해당 폴더에 abex.l2c 라는 파일이 18Byte의 크기로 존재하여야 프로그램이 성공적으로 실행이 된다.





'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 11  (0) 2015.06.01
CodeEngn Basic 10  (0) 2015.06.01
CodeEngn Basic 08  (0) 2015.06.01
CodeEngn Basic 07  (0) 2015.06.01
CodeEngn Basic 06  (0) 2015.06.01

CodeEngn Basic 08

Kail-KM
|2015. 6. 1. 01:24

문제확인


OEP를 찾으면 된다. UPX패킹의 경우 흔히 PUSHAD로 먼저 시작을 하고 끝부분에 가서 POPAD를 통하여 스택을 해제한 후에 JUMP를 통하여 OEP로 이동을 한다. 따라서 이를 유념하고 문제를 풀면 쉽게 풀 수가 있다.





풀이


POPAD를 Ctrl+F : POPAD를 통하여 찾은 다음에 Ctrl+L을 통하여 다른 POPAD 또한 찾으면 손쉽게 찾을 수가 있다.


OEP지점으로 JMP한 이후에 Ctrl+A를 통하여 코드를 다시 분석을 하면 아래와 같이 기존의 코드를 복원 할 수가 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 10  (0) 2015.06.01
CodeEngn Basic 09  (0) 2015.06.01
CodeEngn Basic 07  (0) 2015.06.01
CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31

CodeEngn Basic 07

Kail-KM
|2015. 6. 1. 00:56

문제확인



파일을 실행할 경우 아래와 같이 틀린 시리얼에 의하여 프로그램이 바로 종료가 된다.





풀이


손쉽게 성공분기점을 찾을 수가 있으며, 이를 통하여 우리는 GetVolumeInformationA 와 lstrcat과 lstrcmp를 볼 수가 있다.  하지만 여기서 중요한 것은 바로 4562-ABEX 밑 부분에 알고리즘이 있다는 것이다. 이 알고리즘은 4562의 숫자를 1씩 총 두번 상승 시키므로 인하여 결국 6784-ABEX가 위치하게 된다.


알고리즘을 거친 문자열은 L2C-5781뒤에 덧붙여 지게 되어 시리얼을 형성하는 것을 볼수가 있다.

여기서 GetVolumeInformationA에서 VolumeNameBuffer의 위치에 바로 드라이브의 이름이 위치하는 것을 볼 수가 있다. 따라서 드라이브의 이름이 CodeEngn일 경우 Code-Engn이 위치하게 되어 앞의 Code부분이 2칸씩 상승하게 되고 그러한 상승이 이루어진뒤에 기존의 문자열에 덧붙여져 이번 문제를 풀 수가 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 09  (0) 2015.06.01
CodeEngn Basic 08  (0) 2015.06.01
CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31
CodeEngn Basic 04  (0) 2015.05.31