zj3t

email: euntaejang@gmail.com

Latest Posts

CodeEngn-Basic.20

By 오후 9:31 ,

20.exe 프로그램을 시작했을 때의 실행 창!!!

문제:




key파일을 필요로 하는 프로그램이라는 점에서 crackme3.key파일을 생성해서 20.exe를 실행하여야 한다.


Readfile 함수가 0x12 즉 18byte의 key파일을 읽어 온다. 따라서 key파일안의 데이터는 18byte가 되어야한다.



key파일에는 a가 18개 즉 18byte 만큼 들어있는데 call문 전후로 key값이 바뀌는 것을 확인!

call문 안으로 들어가보니 key값을 xor연산으로 바꾸는 loop문을 확인 할 수가 있었다.
설명은 ollydbg옆에 주석을 참고하면 된다.



004029F9에는 key값을 xor연산으로 바꾸는 loop문에서 byte단위로 key값을 바꾼뒤 그것을 ADD로 더한 값을 가지고 있는 주소공간이다.
이를 12345678과 XOR연산한다.

밑을 보면 위에서 12345678과 XOR한 값이 aaaa와 같아야한다. 이 aaaa는 18byte의 키값에서 아까 14byte만큼을 XOR연산했는데 나머지 4Byte의 값이다. 여기서 cmp로 비교한뒤 SETE명령에 따라 또다른 창을 띄울지 결정하게 된다. 즉 cmp명령이 서로 같아 ZF=1이 되어야한다. 만약 다르다면 또다른 문구를 띄울 수가 없다. 
(SETE: ZF가 1이라면 바이트형 레지스터를 1로 세팅하는 어셈블리 명령어이다.!!!!!!!!!!!!!!!!!!!)
a를 18byte만큼 입력한 경우엔 Cmp에 따라 ZF가 1이 될 수 없기 때문에 의도적으로 바꿔서 실행 해보겠다!!!

위에서 말한 또다른 창이 바로 이것이다. 


아까 키값이 XOR연산으로 바뀐 값 14BYTE만큼이 위에 문구에 들어가게 되는데, 마지막 !표는 기본으로 세팅되어있는 것을 확인할 수가 있다. 여기서 우리는 CodeEngn을 출력해야 한다.

아까 키값을 바꾸는 loop은 41 즉 A부터 N까지 1byte씩 키값과 xor 연산을 하고 O가 되면 루프문을 탈출한다. 그럼 여기서 생각해 볼것이 있다. 위에 출력되는 문구는 14byte 즉 xor연산한 14바이트 만큼이 입력된다. 하지만 우리가 띄울 창은 CodeEngn이라는 문구여야 한다. 그럼 8byte는 xor연산을 통해 CodeEngn을 만들고 나머지 6byte는 xor한 값이 0이 되게 해서 아무것도 입력되지 않게 해야한다.

이를 C언어로 구현해보면!!!
 


02 2D 27 21 00  28  20  26 49 4A 4B 4C 4D 4E 의 값을 찾을 수가 있다.
여기까지 14byte의 값을 구했다. 나머지 4byte는 위에 SETE명령을 위해서 쓰인다.
나머지 4byte 값만 찾으면 이 문제를 풀 수 있다.

hex값을 xor 연산후 CodeEngn이 되도록 바꾸어 주었다. 이제 나머지 4byte를 찾을 수 있다


DS:[004020F9]=1234557B
EAX=61616161
이 서로 같아야 한다 61616161은 aaaa로써 비교하지 않은 마지막 4Byte이다. 따라서 이 4byte가 7B 55 34 12가 되어야 한다. (리틀엔디안때문에 이런식으로 값을 써야한다.)

따라서 갑은 02 2D 27 21 00  28  20  26 49 4A 4B 4C 4D 4E 7B 55 34 12 이다.


끝!!!!











You Might Also Like

0 개의 댓글