Name이 CodeEngn 일때 Serial을 구하시오
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요)
Ex) 11111
Name이 CodeEngn일 때 Serial이 일정한 패턴에 의해 생성되는 듯해 보인다.
UPX 패킹이 되어있다.
OEP -> 0x401000이니 가볍게 Unpacking을 해주자
dword_403038 에 Name이 들어가고 byte_403138에 serial이 들어간다.
그 후 name에 따라 V5가 정해지고 sub_401383을 통해 입력한 serial이 일련의 연산작업을 거쳐 V5랑 같으면 성공 메시지를 보여준다.
입력한 serial의 길이만큼 반복문 시행
각 문자마다 -48 후 (문자열의 길이-1)만큼 x10을 반복한 후 그 값을 모두 더함
그 더한 값이 0x129A1이 되야함
문제에서 5자리 숫자를 brute force 공격을 통해 알아내야 한다고 했으니
0~99999까지의 문자열을 모두 시도하면된다.
answer = 0x129A1
answer_list = []
for i in range(0,100000):
serial = str(i).zfill(5)
v1 = 0
for idx, c in enumerate(serial):
v5 = (ord(c) - 48)
for j in range(5-idx-1):
v5 *= 10
v1 += v5
if v1 == answer:
print(serial)
answer_list.append(serial)
print(answer_list)
그러면 딱 한가지 숫자가 나오는데 바로 76193이 된다.