리버싱kr easy_Keygen 풀이 2

이전까지 이름을 넣었을 때 이름을 넣은 것을 어떤 루틴을 통해 시리얼 값으로 변해 메모리에 저장되고, 그 값과 시리얼을 정확히 맞추면 풀린다는 것을 깨달았다.

게싱과 실험이 난무한 풀이였지만 일단 작성해 보도록 하겠다.

이름에 1234를 넣었을 때의 시리얼 값은 21120324였다. 어떠한 규칙이 있을 지 일단 이름을 1111을 넣고 다시 실행시켜 보자.

시리얼까지 입력받고 난 뒤의 실행문이다. 시리얼이 저장되는 위치는 따로 바뀌지 않았으며, esp + 74의 위치를 덤프창을 통해 본 결과
0019FE7C  32 31 31 31 30 31 32 31 00 00 00 00 00 00 00 00  21110121........

시리얼  값은 "21110121"인 것을 볼 수 있다. 아직 어떠한 규칙인지 잘 모르겠을 수 있다.
1111을 넣고 다시 실행하여 시리얼을 입력받기 전, 반복문을 한 번 돌려보았다.
시리얼 값이 들어가는 주소에 32 31, 즉 "21"이 들어가 있는 모습을 볼 수 있다.

단순 추측으로 한 문자당 두 문자로 바뀐다면, 시리얼의 길이는 문자열의 길이 * 2일 것이다.

루틴 부분을 좀 크게 봐보자.
ecx와 edx를 사용해 시리얼을 만드는 연산을 하는 것 같고, 반복문에서 문자열의 위치 인덱스를 증가시키는 것을 esi와 esp를 사용하는 것으로 보인다.

그리고 xor연산을 통해 ecx, edx를 xor을 하고 ecx의 값을 스택에 넣은 뒤 어떤 함수를 호출한다.
ecx가 가진 카운터와 ebp를 비교해 jl인 동안 반복문을 실행한다.

레지스터 창을 보면 ebp의 값은 1인 것을 볼 수 있다.
ebp의 원래 값을 백업해 두고 카운터로 사용하는 것을 볼 수 있다.

추측으로, '1'을 반복문을 한 번 거치고 나서 '21'이 되었다고 하자.
1을 어떻게 연산해서 연산 결과를 그대로 두 바이트로 쪼개서 저장한 것일수도 있고, 연산 결과를 1 앞에 붙인 것일수도 있다.

이쯤에서 시리얼을 앞의 추측대로 두 문자들로 쪼개보았다
"21" 11" "01" "21"로 쪼개 보니 값이 일정하게 바뀌는 것을 볼 수 있었다.

일정한 값을 두고 반복해서 그 키와 연산해 바뀌는 거라면, 저장된 키 값을 찾을 수 있어야 할텐데 마침 이름을 입력하고 난 뒤의 어셈 창에서 찾을 수 있었다.
총 세 줄이 보이는데, 안그래도 esp레지스터가 위의 루틴에서 시리얼을 바꾸는데 중요한 역할을 한 것으로 보아 10, 20, 30값은 중요한 값으로 보인다.

루틴은 문자 '1'을 '21'로 만들었다. 그 루틴에서 중요해 보이는 xor연산이 있었다.
문자의 아스키코드 값과 키값을 xor한 값이 '21'이 아닐까?하는 생각에 xor계산을 해 보았다.
1의 아스키코드 값인 31을 그대로 xor을 한 값을 출력해보니 21, 11, 1이 나왔다.
연관성을 찾아낸 것 같다.
문자와 키값을 xor한 값을 시리얼로 가져다 쓰는것 같다.
키는 총 10, 20, 30 3개인데, 세 번째 문자열 다음엔 다시 키 10을 사용하는 것 같다.

xor을 실행하기 전 창으로도 10과 31을 xor하는 것을 볼 수 있다.

루틴을 세세하게 분석하진 않았지만 추측으로 이루어진 루틴풀이를 빠르게 정리해보았다.

1. 입력한 이름을 가지고 시리얼을 만든다.
시리얼은 키값과 xor연산을 통해 만든다.

2. xor연산을 통해 만들어진 시리얼은 ebp + 74의 위치에 저장된다.

3. xor연산은 xor암호화 기법을 생각해보면 a xor b = c, c를 다시 b와 xor하면 a가 나온다.

4. 키 값은 10, 20, 30의 순서 그대로 사용하고 그 다음 키는 다시 10부터 사용한다.

게싱을 통해 xor연산을 한다는 것을 알게 되었으니 코딩을 통해 이름을 유추해 보려고 한다.
간단히 코딩해보았다. 코딩을 잘 하는것 같지는 않지만 대충 했다.


"K3yg3nm3"이라는 문자열이 나왔다. 한번 맞춰 보겠다.

맞는 것을 볼 수 있다.

auth flag는 "K3yg3nm3"

정리되지 않고 추측과 실험이 난무한 풀이는 양해바랍니다.

댓글

이 블로그의 인기 게시물

scanf와 scanf_s

레나 리버싱 Tut.ReverseMe1 풀이 1

리버싱 연습