문제는 특정 시리얼 일 때, Name을 원하고 있다.
Die로 열어본다.
특이 사항은 보이지 않는다.
프로그램을 실행시켜본다.
친절하게 Name과 Key를 알려주고 있고, 문제에서는 여기를 말하는 것 같다.
하지만 문제에서는 Name이 2글자라고 했으나, 2글자를 입력하면 Key에 특정 문자열이 들어가는 것을 보니 우회를 해주어야 할 거 같다.
디버거로 열어본다.
문자열 찾기로 비교하는 구문을 찾았다. 문자열의 길이가 3자리 보다 크지 않으면 특정 문자열을 출력했다.
cmp eax, 3 -> cmp eax, 1로 바꾸어주고 패치하여 새로운 exe로 저장한다.
2자리 문자열 AB와 임의의 키 12345를 입력하고 디버깅을 시작해본다.
확인해보니, Name의 길이가 30이상 이라면 또 텍스트가 출력되는 구문이 있었다.
총 2단계의 검증을 거치고 난 뒤에 오는 구문이 비교하는 구문이 시작되는 부분일 것이다.
검증 바로 다음에 브레이크 포인트를 걸고 디버깅을 해본다.
아래로 내려가보니 성공을 출력하는 구문이 있었고, Key로 보이는 특정 문자열이 보였다.
이것을 실제 프로그램에 대입시켜보면,
실제로 맞다는 것을 알 수 있었다.
확인 해보니, 45B850 함수를 호출하고 나면, Name에 따라 Key가 생성되는 것을 확인 할 수 있었다.
이 함수를 뜯어본다면, Key를 가지고 Name을 얻는 역연산 코드를 알 수 있을 것이다.
확인해본다.
함수에 들어오면 첫번째로 만나는 연산 구문이다.
2자리의 Name을 한자리씩 연산하는 구문이다.
이것을 C코드로 구현해놓고 확인해보면,
Key의 첫번째 값(AAC1)이 포함되어 있는 것을 알 수 있다.
이것만으로도 Name을 구할 수 있겠지만 아래 구문을 봐버려서 아래 구문도 해석해보겠다.
두번째로 만나게 되는 연산 구문이다.
이것 또한 C코드로 구현하고 확인해보면,
Key의 두번째 값(597A)이 포함되어 있는 것을 알 수 있다.
이 2가지 조건을 바탕으로 역연산 코드를 작성해보겠다.
#include <iostream>
unsigned int first(int val[]){
int esi, edx = 0;
for (int i = 0; i < 2; i++) {
esi = val[i];
esi = esi + edx;
esi = esi * 0x772;
edx = esi;
edx = edx * esi;
esi = esi + edx;
esi = esi | esi;
esi = esi * 0x474;
esi = esi + esi;
edx = esi;
}
return (edx & 0xffff0000) >> 16;
}
unsigned int second(int val[]){
int edx = 0;
int ebp = 0;
for (int i = 1; i >= 0; i--) {
edx = val[i] + 0x11;
edx = edx - 5;
edx = edx * 0x92;
edx = edx + edx;
edx = edx * 0x819;
ebp = ebp + edx;
}
return (ebp & 0xfffff000) >> 12;
}
int main() {
for (int i = 33; i < 134; ++i) {
for (int j = 33; j < 134; ++j) {
int value[2] = {i, j};
unsigned int a = first(value);
unsigned int b = second(value);
if(a == 0x5D88 && b == 0x53B4){
std::cout << char(i) << char(j) << std::endl;
}
}
}
return 0;
}
원하는 Name을 얻었고 이것을 MD5로 바꾸어주고 인증해주면...
성공!
'Reversing 문제 풀이 > CodeEngn.com_Advance' 카테고리의 다른 글
codeengn-advance-L09 풀이 (0) | 2022.05.16 |
---|---|
codeengn-advance-L07 풀이 (0) | 2022.05.11 |
codeengn-advance-L06 풀이 (2) | 2022.05.09 |
codeengn-advance-L05 풀이 (0) | 2022.05.06 |
codeengn-advance-L04 풀이 (0) | 2022.05.04 |
최근댓글