먼저 시리얼 값을 모르기 때문에 이름에만 CodeEngn이라고 쓰고 시리얼 값에는 1111을 입력했다.



cmp 문에서 eax 45b844에 있는 값이 같다면 cracked라고 뜨고 다르다면 try again! 이라고 뜬다


그런데 eax는 내가 입력한 값이라는 것을 알게 되었다. 그러면 45b844에 있는 값을 찾으면 되는데

 


답 나왔다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 17  (0) 2017.01.10
CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10


먼저 upx pack 되어있는 실행파일을 unpack해준다.




아이디에 CodeEngn을 입력하고 시리얼 값에는 12345를 넣어준다.



시리얼이 옳다고 출력되는 부분으로 점프하기 위해서는 eax esi가 같아야 한다.



Eax는 내가 입력한 12345가 있고 esi에는 시리얼값이 들어있다.


왜 정답이 여러 개가 나올수 있는지 모르겠고 brute force공격이 왜 필요한지 모르겠다.


아마도 시리얼을 만들어 내는 루틴이 있을거 같은데 이미 풀었으므로 나중에 할거없을때 분석해봐야겠다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 16  (0) 2017.01.10
CodeEngn Basic 15  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10


먼저 peid로 열어보니 c#으로 만들어진 파일임을 알 수 있다


c#은 디컴파일이 가능하고 디컴파일을 해주는 툴은 reflector이다.



소스를 모두 볼 수 있게 되었고 plainText라는 변수에 저장된 값과 내가 입력한 값을 비교한 뒤에 같으면 정답이라고 출력한다.


코드를 수정해 비교하는 값인 plainText를 출력해 보았다.



답 나왔다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 15  (0) 2017.01.10
CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10


eax에는 입력값이 들어간다


그런데 eax 0x7a2896bf와 비교해서 같다면 congratulation 이라고 출력을 한다


그러면 key값은 0x7a2896bf 십진수로 2049480383이 된다


그리고 key값을 입력한후 메시지 창이 뜰 때 메시지 박스에 키값이 출력이 되도록 하려면 congratulation자리에 키값이 들어가면 될 것이다.



hex editer로 보았을 때 키값 10자리와 마지막에 null문자를 포함해서 0x???~0x???영역에 overwrite하면 된다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 14  (0) 2017.01.10
CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10
CodeEngn Basic 09  (0) 2017.01.10


Popad 이후의 코드를 보면 푸시를 세 번 해주고 그 후에 점프하는 모습을 볼 수 있다.


 stolenbyte는 푸시되는 명령어들의 16진수 값이라 할 수 있고 oep는 점프하는 주소에서 stolenbyte의 크기를 뺀 주소가 oep가 된다.



'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 13  (0) 2017.01.10
CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10
CodeEngn Basic 09  (0) 2017.01.10
CodeEngn Basic 08  (0) 2017.01.10


먼저 peid로 열어보니 aspack이 되어있는 것을 볼 수 있다.



Oep를 찾기 위해서 popad 이후에 점프하는 곳 retn 하는 곳으로 가보면



이상하게 나오지만 코드가 복구가 안되서 그렇다. 55 push ebp 이므로 함수 프롤로그다.



코드실행 부분에 들어왔고 등록성공 이전에 분기점을 보니 jnz 명령어가 있다


Eax 0이 아니면 점프를 해서 등록성공이 뜨지 않는다


답 나왔다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 12  (0) 2017.01.10
CodeEngn Basic 11  (0) 2017.01.10
CodeEngn Basic 09  (0) 2017.01.10
CodeEngn Basic 08  (0) 2017.01.10
CodeEngn Basic 07  (0) 2017.01.10


일단 stolenByte가 뭔지 몰라서 조사를 해보았다.



stolenByte: StolenByte 는 훔친 바이트란 의미로 프로그램의 한부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 말한주로 옮겨지는 코드는 엔트리 포인트위의 몇개의 코드들이며 옮겨진 코드들은 OEP 주소로 점프하기 전에 위치에서 PUSH 된. 이러한 StolenByte 는 주로 패커가 프로그램을 패킹할때 볼수있. 이렇게 옮겨진 코드들은 할당된 메모리 공간에서 실행된. 이때문에 패킹된 프로세스가 덤프될때 StolenByte를 복구하지 못하면 프로그램은 정상적으로 작동하지 못하게 된.




문제를 보면 popad 후에 푸쉬를 세번 하는 것을 볼 수 있다. 푸시되는 명령어를 16진수로 읽으면 인증가능하다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 11  (0) 2017.01.10
CodeEngn Basic 10  (0) 2017.01.10
CodeEngn Basic 08  (0) 2017.01.10
CodeEngn Basic 07  (0) 2017.01.10
CodeEngn Basic 06  (0) 2017.01.10


검색해보니 Popad 명령어를 실행한 후에 점프 뛰는곳의 주소가 oep라고 한다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 10  (0) 2017.01.10
CodeEngn Basic 09  (0) 2017.01.10
CodeEngn Basic 07  (0) 2017.01.10
CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10


GetVolumeInformationA() 함수에 들어가는 2번째 매개변수에 c드라이브 명이 들어간다.


그리고 c드라이브명에서 앞의 4글자가 반복문을 통해서 2씩 증가하는 것을 볼 수 있다


그러므로 c드라이브명이 CodeEngn이라면 무엇으로 바뀌는지 알수있다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 09  (0) 2017.01.10
CodeEngn Basic 08  (0) 2017.01.10
CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10


먼저 oep(original entry point)를 찾겠다. Oep upx방식으로 pack된 파일이 실제로 프로그램에 진입하는 지점을 뜻한다.


올리디버거로 upx 방식으로 압축된 파일을 까보면 popad하고 점프하는 부분이 있다. 그점프하는 부분이 oep.



Oep 00401360 .


이제 압축된 원본파일을 unpack 해야 한다.




pack 된 파일



unpack 된 파일



원본파일과 unpack된 파일을 비교해보면 peviewer로 봤을 때 다른 것을 볼 수 있다


이제 serial번호를 찾아야 하는데 처음에 peviewer로 보니



이렇게 문자열이 박혀있는 것을 볼 수 있다. You got it 이라는 문자열을 출력하면 될 거 같다.



코드를 분석하니 시리얼 번호가 보인다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 08  (0) 2017.01.10
CodeEngn Basic 07  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10

+ Recent posts