프로그램 실행

값을 입력하고 Check 버튼을 누르면 에러가 감지되었다고 뜬다.

 

About 버튼을 누르면 어떤 프로그램인지 설명해주는 것 같다.


리버싱 시작

 

문자열 검색을 통해 에러 메시지를 검색하여 이동한다.

0x401336에 비교 명령어 cmp esi, dowrd ptr ds:[403138]이 있고, 0x133c에는 점프 명령어 jne keygenme.401353이 있다. 이 두 명령어를 보면 esi와 0x403138에 있는 값이 다르면 에러 메시지를 출력하는 것을 알 수 있다.

0x403138 값
esi 값

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개만 되어도 시간이 많이 걸릴 것이다.

 

문자별 대응되는 시리얼 값이다. 시리얼 값을 좀더 가공하면 편하게 알아볼 수 있게 할 수 있었지만 귀찮아서 여기까지만 했다. 시리얼 값을 입력할 때 거꾸로 입력해 주어야 한다. 문자열을 비교하는 거라면 그대로 입력해도 되지만 값을 비교하는거라 리틀엔디언방식 덕분에 거꾸로 값을 읽기 때문이다.

 


결과

위 값들 중 아무거나 입력해 보면 맞다고 메시지가 뜬다.

+ Recent posts