no image
CodeEngn Advance 03
문제 확인우선 문제를 확인해보면 여지껏 많이 보았던 해당 Name에 따른 Serial을 찾는 문제이다. 우선 패킹의 여부를 확인을 하고 간단한 정보를 PEID를 통하여 확인을 하자. 풀이우선 위와 같이 lstrcmpA 함수를 통하여 문자열을 비교하는 부분을 쉽게 찾을 수가 있다. 이를 통하여 해당 name에 따른 시리얼을 쉽게 확인 할 수가 있다. 마찬가지로 CodeEngn일때의 시리얼 값도 쉽게 확인 할 수가 있다. p.s 알고리즘을 분석하려 했지만 너무나 복잡하게 되어있어서 포기를 해버렸다..
2015.06.28
no image
CodeEngn Advance 01
문제확인안녕하세요. 대학 기말고사가 끝나고 방학이 시작하자마자 1주일동안 공부를 하지 않아 자책을 하다가 이제서야 다시 공부를 시작합니다. 이번엔 CodeEngn Advance문제 풀이를 시작하도록 하겠습니다. 역시 이전과 같이 질문은 받지않아요 >< 저도 모르는데 혹여나 질문하지마세요..그냥 직접해보거나 구글이 진리입니다. 문제를 확인하며 Basic에서도 같은 문제를 확인할 수가 있다. UPX로 패킹이 되어 있기에 언패킹을 실시한 후에 풀이를 시작하면 된다. 풀이프로그램을 우선 실행 해보고 어떤 API가 사용되었을지를 유추하는 것도 하나의 중요한 실력이다. 그러므로 많은 분석을 해보아야 더 효율적인 분석이 가능해진다. 여기서 우리는 timeGetTime이 사용 된다는 것을 알고 있다. 따라서 timeG..
2015.06.27
no image
CodeEngn Basic 20
문제 확인이번 문제는 정말 오래 걸렸다. 알고리즘 분석에서 XOR 연산으로 인하여 정말 난감해서 다른 블로그를 여러개 찾다가도 이해가 되지 않아 고민하다가 갑자기 문득 떠오른 생각에 풀 수가 있었다. 이제부터 풀이를 시작해보자. 풀이우선 CreateFileA에 Mode = OPEN_EXISTING에 의하여 해당 이름의 파일이 존재하는지 여부를 확인하는 부분이다. 존재하지 않을 경우 바로 종료되거나 실패구문으로 가게 될 것이므로 해당 파일의 이름을 만들어주어야 한다. 해당 파일의 존재 여부를 확인하고 그 뒤에는 ReadFile에 의하여 파일의 크기를 읽어 들인 다음 0x12(18)과 크기를 비교한다. 따라서 파일에 18자리의 문자를 채워주어야 한다는 것을 쉽게 알 수가 있다. 이 부분은 실패에 해당하는 알..
2015.06.04
no image
CodeEngn Basci 19
문제 확인 풀이프로그램을 실행하면 몇 초후에 종료가 되는지를 구하는 문제이다. 그렇다면 시간과 관련된 함수가 있을 것이고 바로 timeGetTime 함수이다. 하지만 저 여러개 중에서 어떠한 것을 봐야할지 난처하지만 명령어에 있어 CALL EDI라는 독특한 하나가 존재한다. 저 CALL EDI가 바로 중요한 포인트 인 것이다. 아래 사진과 같이 첫번째 timeGetTime을 통해서 EAX에 시간을 반환한다. 그리고 ESI에 그 값을 복사해주고 다시 timeGetTime 함수를 실행한다. 그리고 밑으로 쭉 내려가다 보면 SUB EAX, ESI 라는 부분이 있다. 바로 2번째-1번째시간인 것이다. 그리고 그 뺄셈을 한 값을 CMP EAX, DS:[EBX+4]와 비교를 하는 것으로, EBX+4의 값은 0x2B..
2015.06.03
no image
CodeEngn Basic 18
문제 확인 풀이우선 Name : AAAAA로 입력을 하고 디버거를 통해 분석해보았다. 대체적인 설명은 주석을 통해서 달아 놓았다. 여기서 두번의 값이 생성이 되는 것을 확인 할 수가 있다. 첫번쨰로는 4010EC에 써있는 것처럼 원래 0~FF~0이 D41D8~과 같이 변화하는데, 이는 입력 값과는 상관 없이 동일하게 진행되는 과정이였다.그리고 두번쨰는 401146에 있는 것처럼 저 부분이 NAME 값에 따라 다르게 생성 되는 값이 있는데, 저 부분은 포스팅의 맨 밑에 분석을 시도(결국 실패)했었다. 그리고 위의 두 단계에서 만들어진 값들을 가지고 추가적으로 명령어가 진행되어 값이 더 변경 된후에 401185~7부분에서 최종 키값이 생성이 된다. 이를 통해 만들어진 키 값을 가지고 lstrcpmiA 함수를..
2015.06.03
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

