no image
CodeEngn Advance 06
문제확인우선 문제를 확인하면 이전에도 풀려고 했지만 결국 풀지 못했던 문제로 기억을 한다. 하지만 그 때에는 분명 리버싱을 처음 접했을때로 기억을 하기에 당시보다는 잘 풀 수 있겠지라는 자신감으로 리버싱을 시작하였다. 우선 UPX 패킹을 해제하고 리버싱을 계속 진행하면 된다. 풀이사실 이 문제는 정말 많이 삽질을 한것 같다. 출력되는 남은 군생활의 값을 증가시켜주는 부분을 찾았고 그 주위에서 CMP를 통한 비교문을 찾기 위하여 많은 노가다를 하였지만 결국 삽질도 여러번 하다가 문득 생각 난 것이 바로 치트엔진이였다. 사실 치트엔진을 통한 문제 풀이가 과연 리버싱에 도움이 되는 것인지는 모르겠지만 이참에 치트엔진 공부도 새롭게 같이 시작을 해보려한다. 우선 아래와 같이 치트엔진을 통하여 변화하는 값을 캐치..
2015.06.28
no image
CodeEngn Advance 05
문제확인이번 문제는 너무 설명 할 것도 없는 것같다. 풀이아래와 같이 vbaStrCmp를 찾으면 쉽게 시리얼을 찾을 수가 있다. Name에 따른 알고리즘 형성으로 인하여 키 값이 형성 되는 것이 아니라 그냥 시리얼 값을 찾는 것이기에 너무 간단히 끝나버렸다.
2015.06.28
no image
CodeEngn Advance 04
문제 확인 풀이 우선 위와 같이 lstrcmpA를 통하여 우리는 쉽게 해당 시리얼을 구할 수가 있지만 이렇게 문제풀이를 중심으로만 하면 실력향상에 차질이 있을 수도 있기에 직접 알고리즘을 분석하는 방법을 통하여 문제를 풀어보고자 한다. 위와 같이 알고리즘이 진행되는 부분을 표시해 놓았다. 위의 알고리즘을 커친 후 ESI의 값이 10진수로 시리얼의 가운데 값으로 자리잡고, EDI의 값은 16진수로 시리얼의 뒷자리 값으로 자리를 잡는다. 알고리즘에 대한 분석은 주석에 달아 놓은 것과 같고 직접해보는 것이 크게 도움이 될 것이다. 이제 알고리즘을 파악한 후 직접 키 값을 구하는 프로그램을 만들어보자. 위와 같이 나는 이렇게 Python을 통하여 키 값을 구하는 프로그램을 만들어 보았다. 이렇게 구한 값이 실제..
2015.06.28
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

문제확인


우선 문제를 확인하면 이전에도 풀려고 했지만 결국 풀지 못했던 문제로 기억을 한다. 하지만 그 때에는 분명 리버싱을 처음 접했을때로 기억을 하기에 당시보다는 잘 풀 수 있겠지라는 자신감으로 리버싱을 시작하였다. 

우선 UPX 패킹을 해제하고 리버싱을 계속 진행하면 된다.




풀이


사실 이 문제는 정말 많이 삽질을 한것 같다. 출력되는 남은 군생활의 값을 증가시켜주는 부분을 찾았고 그 주위에서 CMP를 통한 비교문을 찾기 위하여 많은 노가다를 하였지만 결국 삽질도 여러번 하다가 문득 생각 난 것이 바로 치트엔진이였다. 

사실 치트엔진을 통한 문제 풀이가 과연 리버싱에 도움이 되는 것인지는 모르겠지만 이참에 치트엔진 공부도 새롭게 같이 시작을 해보려한다. 우선 아래와 같이 치트엔진을 통하여 변화하는 값을 캐치한다.

위의 사진과 같이 치트엔진을 통하여 우선 해당 N번째의 값인 10을 입력해주고 그 다음은 Increased value를 통하여 두개의 값만 남았다. 여기서 첫번째 주소로 이동을 하여 확인을 해볼 것이다. 주소는 02583DB0로 이동을 한다. 그러면 위의 덤프창에서와 같이 0xA의 값이 존재하는 것을 확인 할 수가 있다.


