OEP로 가 한줄씩 실행시켜보면 CreateFileA함수에서 CRACKME3.KEY파일을 여는 것을 볼 수 있다.



파일사이즈가 0x12인지 체크하고 들어있는 값을 00402008버퍼에 저장한다. 크기가 같지 않다면 00401037로 점프하고 아니면 00401311함수를 실행한다.


함수를 설명하자면 크랙미3.키 파일에는 0123456789ABCDEFGH가 있었는데 루프를 다돌고 함수 종료후 버퍼에 남아있는 값을 보면 뒤에 네자리는 그대로 있고 앞에 14자리가 바뀌어 있다. 어떠한 과정인가 알아보면...

1.XOR ECX,ECX와 XOR EAX,EAX를 통해 레지스터값을 0으로 초기화 해준다음

2.ESI에 문자열 시작 주소를 넣고 한글자씩 빼와 BL(41)과 XOR 연산을 해준다.

3.AL값을 다시 빼온 그자리에 넣어주고 INC ESI와 INC BL을 한다.

4.EAX가 담고있는 값을 4020F9에 저장한다.

5.AL과 0을 비교하여 같다면 루프문을 빠져나가고 아니면 CL을 +1한다.

6.BL과 4F를 비교한뒤 같다면 루프문을 빠져나가고 다르다면 루프문을 다시 수행한다(0040131B부터).

루프문을 다 빠져나왔다면 마지막으로 402149의 주소에 ECX값을 저장한뒤 RETURN한다.





대문자 E와 0x45의 xor연산은 0이기때문에 루프에서 벗어난다. 그렇기 때문에 ngn의 변환 값을 알 수 없게 되었는데..

아래와 같이 0으로 앞 5자리를 채우고 ngn을 입력해주면 28 20 26값이 나온다.


CodeEngn은 차례대로 아래와 같은 값이 나온다는 사실을 알 수 있었다.


41 42 43 44 45 46 47 48은 차례대로 BL의 값.



마지막 네자리문자와 4020F9가 담고있는 값과 비교하기 때문에 리틀엔디언 방식으로 넣어준다.

Offset 08번째의 값 49는 xor연산후 0이 되기때문에 문자열이 CodeEngn까지만 나오게 한다. 





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

19.코드엔진 Basic19  (0) 2018.01.24
18.코드엔진 Basic18  (0) 2018.01.23
17.코드엔진 Basic17  (0) 2018.01.21
16.코드엔진 Basic16  (0) 2018.01.21
15.코드엔진 Basic15  (0) 2018.01.20


안티디버깅이 걸려 있다. olly advanced 플러그인을 이용해서 IsDebuggerPresent에 체크해주면 된다..


시간과 관련한 함수를 이름정렬해서 모두 bp걸어준다.. F9로 넘겨 주면..





위 두구간 사이에서 루프문을 정해진 시간동안 돌고 그 후에는 풀려서 다음 구간으로 내려가는 것을 알 수 있었다.

정리하자면 00444D3A에서 어떤 값과 프로그램이 실행된 경과 시간을 밀리단위로 변환한 값과 비교한다.


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

20.코드엔진 Basic20  (0) 2018.01.25
18.코드엔진 Basic18  (0) 2018.01.23
17.코드엔진 Basic17  (0) 2018.01.21
16.코드엔진 Basic16  (0) 2018.01.21
15.코드엔진 Basic15  (0) 2018.01.20


프로그램을 실행 시키고 문자열 부터 검색했다. 시리얼 넘버가 일치했을때 나올법한 good메세지가 있는 곳으로 가본다..

위와 같이 프로그램에 입력시켜주면...

1번째 BP에서 멈추게 되고 그위를 살펴보니 0040120E (성공 메시지 출력) 부분으로 분기하는 JE문과 문자열 비교함수인 IstrcmpiA 를 확인할 수 있었다... 

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

20.코드엔진 Basic20  (0) 2018.01.25
19.코드엔진 Basic19  (0) 2018.01.24
17.코드엔진 Basic17  (0) 2018.01.21
16.코드엔진 Basic16  (0) 2018.01.21
15.코드엔진 Basic15  (0) 2018.01.20

문자열을 검색해서 전부 BP를 걸고 확인해 보았다...


이름이 한글자라고 해서 한글자를 넣어주니 please enter more chars...라는 문구가 떴다..



3~30자 사이의 문자열을 넣어야만 하는데 분명 문제에서는 한글자라고 했기때문에...



위와같이 수정해준다..

한 글자 중에 어떤 글자인지 찾기위해 임의의 값을 넣어보고 어떤 과정을 거치는지 분석해보았다.



0045BB9B 줄을 보면 함수가 하나 호출 되고 그 안에 총 4가지의 알고리즘이 있었다 그 중 첫 시리얼 넘버를 생성하는 알고리즘을 분석해서 시리얼 넘버를 같게 맞춘다면 나머지도 올바르게 생성될 것이다.



위의 과정은 아래와 같이 나타낼 수 있다.

문자 F는 정수로 70이고

마지막 값이 24e9bedaca60d로 나왔다. 

그중 앞 네자리는 4바이트 용량에 담지 못하므로 beda로 시작한다는 것을 알 수 있었다. 

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