문제 확인


우선 문제를 확인해보면 여지껏 많이 보았던 해당 Name에 따른 Serial을 찾는 문제이다. 우선 패킹의 여부를 확인을 하고 간단한 정보를 PEID를 통하여 확인을 하자.


풀이


우선 위와 같이 lstrcmpA 함수를 통하여 문자열을 비교하는 부분을 쉽게 찾을 수가 있다. 이를 통하여 해당 name에 따른 시리얼을 쉽게 확인 할 수가 있다.



마찬가지로 CodeEngn일때의 시리얼 값도 쉽게 확인 할 수가 있다.



p.s 알고리즘을 분석하려 했지만 너무나 복잡하게 되어있어서 포기를 해버렸다..

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

CodeEngn Advance 05  (0) 2015.06.28
CodeEngn Advance 04  (0) 2015.06.28
CodeEngn Advance 01  (0) 2015.06.27
CodeEngn Basic 20  (0) 2015.06.04
CodeEngn Basci 19  (0) 2015.06.03

문제확인


안녕하세요. 대학 기말고사가 끝나고 방학이 시작하자마자 1주일동안 공부를 하지 않아 자책을 하다가 이제서야 다시 공부를 시작합니다. 이번엔 CodeEngn Advance문제 풀이를 시작하도록 하겠습니다. 역시 이전과 같이 질문은 받지않아요 >< 저도 모르는데 혹여나 질문하지마세요..그냥 직접해보거나 구글이 진리입니다.


문제를 확인하며 Basic에서도 같은 문제를 확인할 수가 있다. UPX로 패킹이 되어 있기에 언패킹을 실시한 후에 풀이를 시작하면 된다.



풀이


프로그램을 우선 실행 해보고 어떤 API가 사용되었을지를 유추하는 것도 하나의 중요한 실력이다. 그러므로 많은 분석을 해보아야 더 효율적인 분석이 가능해진다. 여기서 우리는 timeGetTime이 사용 된다는 것을 알고 있다. 따라서 timeGetTime을 따라가면 된다. 여기서 가장 수상한 CALL EDI가 우리에게 손짓하고 있다.


해당 지점으로 이동하면 아래와 같이 두번의 timeGetTime이 진행되는 것을 확인 할 수가 있다. 첫 호출을 통하여 EAX에 값을 반환받고 그 값을 ESI로 복사를 한 후에 두번째 호출을 통하여 그 반환값 EAX와 ESI를 비교 후에 점프문을 진행한다.


아래와 같이 해당 연산 값이 0x337B인지 확인을 한다. 이를 통하여 우리는 손 쉽게 값을 알 수가 있다. 




아래와 같이 Exe2Aut를 통하여 디컴파일을 한 후에 쉽게 확인을 할 수도 있다. 하지만 이러한 방법은 공부를 할 때는 사용하지 않는 것이 좋을 것 같다.




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

CodeEngn Advance 04  (0) 2015.06.28
CodeEngn Advance 03  (0) 2015.06.28
CodeEngn Basic 20  (0) 2015.06.04
CodeEngn Basci 19  (0) 2015.06.03
CodeEngn Basic 18  (0) 2015.06.03

