no image
CodeEngn Basic 17
문제 확인 풀이우선 한글자를 입력해야 하므로 CMP EAX, 3을 1로 바꾸어 주어 한 글자를 입력해도 입력이 받아지도록 프로그램을 패치 하여야 한다. 이렇게 패치를 한 후 저장을 하여 그 프록램을 통하여 분석을 시작한다. 아래와 같이 Key값이 EBP-14에 저장이 되고 이러한 키 값과 내가 입력한 값을 비교하여 성공 여부를 결정을 한다. 아래 사진과 같이 저 부분에서 구체적으로 키 값이 뜨는 것을 알 수가 있다. 따라서 우리는 공격방법 몇 가지를 생각 할 수가 있다. 첫번쨰는 하나하나 값을 대입하여 우리가 찾는 키값이 생성 될떄까지 대입을 해보는 것이다. 두번째 방법으로는 알고리즘을 분석하여 그 알고리즘에 맞게 우리가 프로그래밍을 하여 값을 도출해내는 것이다.여기서 나는 깊이가 있는 두번쨰 방법을 사..
2015.06.02
no image
CodeEngn Basic 16
문제 확인 풀이우선 아래와 같이 Name에 맞는 Password를 구하는 것으로 성공 분기점을 통해서 손쉽게 답을 찾을 수가 있다. 추가 분석이제 암호화 알고리즘에 대하여 분석을 해보자 우선 암호화는 패스워드를 입력 받기전과 입력 받은 후와 같이 두번의 과정을 걸친다. 바로 밑의 그림에서는 커서가 위치한 곳의 윗부분 주석있는 곳이 첫번쨰 과정이고 밑의 주석 부분이 두번쨰 과정이다.첫번째 과정의 경우 Name의 길이 만큼 값이 반환이 되어 총 그 값을 3번 더한 값에서 SHL_2로 인하여 2칸 왼쪽으로 이동을 한다. 그리고 그 값을 이제 밑의 과정에서와 같이 0xACE80과 곱하여 주고 그 값과 기존의 값을 더하여 준다. 이 곱셈 과정에서 8자리가 넘어가게 되는데 여기서 우리는 8바이트만을 인식하게 된다...
2015.06.02
no image
CodeEngn Basic 15
문제 확인 이번문제에서는 아무런 패킹이 되지 않은 것을 확인 할 수가 있다. 밑에는 실행 화면으로 실행시 아래와 같이 틀린 값이 입력되어 다시 도전하라는 메세지가 출력된다. 풀이성공구문으로 가는 분기점을 찾는 것을 Serch for을 통하여 쉽게 찾을 수가 있다. 이렇게 찾은 후에 CMP EAX, PTR[45B844]의 값을 비교하는데 EAX에는 내가 입력한 Serial의 값이 들어 있고 PTR에는 암호화알고리즘을 거친 올바른 시리얼의 값이 들어 있다. 여기서 NAME이 123일 경우에는 시리얼 값이 0X1320DMFH 4896이라는 것을 확인 할 수가 있다. 그렇다면 문제인 Name : CodeEngn 을 통하여 입력을 해보면 아래와 같이 PTR의 값이 0x6160을 가리키고 이는 10진수로 24928..
2015.06.02
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

CodeEngn Basic 17

Kail-KM
|2015. 6. 2. 19:17

문제 확인




풀이


우선 한글자를 입력해야 하므로 CMP EAX, 3을 1로 바꾸어 주어 한 글자를 입력해도 입력이 받아지도록 프로그램을 패치 하여야 한다. 이렇게 패치를 한 후 저장을 하여 그 프록램을 통하여 분석을 시작한다.


아래와 같이 Key값이 EBP-14에 저장이 되고 이러한 키 값과 내가 입력한 값을 비교하여 성공 여부를 결정을 한다.


아래 사진과 같이 저 부분에서 구체적으로 키 값이 뜨는 것을 알 수가 있다. 따라서 우리는 공격방법 몇 가지를 생각 할 수가 있다. 첫번쨰는 하나하나 값을 대입하여 우리가 찾는 키값이 생성 될떄까지 대입을 해보는 것이다. 두번째 방법으로는 알고리즘을 분석하여 그 알고리즘에 맞게 우리가 프로그래밍을 하여 값을 도출해내는 것이다.

여기서 나는 깊이가 있는 두번쨰 방법을 사용 할 것이다. 참고로 나는 Python을 통하여 프로그래밍을 할 것이다.




알고리즘 분석


우선 나는 알고리즘 분석에 실패를 하였음을 미리 알린다. 내가 찾은 알고리즘은 4번의 알고리즘이 형성이 되지만 키 값 형성에 있어서 총 5번의 과정이 필요한 것 같다. 여기서 내가 찾은 알고리즘을 1,2,3,4로 나누어 볼 수가 있다.

하지만 실제로 키 값에 올라오는 것은 1- 2 - x - y - 4 인 것으로 분석을 하면서 알게 되었다. 끝까지 x, y에 쓰이는 키 값 생성 과정은 찾지 못하였다. 하지만 그렇다고 문제를 풀지 못하는 것은 아니다. 분석한 내용은 주석에 달아 놓았다.


여기서 확인 할 수 있는 것은 내가 분석한 3번 알고리즘의 값이 쓰이지 않는 다는 것이다. 그 대신 x 와 y의 값이 올라가고 이를 통해 키 값을 형성 한다. 그렇다면 어떻게 문제를 풀 것이냐면 바로 몇개의 알고리즘만으로도 키 값이 주어졌기에 우리는 찾기만 하면 된다. 