19.코드엔진 Basic19  (0) 2018.01.24
18.코드엔진 Basic18  (0) 2018.01.23
16.코드엔진 Basic16  (0) 2018.01.21
15.코드엔진 Basic15  (0) 2018.01.20
14.코드엔진 Basic14  (0) 2018.01.20

패킹X에 c++로 짜여진 프로그램이고 oep는 00401220였다.


시작지점에서 F8을 누르면서 Name과 Password를 입력받는 함수에 BP를 걸고 확인해보았다..



이름을 입력하는 부분을 분석이  이 문제를 푸는데 그다지 필요없는 부분이라고 생각해서 그냥 지나치고 ..



Password를 입력받는 함수 부분에서 멈춘뒤에 패스워드를 입력하고 한줄한줄 내려가던중 분기문을 찾았고

내용은 EAX값과 스택에 0070FEFC부터 4바이트의 값을 서로 비교했다.. 10진수로 환산해보면...



 



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

18.코드엔진 Basic18  (0) 2018.01.23
17.코드엔진 Basic17  (0) 2018.01.21
15.코드엔진 Basic15  (0) 2018.01.20
14.코드엔진 Basic14  (0) 2018.01.20
13.코드엔진 basic13  (0) 2018.01.20

패킹되어있지않았다..



Name과 Serial에 각각 CodeEngn과 11111을 입력해주었다.


비교문은 EAX값과 DS세그먼트의 045B844주소에서 4바이트 값을 비교한다.(00006160)

10진수로 바꿔서 Serial칸에 넣어준다.


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

17.코드엔진 Basic17  (0) 2018.01.21
16.코드엔진 Basic16  (0) 2018.01.21
14.코드엔진 Basic14  (0) 2018.01.20
13.코드엔진 basic13  (0) 2018.01.20
12.코드엔진 Basic12  (0) 2018.01.19

upx 패킹이 되어 있다..

Cntl+F로 POPAD를 검색해서 찾아주고 다음 점프문이 OEP이기 때문에 Breakpoint를 건다.



name과 시리얼넘버 칸에 CodeEngn과 임의의값이 11111을 넣어주고 시리얼넘버가 맞다는 메세지 박스창을 뜨게하는 비교문을 확인해봤는데.. 



CMP EAX,ESI를 해서 같으면 Good Job 메세지 박스를 호출한다. ESI레지스터의 값은 129A1이기 때문에 10진수로 환산하면 76193이 된다.



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

16.코드엔진 Basic16  (0) 2018.01.21
15.코드엔진 Basic15  (0) 2018.01.20
13.코드엔진 basic13  (0) 2018.01.20
12.코드엔진 Basic12  (0) 2018.01.19
11.코드엔진 Basic11  (0) 2018.01.19


C#으로 작성되어서 올리디버거로 열 수 없었다. 그래서 dotPeek을 이용하였다.


디컴파일 프로그램을 이용하여 소스코드를 볼 수 있었다..



그대로 소스코드을 비주얼 스튜디오에 가져와서 str 부분을 출력하도록 코드를 수정하고 프로그램을 실행하여 평문을 얻을 수 있었다.

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

15.코드엔진 Basic15  (0) 2018.01.20
14.코드엔진 Basic14  (0) 2018.01.20
12.코드엔진 Basic12  (0) 2018.01.19
11.코드엔진 Basic11  (0) 2018.01.19
10.코드엔진 Basic10  (0) 2018.01.18




DialongBoxParamA를 실행시키면 



위와 같은 창이 뜨고 Key값을 입력하고 Check를 누르면...



아무키값이나 넣어보니...

GetDlgItemInt에서 키값을 비교하는 듯하다. 그래서 함수 내부로 들어가보기로 한다.



긴문자열과 비교하는 듯한 부분이 있어서 처음에는 저 문자열이 키값인줄 알았지만 낚시였다. 

문자열 끝과 

구간 사이에 CALL 12.00401068 내부를 들어가보았다..


결론은 eax에 값에 영향을 끼치지 않는다는 사실을 알게 되었다..


eax와  7A2896BF와 비교를 하니 10진수로 바꿔서 2049480383으로 넣어준다.


헥스에디터로 변경해주기 + 문자길이는 null값도 포함한다. 

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

14.코드엔진 Basic14  (0) 2018.01.20
13.코드엔진 basic13  (0) 2018.01.20
11.코드엔진 Basic11  (0) 2018.01.19
10.코드엔진 Basic10  (0) 2018.01.18
09.코드엔진 Basic09  (0) 2018.01.18



UPX로 패킹되었는 실행 파일이다...




패킹을 풀어서 디버거로 oep를 보니....



시작부분부터  12bytes가 NOP로 채워져 있는것을 볼 수 있다. 패킹되면서 Stolenbyte가 생긴것인데...



언패킹 과정은 PUSHAD부터 ~~ POPAD 구조를 가진다.

POPAD를 검색해서 브레이크 포인트를 걸고 보니 12바이트의 stolenbyte를 볼 수 있다.

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

13.코드엔진 basic13  (0) 2018.01.20
12.코드엔진 Basic12  (0) 2018.01.19
10.코드엔진 Basic10  (0) 2018.01.18
09.코드엔진 Basic09  (0) 2018.01.18
08.코드엔진 Basic08  (0) 2018.01.18

+ Recent posts