[CodeEngn]Advance 08 문제 풀이과정
CodeEngn 사이트
CodeEngn.com [코드엔진]
코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.
ch.codeengn.com
위 사이트에서 Advance 08번 문제를 다운로드 받습니다. 그 후 압축 푸시면 비밀번호입력이 나오게 됩니다. 비번은 'CodeEngn'입니다.
Advance 8번 문제
Key 값이 5D88-53B4-52A87D27-1D0D-5B09 일때 Name은 무엇인가
힌트 : Name은 두자리인데.. 알파벳일수도 있고 숫자일수도 있고.. 정답인증은 Name의 MD5 해쉬값(대문자) 입니다.
Advance 8번 문제풀이
A8.exe를 실행시키면 아래 그림과 같이 실행이 됩니다.
A08.exe파일에 Name은 KeyGenme, Key는 5D88-053B4-052A87D27-01D0D-05B09를 작성해서 check it 버튼을 눌러보았습니다. 하지만 아무 반응 없는 것이 없어서 x32dbg에 올려 ‘F8’로 실행하였습니다.. [00x045C76E ‘call a08.458A70’]에서 MessageBox가 출력되었다.
‘F8’로 한 번 훑어봤을 때, 별 다른 힌트가 없어 Name부분을 더 짧은 길이의 문자열을 넣어보았습니다. aa를 넣었을 때
‘Please Enter More Chars...“이라는 문자열이 나왔습니다
마땅한 힌트가 없어 문자열 참조를 하여 위에 나오는 메세지박스의 문자열을 검색하였습니다.
해당 문자열 검색으로 해당 문자열이 나오는 코드 부분에 BP를 걸어놓았습니다.
BP를 걸어놓는 이유는 사용자가 입력한 Name과 A08.exe에서의 실제 Name과 비교하는 부분도 이 예외처리 이후에 있을 거라 생각했기 때문입니다.
그래서 이 부분을 BP걸고 다시 긴 문자열을 가진 Name을 입력하여 어셈블리 코드를 훑어보았습니다. ‘0x0045BB1B’에 BP를 걸어놓고 문자열을 “aaaaa”를 입력하니 EIP는 BP를 걸어놨던 부분으로 이동하였습니다.
처음에는 Name의 문자열의 길이를 비교하고, 3이이상 1E 이하의 문자열만 가능하도록 열외 처리를 하였습니다. 1E는 10진수로 30을 의미한다.
또한 ‘F8’과 ‘F7’로 확인해본 결과 각각 확인할 수 있었습니다.
이 방법으론 Name을 통해 Key의 값을 연산하는 코드로 key에서 Name의 값을 알기란 꽤나 힘들었다. 그래서 코드에 나온 연산과정을 통하여 코드로 작성하는게 더 시간 절약이 됩니당.
[그림 A08-09]과 [그림 A08-10]으로 Serial 값이 되는 것을 알 수 있었습니다.
첫 번째 [그림 A08-09]은 Name을 이용하여 값을 만들고,
두 번째 [그림 A08-010]으로 시리얼의 4자리 값이 만들어지는 것도 덩달아 알 수 있었습니다.
이것으로 입력 값의 첫 번째 자리 수와 두 번 째 자리 수를 알 수 있다.
[그림 A08-9]과 [그림 A08-010]을 바탕으로 코드를 작성하여 확인하였다

c언어로 코딩된 것을 컴파일 하여 나온 값에서 ‘5D88’을 찾는다. 찾게되면 ‘43 36’에서 ‘5D88’이 있습니다. 43 36의 숫자를 각각 16진수로 변경하니 C6 이 나왔습니다.
이제 다시 a08.exe를 실행하여 Name : C6, Key : 5D88-053B4-052A87D27-01D0D-05B09 를 작성하여 check it을 하였습니다.
아까 전에 3글자 이상 30글자 이하로 예외처리했던 부분을 가서 [0x0045BB24 ‘ cmp eax,3’]에서 ‘cmp eax,3’을 ‘cmp eax,2’로 변경합니당
변경하여 다시 한 번 Name과 Key를 입력하니 “well done”이라는 성공메세지 박스가 출력되었다.
하지만, Name을 해쉬하라는 문제의도가 있었기 때문에 MD5로 해쉬합니다.
따라서 name의 두자리는 c6이고, MD5 해쉬값은 ‘A93DA5D3C71C7ED895183A7AD5DD3A19’ 입니다