CodeEngn Basic 20

Kail-KM
|2015. 6. 4. 00:35

문제 확인


이번 문제는 정말 오래 걸렸다. 알고리즘 분석에서 XOR 연산으로 인하여 정말 난감해서 다른 블로그를 여러개 찾다가도 이해가 되지 않아 고민하다가 갑자기 문득 떠오른 생각에 풀 수가 있었다. 이제부터 풀이를 시작해보자.



풀이


우선 CreateFileA에 Mode = OPEN_EXISTING에 의하여 해당 이름의 파일이 존재하는지 여부를 확인하는 부분이다. 존재하지 않을 경우 바로 종료되거나 실패구문으로 가게 될 것이므로 해당 파일의 이름을 만들어주어야 한다.


해당 파일의 존재 여부를 확인하고 그 뒤에는 ReadFile에 의하여 파일의 크기를 읽어 들인 다음 0x12(18)과 크기를 비교한다. 따라서 파일에 18자리의 문자를 채워주어야 한다는 것을 쉽게 알 수가 있다.


이 부분은 실패에 해당하는 알고리즘으로 CrackMe라는 문자열 뒤에 -Uncracked 라는 문자를 추가해주는 부분이다. 이 부분으로 가지 않기 위해 얼마나 노력한지를 모르겠다. 비중이 없는 부분이니 생략하겠다.



알고리즘 분석


이제부터 본격적인 알고리즘을 분석할 것이다. 사진에 직접 달아 놓는 것이 설명에 편할 것 같기에 같이 설명을 하겠다. 우선 위에서부터 key 파일에 입력 된 내용을 ESI에 복사를 하고 EBX 또한 같은 값이 지만 MOV BL,41로 인하여 EBX의 맨 뒷값이 41로 설정이 된다.

여기서 EBX의 41은 중요한 것이다. 바로 붉은 상자에 표시한 XOR AL,BL을 위해서 우리는 이해를 해야한다. 주석에 달아 놓긴 했지만 Key파일의 첫 문자가 "A"(41)일 경우에 바로 XOR 연산에 의해서 AL에 0이 반환이 된다. 

이 0은 붉은 상자의 5번쨰 밑에 명령어인 CMP AL, 0의 비교문에 의하여 알고리즘이 더이상 진행 되지 않고 덤프 창에 표시 된곳에 값을 저장하고 빠져나오게 된다. 하지만 여기서 우리는 XOR AL, BL에 의하여 덤프에 저장될 값이 0 이므로 변화가 없다(이 부분이 중요한 말이다.)

이런식으로 알고리즘은 진행이 된다. 만약 첫 문자가 A가 아닐 경우 XOR에 의한 값을 저 부분에 저장을 하고 BL=42의 값으로 바뀌게 되고 이제 두번쨰 문자와의 XOR 연산을 한 후 다시 저 부분에 값을 더해주는 식으로 진행이 된다.


풀이_2


이와 같이 나는 첫 문자에 A를 입력하므로 바로 알고리즘에서 빠져나오도록 유도하였다. 이유는 밑에 부분에 가다보면 충분히 이해 할 수가 있다. 아직은 호기심을 그냥 품은채 계속 글을 읽어주길 바란다.


이제 알고리즘 부분을 빠져나와서 XOR DS, 12345678을 진행하는데 DS의 값이 0이기에 결국 12345678이 그대로 덤프에 저장이 된다. 만약 여기서 DS 값이 0 이 아니라면 12345678의 값은 변하게 되고 결국 나중에 Key 값 비교에 있어서 복잡해지므로 나는 저 숫자들이 그대로 얌전히 올 수 있도록 일부러 첫문자에 A를 넣어주었다.


이렇게 위의 과정을 거치고 온 다음에 드디어 가장 중요한 비교문이 나타났다. CMP EAX, DS를 비교하는 것이다. 내가 KEY파일에 뒷 부분 4글자에 일부러 해당 값을 갖는 ASCII 문자를 넣어 주었다. 결국 이렇게 두개의 비교될 값들이 안전하게 유지되므로 인하여 같아 질 수가 있다.