위의 사진과 같이 해당 덤프에 BP를 건다. 위와 같이 ON ACCESS를 하는 것이 적당할 것이다. 그 후 BP를 통하여 계속 진행을 하다보면 아래와 같은 지점이 나타난다. 이 지점에서 우리가 현재 N번쨰인 B와 316을 비교를 한다. 이를 통해 우리는 남은 군 생활 수가 0x316 일수도 있다는 것을 확인 할 수가 있다. 이제 확인을 위하여 명령어를 바꾸어 보자.


0x316보다 클 경우에는 해당지점으로 점프를 한다. 그렇다면 우리는 확인을 위하여 JL을 JMP로 바꾸어 볼 것이다. 아래와 같이 바꾼 후에 진행을 할 경우 결국 RETN 8을 끝으로 프로세스가 종료 되는 것을 확인 할 수가 있다.

이러한 작업을 통하여 우리가 찾은 비교문이 올바른 지점이라는 것을 확인 할 수가 있었다. 이러한 방법을 통하여 문제를 풀 수가 있다. 치트엔진을 이용해서 더 쉽게 풀 수가 있었던 것 같다. 하지만 치트엔진보다 더 쉬운 방법이 있는데 바로 아래와 같은 디컴파일러를 이용하는 것이다. 디컴파일러를 이용하면 바로 1 TO 790(0x316)을 확인 할 수가 있다. 하지만 이는 실력 향상에는 안좋을 것 같다. 이러한 방법이 있다는 것만 잊지 말자.


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

CodeEngn Advance 09  (0) 2015.07.12
CodeEngn Advance 08  (50) 2015.07.01
CodeEngn Advance 05  (0) 2015.06.28
CodeEngn Advance 04  (0) 2015.06.28
CodeEngn Advance 03  (0) 2015.06.28

문제확인


이번 문제는 너무 설명 할 것도 없는 것같다.




풀이


아래와 같이 vbaStrCmp를 찾으면 쉽게 시리얼을 찾을 수가 있다. Name에 따른 알고리즘 형성으로 인하여 키 값이 형성 되는 것이 아니라 그냥 시리얼 값을 찾는 것이기에 너무 간단히 끝나버렸다.



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

CodeEngn Advance 08  (50) 2015.07.01
CodeEngn Advance 06  (0) 2015.06.28
CodeEngn Advance 04  (0) 2015.06.28
CodeEngn Advance 03  (0) 2015.06.28
CodeEngn Advance 01  (0) 2015.06.27

문제 확인





풀이



우선 위와 같이 lstrcmpA를 통하여 우리는 쉽게 해당 시리얼을 구할 수가 있지만 이렇게 문제풀이를 중심으로만 하면 실력향상에 차질이 있을 수도 있기에 직접 알고리즘을 분석하는 방법을 통하여 문제를 풀어보고자 한다. 


위와 같이 알고리즘이 진행되는 부분을 표시해 놓았다. 위의 알고리즘을 커친 후 ESI의 값이 10진수로 시리얼의 가운데 값으로 자리잡고, EDI의 값은 16진수로 시리얼의 뒷자리 값으로 자리를 잡는다. 알고리즘에 대한 분석은 주석에 달아 놓은 것과 같고 직접해보는 것이 크게 도움이 될 것이다. 이제 알고리즘을 파악한 후 직접 키 값을 구하는 프로그램을 만들어보자.


위와 같이 나는 이렇게 Python을 통하여 키 값을 구하는 프로그램을 만들어 보았다. 이렇게 구한 값이 실제 프로그램과 동일한 결과를 도출해내는지를 확인하기 위하여 아래와 같이 확인을 할 수가 있다.



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

CodeEngn Advance 06  (0) 2015.06.28
CodeEngn Advance 05  (0) 2015.06.28
CodeEngn Advance 03  (0) 2015.06.28
CodeEngn Advance 01  (0) 2015.06.27
CodeEngn Basic 20  (0) 2015.06.04

문제 확인


우선 문제를 확인해보면 여지껏 많이 보았던 해당 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