[crackme]026-KeygenMe
无壳
爆破
0x40133C地址处是一个关键跳,在这里直接nop就可以完成爆破
算法
在上图中,可以发现一个关键循环,里面就是加密算法:
用python实现:
username = "sword"
flag = 0
for u in username:t1 = ord(u) * ord(u)t2 = ((ord(u) >> 1) + 3) * ord(u) - ord(u)flag += t1 + t2flag <<= 1print(hex(flag))
h = hex(flag)[2:]
print(type(h))
byte_chars = bytes.fromhex(h)
text = byte_chars.decode('ascii')
print(byte_chars)
计算的最终结果要和输入的字符的 ASCII 码值相等,并且是按照小端序。
我是没找到可以输入的序列号,谁有时间去暴力跑一下吧:
import string
import randomdef rand_printable(start_len: int = 5):pool = string.printable[:-6] # 去掉 '\t\n\r\x0b\x0c\x0e'n = start_lenwhile True:yield ''.join(random.choices(pool, k=n))n += 1 # 长度逐次 +1,想跳步可改def fitzero(num_str):length = len(num_str)if length % 2 == 0:return num_strelse:return '0' + num_str
# 拿 10 个看看
g = rand_printable(6)
# for _ in range(10):
# print(next(g))for username in g:
# username = "wanao"flag = 0for u in username:t1 = ord(u) * ord(u)t2 = ((ord(u) >> 1) + 3) * ord(u) - ord(u)flag += t1 + t2flag <<= 1h = hex(flag)[2:]# print(h)length = len(h)if length % 2 == 0:byte_chars = bytes.fromhex(h)else:continue# print(byte_chars)p = 0for b in byte_chars:# Characters cannot be printedif b < 33 or b > 126:p = 0breakelse:p = 1if p == 1:text = byte_chars.decode('ascii')print(f'username:{username}, serial:{byte_chars}')