그리고 이러한 CMP문에서 두 개의 값이 같기에 Zero Plag에 1이 셋팅이 되며 이러한 ZP = 1은 SETE 명령어를 작동하도록 하므로 인하여 AL에 1의 값을 씌워준다.


위에서 쓰인 SETE AL에 의하여 AL에는 1이 쓰였고, 최종 성공 분기점에서 CMP AL, 1에 의하여 결국 성공문으로 갈 수 있게 된다.


아래는 성공화면이다. 정말 오래걸려서 얼마나 기쁜지 모르겠다. 여기서 하나 알아야할 것은 ASCII(0~Z) 뿐만 아니라 해당 지정 값들을 복사해서 위의 문제와 같이 인식하게 할 수가 있다. 당연히 인식이 되지 않을 줄 알고 XOR 연산에 바뀌는 값을 맞추기 위해 얼마나 개고생을 한지 모르겠다.

 

이제 CodeEngn!를 출력하기 위해 마지막 풀이를 해보자.


최종 풀이


우선 알고리즘을 거치고 나서 CodeEngn!가 출력 되도록 XOR 연산을 하나하나 직접(계산기가)해서 구한 값을 Key 파일에 써주면 된다. 그렇게 나온 값을 통해 끝의 뒷 4자리에 어떤 값을 입력 할지 확인을 하면 된다.  

참고로 키 파일에 값을 입력할떄 00을 넣어야하는 경우가 있는데 이는 메모장을 통해서는 절대로 불가능하다. 그럴 때 필요한 것이 바로 Hex Editor이다. HxD를 통해 키 파일을 열면 우리가 원하는 값을 넣을 수가 있다.

하지만 위와 같이 할 경우에는 NULL 문자가 포함 되지 않아서 CodeEngn!!%#@!의 값이 모두 출력이 되버린다. 따라서 우리는 이제 !의 뒤에 NULL을 추가해보면 된다.


밑의 사진 2장은 ! 뒤에 NULL 문자를 추가해 주는 과정이다. 위에서 구하는 방법은 설명하였기에 NULL문자가 인식 되도록 4n의 값을 ! 뒤에 넣어주면된다.

하지만 여기서 또 문제가 있다. 이렇게 하고 출력을 할 경우 CodeEngn!!로 출력이 된다는 것. 즉 문자열의 끝에 자동으로 !가 추가 되는 것으로 우리가 !를 추가해서는 안되는 것이 였다. 멍청하게도... 그럼 다시 "!"를 지우고 그 부분에 NULL을 추가해주자.


이제 마지막 과정이 끝났다. 아래와 같이 알고리즘을 지난후에 이루어지도록 키 값을 입력해주어야 한다.




드디어 성공 화면이 출력 되었다. 정말 힘들었다. 여기서 알아야 할 것은 HxD를 통해서도 값을 입력 할 수 있다는 것을 잊어서는 안될 것 같다. 이렇게 리버싱은 툴에 대한 이해도도 필요한 것 같다. 처음엔 00을 어떻게 입려할지 정말 고민했다. 하지만 이렇게도 쉽게 입력할 수 있는 방법이 있었다니...

마지막 문제인 만큼 헤이해 질뻔 했지만 이렇게 고생스러운 문제가 나와서 정말 참신했다. 리버싱을 하면서 이처럼 한가지 의문을 갖고 그것을 해보면 되는 일이 종종 있는 것 같다. 참신한 생각이 필요한 이유인것 같다. 여기까지 부족한 풀이 읽어주셔서 감사합니다. 모두들 열공하세요. 

P.S 질문하지마요..나도 모르니까...그냥 직접해보는게 답 @Google



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

CodeEngn Advance 03  (0) 2015.06.28
CodeEngn Advance 01  (0) 2015.06.27
CodeEngn Basci 19  (0) 2015.06.03
CodeEngn Basic 18  (0) 2015.06.03
CodeEngn Basic 17  (0) 2015.06.02

