Find the Name when the Serial is 5B134977135E7D13
저 시리얼에 통과하는 name을 찾으면 통과하는 문제이다.
대충 둘러보고자 F8로 하나하나씩 봤는데
저 00401000함수에서 거의 모든 기능을 담당하는 듯 했다. 엔터로 들어가보면 뭐 여러 명령어들과 string 이 나온다.
함수안에 bp를 걸고 하나하나씩 알아보았다.
대충 4011B9함수에서 input name 문자를 프린트하고 4011a2함수에서 scanf로 name을 받는듯 했다. 밑에 시리얼 넘버도 똑같이 작동했다.
가장 중요한 부분은 그 중간에 있는 부분들이다. name에 따라 통과되는 시리얼이 다르니 name으로 시리얼을 만들 것이다.
요 부분이 시리얼을 만드는 곳인 거 같은데 이것만 봐서는 잘 몰라서 저 401150함수에 bp를 걸고 작동시켜봤다.
그리고 401150함수 호출 전에 ECX에 ESP+7C 값을 넣어주는데 ESP+7C위치의 값을 dump로 따라가봤더니
시리얼 넘버같은 숫자들을 하나씩 넣어주고 있었다. 다시 확인하기 위해 처음부터 다시 디버깅 해줬다.
name을 hello로 해주고 디버깅을 해줬는데 401150은 시리얼 넘버를 넣는 함수같고 40107E와 401083의 MOVSX를 자세히 보면은 ecx와 edx에다가 값을 또 넣어주고 있다 그래서 이 값을 디버깅하면서 살펴봤다.
반복문이 세번째 돌았던 지점인데 ECX엔 30, EDX엔 6C가 들어가고 다음 xor연산 후에 xor연산 값이 401150함수 호출 후 esp+7c의 시리얼넘버들값 뒤에 들어갔다. 대충 디버깅 몇번을 더하다보니 깨달았던 점은 ECX에 10,20,30이 들어가고 EDX엔 내가 넣었던 hello문자열의 문자가 하나하나씩 들어가 xor연산을 해준 다음 이 값이 시리얼 넘버에 들어간다는 점이다.
간단하게 정리해보자면
1. ECX에 0x10,0x20,0x30이 하나하나씩 차례대로 들어감
2. EDX에 name의 처음 문자부터 하나하나씩 들어감 (h다음e다음l,l,o...)
3. 이 둘이 xor연산한 값이 시리얼 넘버가 됨
10,20,30은
위의 401038 ~ 401042의 10,20,30이 들어간 것이다.
하여튼, 결국 문제에서 원하던 시리얼 값이 5B134977135E7D13이니
10 xor xx = 5B
20 xor xx = 13
30 xor xx = 49
10 xor xx = 77
20 xor xx = 13
30 xor xx = 5E
10 xor xx = 7D
20 xor xx = 13
이걸 계산해주면 name을 알 수 있을 것이다.
또 xor연산의 특성상 A^X^X = A 이렇게 원래되로 값이 돌아오므로
1020301020301020 ^ xxxxxxxxxxxxxxx = 5B134977135E7D13에서 양변에 1020301020301020을 xor 하여
xxxxxxxxxxxxxxx = 5B134977135E7D13 ^ 1020301020301020 이런 식이 성립하게 된다.
결국 5B134977135E7D13 ^ 1020301020301020 연산 후, ascii 값으로 변환해주면 K3yg3nm3 값이 나오게 된다.
정답은 K3yg3nm3!!
또 원래 ollydbg로 풀다가 모르겠어서 ida로 뻘짓한것도 있는데
이건 위의 시리얼 넘버 만드는 함수를 ida로 디어셈블 한것이다. 대충 vsc에 c++로 옮겨보면
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int main(void){
char v8[100];
char buffer[197];
char v7[2];
cin >> v8;
memcpy(v7, " 0",sizeof(v7));
int v3 = 0;
for(int i=0; v3 < strlen(v8); ++i){
if(i>=3){
i=0;
}
sprintf(buffer, "%s%02X",buffer,v8[v3++]^v7[i-1]);
}
cout << buffer;
}
이거긴 한데 뭐 해석이 잘 안되고 헷갈려서 바로 버렸었다.
풀고 난 후 다시 보니 i가 3보다 클때 0으로 초기화하고 v8과 v7을 xor연산한걸 보면은 v7에 10,20,30이 들어가고 v8에 내가 넣었떤 문자 하나하나씩 들어가 xor연산한다는걸 간단하게 알 수 있다.
근데 처음에 memcpy 함수도 처음보고 v7에 뭐가들어가는질 이해가 안돼서;; 잘 못풀었던것 같다.
다시보니 ida로 풀면 더 빨리 풀었을 것 같았다.
'Reversing > Reversing.kr' 카테고리의 다른 글
Reversing.kr Replace 풀이 (0) | 2024.02.01 |
---|---|
Reversing.kr Music Player 풀이 (0) | 2024.01.19 |
Reversing.kr Easy unpack 풀이 (0) | 2024.01.14 |