따라서 우선 1번 알고리즘을 통하여 프로그래밍을 해보고 만약 이것만으로는 부족할 경우에는 2번 알고리즘까지 프로그래밍을 통하여 코딩을 해볼려한다.



Programming


아래와 같이 프로그래밍을 한 후에 프로그램을 실행 시켜보자.


첫 번째 알고리즘을 통하여 8바이트 까지만 인식을 하므로 앞의 4자리는 무시해도 된다. 그리고 이렇게 얻은 8자리 중에서 앞의 4자리만을 키 값 생성에 사용 하므로 우리는 아래와 같이 키 값의 첫번쨰 부분에 해당하는 70을 찾을 수가 있다. 이는 ASCII("F")의 값이다.


위에서 찾은 값을 가지고 프로그램을 실행 할 경우 문제에서 주어진 키 값과 동일한 키 값이 레지스터에 올라오는 것을 확인 할 수가 있다.


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

CodeEngn Basci 19  (0) 2015.06.03
CodeEngn Basic 18  (0) 2015.06.03
CodeEngn Basic 16  (1) 2015.06.02
CodeEngn Basic 15  (0) 2015.06.02
CodeEngn Basic 14  (0) 2015.06.02

CodeEngn Basic 16

Kail-KM
|2015. 6. 2. 03:11

문제 확인






풀이


우선 아래와 같이 Name에 맞는 Password를 구하는 것으로 성공 분기점을 통해서 손쉽게 답을 찾을 수가 있다. 




추가 분석


이제 암호화 알고리즘에 대하여 분석을 해보자 우선 암호화는 패스워드를 입력 받기전과 입력 받은 후와 같이 두번의 과정을 걸친다. 바로 밑의 그림에서는 커서가 위치한 곳의 윗부분 주석있는 곳이 첫번쨰 과정이고 밑의 주석 부분이 두번쨰 과정이다.

첫번째 과정의 경우 Name의 길이 만큼 값이 반환이 되어 총 그 값을 3번 더한 값에서 SHL_2로 인하여 2칸 왼쪽으로 이동을 한다. 그리고 그 값을 이제 밑의 과정에서와 같이 0xACE80과 곱하여 주고 그 값과 기존의 값을 더하여 준다. 이 곱셈 과정에서 8자리가 넘어가게 되는데 여기서 우리는 8바이트만을 인식하게 된다.

곱한 값과 기존의 값을 더하여 주면 PassWord의 값이 나오고 이를 16진수에서 10진수로 변환하면 답이 된다. 여기에서 추가적으로 암호화 알고리즘의 인자로 쓰이는 것이 문자열의 길이 하나 뿐이기 떄문에 문자열의 길이가 같으면 Password 또한 같다는 것을 확인 할 수가 있다.


위에서 설명한 과정과 같이 CodeEngn을 인자로 주어 return 값으로 8을 받게 되어 알고리즘을 거치게 되면 0xE4C60D97이 나오게 된다. 이제 이를 10진수로 바꾸어서 입력을 해주면 크랙에 성공하는 것을 확인 할 수가 있다.


밑의 사진은 문자열의 길이만 같다면 문자가 다르더라도 값이 같다는 것을 확인 할 수가 있다.


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

CodeEngn Basic 18  (0) 2015.06.03
CodeEngn Basic 17  (0) 2015.06.02
CodeEngn Basic 15  (0) 2015.06.02
CodeEngn Basic 14  (0) 2015.06.02
CodeEngn Basic 13  (0) 2015.06.02

CodeEngn Basic 15

Kail-KM
|2015. 6. 2. 02:21

문제 확인




이번문제에서는 아무런 패킹이 되지 않은 것을 확인 할 수가 있다. 밑에는 실행 화면으로 실행시 아래와 같이 틀린 값이 입력되어 다시 도전하라는 메세지가 출력된다.



풀이


성공구문으로 가는 분기점을 찾는 것을 Serch for을 통하여 쉽게 찾을 수가 있다. 이렇게 찾은 후에 CMP EAX, PTR[45B844]의 값을 비교하는데 EAX에는 내가 입력한 Serial의 값이 들어 있고 PTR에는 암호화알고리즘을 거친 올바른 시리얼의 값이 들어 있다. 여기서 NAME이 123일 경우에는 시리얼 값이 0X1320DMFH 4896이라는 것을 확인 할 수가 있다.


그렇다면 문제인 Name : CodeEngn 을 통하여 입력을 해보면 아래와 같이 PTR의 값이 0x6160을 가리키고 이는 10진수로 24928을 나타낸다.


추가 분석


추가적으로 암호화 알고리즘을 분석하여 보자. 암호화가 진행되는 위치는 45B844의 값이 변하는 곳으로 바로 아래에 커서가 나타내고 있는 곳이 암호화 알고리즘이 진행 되는 곳이다. 이제 Step Into를 통하여 내부로 진입하여 보자.


내부로 진입을 하면 주석과 같이 한 단어를 읽어 들여 Shift Left(3)을 하고 이를 한글자씩 모든 과정을 거친후에 더한다. 그 후엔 "=======" 주석 밑에 위치한 부분으로 Name의 길이 만큼의 값을 Shift Left 3 이동 한후에 그 값을 Sum에 더한후 그 Sum을 SHL_2 이동 시키고 나서야 비로소 암호화 알고리즘이 끝난다.

이처럼 암호화 알고리즘을 분석하는 것을 피하지 말고 연습하자. 프로그램에 대한 이해도가 높아질 것이다.

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

CodeEngn Basic 17  (0) 2015.06.02
CodeEngn Basic 16  (1) 2015.06.02
CodeEngn Basic 14  (0) 2015.06.02
CodeEngn Basic 13  (0) 2015.06.02
CodeEngn Basic 12  (0) 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