프로그램 실행
값을 입력하고 Check 버튼을 누르면 에러가 감지되었다고 뜬다.
About 버튼을 누르면 어떤 프로그램인지 설명해주는 것 같다.
리버싱 시작
문자열 검색을 통해 에러 메시지를 검색하여 이동한다.
0x401336에 비교 명령어 cmp esi, dowrd ptr ds:[403138]이 있고, 0x133c에는 점프 명령어 jne keygenme.401353이 있다. 이 두 명령어를 보면 esi와 0x403138에 있는 값이 다르면 에러 메시지를 출력하는 것을 알 수 있다.
0x403138의 값을 보면 두 번째로 입력한 값이 이 곳에 저장된다 라는 것을 알 수 있다. 이제 두 번째 값을 잘 넣어서 esi와 값을 맞추면 된다. 하지만 아스키코드만으로 표현할 수 없는 값이였다.
코드 위쪽을 보면 esi값을 0으로 초기화한 다음 값을 만들어 주는 코드가 있다.
위 코드를 파이썬 코드로 바꿔보았다.
str="test"
result = 0
for i in str:
n = ord(i)
temp1 = n * n
temp2 = (((n>>1) + 3) * n) - n
temp = temp1 + temp2
result += temp
result *= 2
print(hex(result))
프로그램 실행 결과값 역시 esi와 동일하게 나오는 것을 확인 했다. 그러면 시리얼 값을 만드는 알고리즘을 알았으니 약간의 코딩으로 이름마다 대응되는 시리얼을 출력해 주는 프로그램을 짜주면 된다.
str = [32]
t = 0
def function(n):
temp1 = n * n
temp2 = (((n >> 1) + 3) * n) - n
temp = temp1 + temp2
return temp
for x in range(95**len(str)):
for i in str:
t += function(i)
t += t
v = hex(t)
v = v[2:]
if len(v)%2 == 0 and v[0] >= '2' and v[0] <= '7' and v[2] >= '2' and v[2] <= '7':
for i in str:
print(chr(i), end = "")
print(" : ", v)
t = 0
str[0] += 1
비록 문자 하나만 입력했을 때의 시리얼값을 확인하는 코드이지만 여기서 조금 더 수정해주면 더 긴 문자열도 검사해 볼 수 있다. 하지만 brute force 기법으로 한거라 문자열 길이가 4개만 되어도 시간이 많이 걸릴 것이다.
문자별 대응되는 시리얼 값이다. 시리얼 값을 좀더 가공하면 편하게 알아볼 수 있게 할 수 있었지만 귀찮아서 여기까지만 했다. 시리얼 값을 입력할 때 거꾸로 입력해 주어야 한다. 문자열을 비교하는 거라면 그대로 입력해도 되지만 값을 비교하는거라 리틀엔디언방식 덕분에 거꾸로 값을 읽기 때문이다.
결과
위 값들 중 아무거나 입력해 보면 맞다고 메시지가 뜬다.