CodeEngn Basci 19

Kail-KM
|2015. 6. 3. 18:22

문제 확인








풀이


프로그램을 실행하면 몇 초후에 종료가 되는지를 구하는 문제이다. 그렇다면 시간과 관련된 함수가 있을 것이고 바로 timeGetTime 함수이다. 하지만 저 여러개 중에서 어떠한 것을 봐야할지 난처하지만 명령어에 있어 CALL EDI라는 독특한 하나가 존재한다.  저 CALL EDI가 바로 중요한 포인트 인 것이다.



아래 사진과 같이 첫번째 timeGetTime을 통해서 EAX에 시간을 반환한다. 그리고 ESI에 그 값을 복사해주고 다시 timeGetTime 함수를 실행한다. 그리고 밑으로 쭉 내려가다 보면 SUB EAX, ESI 라는 부분이 있다. 바로 2번째-1번째시간인 것이다. 

그리고 그 뺄셈을 한 값을 CMP EAX, DS:[EBX+4]와 비교를 하는 것으로, EBX+4의 값은 0x2B70으로 10진수로 변환 할 경우 11120으로 나타난다. 이번 문제와 같이 중요한 부분을 캐치 할 수 있도록 노력해야 할 것 같다.



쉬운 풀이


아래와 같이 Exeinfo PE를 통해서 프로그램을 열어보면 아래와 같이 11.12라는 시간이 쉽게 나와 있다. 하지만 이러한 방법은 리버싱 실력 향상에 도움이 되진 않을 것 같다.


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

CodeEngn Advance 01  (0) 2015.06.27
CodeEngn Basic 20  (0) 2015.06.04
CodeEngn Basic 18  (0) 2015.06.03
CodeEngn Basic 17  (0) 2015.06.02
CodeEngn Basic 16  (1) 2015.06.02

CodeEngn Basic 18

Kail-KM
|2015. 6. 3. 16:54

문제 확인






풀이


우선 Name : AAAAA로 입력을 하고 디버거를 통해 분석해보았다. 대체적인 설명은 주석을 통해서 달아 놓았다. 여기서 두번의 값이 생성이 되는 것을 확인 할 수가 있다. 첫번쨰로는 4010EC에 써있는 것처럼 원래 0~FF~0이 D41D8~과 같이 변화하는데, 이는 입력 값과는 상관 없이 동일하게 진행되는 과정이였다.

그리고 두번쨰는 401146에 있는 것처럼 저 부분이 NAME 값에 따라 다르게 생성 되는 값이 있는데, 저 부분은 포스팅의 맨 밑에 분석을 시도(결국 실패)했었다.


그리고 위의 두 단계에서 만들어진 값들을 가지고 추가적으로 명령어가 진행되어 값이 더 변경 된후에 401185~7부분에서 최종 키값이 생성이 된다. 이를 통해 만들어진 키 값을 가지고 lstrcpmiA 함수를 통하여 문자열을 비교하고 같다면 EAX에 0이 반환이 되어 성공구문으로 점프를 한다.


문제는 이와 같이 String이 출력 되므로 인하여 쉽게 풀 수가 있다.



알고리즘 분석


알고리즘을 분석하기 위해 Step Into를 통하여 확인 해볼 경우 아래와 같이 알고리즘이 생성이 되어 있다. 하지만 다른 알고리즘에서 쓸 때 없이 헤매서 그런지 이것까지 구체적으로 분석하기에는 힘이 부족하였다. 그러므로 자세한 분석은 무기한연기를 해야할 것 같다.

이 알고리즘을 통해 생성된 값을 가지고 Return 후에 추가적인 연산을 한 후 최종 키 값이 생성이 된다.


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

CodeEngn Basic 20  (0) 2015.06.04
CodeEngn Basci 19  (0) 2015.06.03
CodeEngn Basic 17  (0) 2015.06.02
CodeEngn Basic 16  (1) 2015.06.02
CodeEngn Basic 15  (0) 2015.06.02

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