Reversing.kr Position

Reversing/리버싱 문제풀이

2015. 12. 8. 18:29



키젠 문제로 Serial이 76876-77776일때의 name값을 찾아야한다.

끝 글자는 'p'로 힌트가 주어져있다.



serial을 만드는 루틴을 찾아 코드를 다시 짜면 될 거 같은 느낌이 든다.


우선 Correct 부분으로 가면 바로 위에 어떤 함수를 호출하고 리턴값이 1이여야 Correct가 되는 것을 볼 수 있다.

이 함수 안을 살펴보았다.




우선 첫번째 루프가 나타난다.

이 루프에서는 name에 입력한 4글자가 알파벳 소문자인지 확인을 하는 루틴이다.



그리고 다음 루프가 나타난다.

이중 루프로 되어있는 구조이다.

간단히 설명하자면 name의 각각의 글자가 서로 같은글자가 있는지 확인을 하는 루틴이다.



그리고 이후에 본격적으로 name을 이용해 serial을 만드는 루틴이 나온다.

ida를 참고하여 python으로 serial만드는 코드를 짯다.



import string

maps = string.ascii_letters[:26]
name = ""       
input_serial = "76876-77776"    

for i in maps :
	if i == 'p' :
		continue
	for j in maps :
		if i == j or j == 'p' :
			continue
		for k in maps :
			if k == j or k == i or k == 'p' :
				continue
			name = i + j + k + 'p'
			serial = ""
			tmp = ""
			a = ord(name[0])
			v8 = (a & 1) + 5;
			v59 = ((a >> 4) & 1) + 5;
			v53 = ((a >> 1) & 1) + 5;
			v55 = ((a >> 2) & 1) + 5;
			v57 = ((a >> 3) & 1) + 5;

			b = ord(name[1])
			v45 = (b & 1) + 1;
			v51 = ((b >> 4) & 1) + 1;
			v47 = ((b >> 1) & 1) + 1;
			v10 = ((b >> 2) & 1) + 1;
			v49 = ((b >> 3) & 1) + 1;

			tmp = str(v8 + v10)
			v13 = input_serial[0]

			if v13 == tmp :
				serial += tmp
				tmp = str(v57 + v49)
				v15 = input_serial[1]

				if v15 == tmp :
					serial += tmp
					tmp = str(v53 + v51)
					v18 = input_serial[2]

					if v18 == tmp :
						serial += tmp
						tmp = str(v55 + v45)
						v21 = input_serial[3]

						if v21 == tmp :
							serial += tmp
							tmp = str(v59 + v47)
							v24 = input_serial[4]

							if v24 == tmp :
								serial += tmp
								serial += '-'
								c = ord(name[2])   
								v27 = (c & 1) + 5;
								v60 = ((c >> 4) & 1) + 5;
								v54 = ((c >> 1) & 1) + 5;
								v56 = ((c >> 2) & 1) + 5;
								v58 = ((c >> 3) & 1) + 5;

								d = ord(name[3])   
								v46 = (d & 1) + 1;
								v52 = ((d >> 4) & 1) + 1;
								v48 = ((d >> 1) & 1) + 1;
								v29 = ((d >> 2) & 1) + 1;
								v50 = ((d >> 3) & 1) + 1;
								
								tmp = str(v27 + v29)
								v31 = input_serial[6]

								if v31 == tmp :
									serial += tmp
									tmp = str(v58 + v50)
									v34 = input_serial[7]

									if v34 == tmp :
										serial += tmp
										tmp = str(v54 + v52)
										v37 = input_serial[8]

										if v37 == tmp :
											serial += tmp
											tmp = str(v56 + v46)
											v40 = input_serial[9]

											if v40 == tmp :
												serial += tmp
												tmp = str(v60 + v48)
												v43 = input_serial[10]

												if v43 == tmp :
													serial += tmp
													print name
							

						



이렇게 코드를 짠 뒤 돌리면 3개의 값이 나왔다.



제일 첫번째 나온 값으로 인증하니 답이였다.