리버싱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........
게싱과 실험이 난무한 풀이였지만 일단 작성해 보도록 하겠다.
이름에 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"
정리되지 않고 추측과 실험이 난무한 풀이는 양해바랍니다.
문자의 아스키코드 값과 키값을 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"
정리되지 않고 추측과 실험이 난무한 풀이는 양해바랍니다.
댓글
댓글 쓰기