reversing.kr 2번 Easy KeygenMe. 압축을 풀면 Easy Keygen.exe와 ReadMe.txt가 들어있다.
실행파일에서는 위처럼 Input Name, Input Serial을 입력받고 아마 비교?해서 Wrong/Correct이라는 메시지를 출력한다
txt에서는 문제를 주고 있다. 시리얼 넘버가 5B134977135E7D13일 때 네임을 찾으라는 것.
일단 PEiD로 패킹 안된 파일이라는 것 먼저 확인하고
올리디버거로 문자열을 추출해봤다.
일단 잘 모르겠어서 Input Name에 "mango"를 입력하고 처음부터 실행하면서 레지스터 값을 관찰해봤다.
시리얼 넘버를 입력하기 전 004010C8 주소에서 함수를 호출하니 EDI에 "7D415E774F"가 들어갔다.
아직 잘 모르겠으니 Correct와 Wrong을 출력하는 부분을 보자
00401118에서 JNZ 명령어로 분기문이 나타나고, ZF가 1일 때 Wrong을 출력한다.
그럼 저 JNZ 윗 부분에서 입력값을 비교하거나 판단하는 무언가가 있을 것이다..
더 올라가다 보면 "Input Name: "이라는 문자열을 스택에 푸시하는 코드가 보인다.
00401047에서 함수를 실행하며 "Input Name: "이 출력되었다.
00401054에서는 "%s"라는 아스키 문자가 보이는데 그 밑 함수에서 %s에 "mango"를 입력받았다.
여기 보이는 이 부분을 통해서는
이렇게 왠지 모르게 의미있어 보이는 10, 20, 30을 저장해둔다.
이번엔 Serial 부분인데 Name과 같은 순서로 입력받았다.
자 이제 다시 앞 앞 Name 전체 코드로 돌아가서
이 코드까지, REPNE SCAS 전까지의 레지스터 값들을 보면
EDI에 입력한 "mango"가 들어갔고 ECX는 -1이 되었다.
그리고 REPNE SCAS,
mango의 첫글자 m이 사라지고, ECX는 FFFFFFFF에서 FFFFFFFE로 바뀌었다.
그리고 f7을 계속 눌러보니 ango -> ngo -> go로 EDI값이 변했다.
결과적으로 ECX는 0xFFFFFFFF에서 0xFFFFFFFA로, EDI는 0x0019FE09에서 0x0019FE0D로 변했다.
ECX는 줄이고 EDI를 늘려가며 "mango"가 총 5글자라는 것을 확인한 것이다.
이를 통해 글자 수는 이렇게 안다는 걸 발견했고... 다시 처음으로 돌아가자..
00401077부터 004010B4까지는 for문을 돌았다..
먼저 이 부분,
ESI와 3을 비교하여 ESI가 더 작으면 0040107E 코드를 실행한다.
이 때 ESI는 0이다(반복문을 3번 돌린다는 것을 알 수 있다). 따라서 그대로 진행한다.
ECX 값이 0x00000005에서 0x00000010이 되었다.
EDX는 0x0000006D
XOR 연산 후 ECX는 0x7D가 되었다.
7D...! "7D415E774F"의 앞 두글자! 뭔가 윤곽이 잡힌다.
그 뒤 몇 가지 연산 후, 아래 코드로 인해
EDI는 "mango"가, ECX는 -1이 되었다.
앞에서 언급한 순서를 그대로 반복하는 것 같다.
이 5글자에 대하여 무언가 같은 작업을 반복하라는 뜻이다.
아래 코드는 for문의 마지막 부분, EBP와 ECX를 비교해 EBP가 작으면 00401077로 간다.
00401077은 당연하게도 for문이 시작하는 부분이다.
이 때 레지스터 값은 아래와 같다.
ECX는 5(5글자이므로 5번 반복해야 한다는 뜻), ESI는 1(그 중 가장 첫 글자에 대해 작업을 마쳤다는 뜻)이다.
이제 두번째를 돌아야 할 차례이다.
두번째로 도는 코드는 아래와 같다.
한 번 돌았으니, ESI는 1이다.
ESI가 0 - 1 - 2가 될 때까지, 즉 비교하는 숫자 '3'번을 돈다.
이와 관련된 것은 JL로 넘어가는 코드, 0040107E이다.
값을 먼저 보자면, ECX가 20이 되었다.
ECX를 가져오는 코드를 보자. 값이 10 - 20 - 30 - 10을 반복하는 것 같고 이번에는 20이 되었다.
위 코드로 EDX는 0x61이 되었다. (61은 'a'의 헥스값^^) 즉 내가 입력한 글자의 아스키코드를 가져온다는 뜻이다.
XOR 연산을 통해 ECX는 최종적으로...!
0x41! 다행히 '7D41...'으로 알맞은 값이 들어가는 순간을 잘 잡았다 흑ㄱㅎㄱ ㅠㅍ
이제까지 "mango" 두번째 글자까지의 작업을 살펴보았다.
그 '작업'이라는 것을 정리해보면,
첫 번째 글자부터, 글자 자리 별로 0x10 - 0x20 - 0x30과 XOR한다.
예를 들어 입력값(Name)이 "mango"라면 "m"과 0x10을 XOR하고 "a"와 0x20을 XOR한다.
마지막 글자인 "o"까지 진행하여 그 결과값을 합한 것 = Serial이다.
이제 알고리즘을 알았으니 문제를 풀어보자: Serial이 5B134977135E7D13일 때 Name은?
A XOR B = C라면, B XOR C = A이다.
5B 13 49 77 13 5E 7D 13 => 4B 33 79 67 33 6E 6D 33 =>K 3 y g 3 n m 3
'Wargame > reversing.kr' 카테고리의 다른 글
Music Player (150) (0) | 2020.05.31 |
---|---|
Easy Unpack (100) (0) | 2020.05.31 |
Easy Crack (100) (1) | 2020.04.02 |