代码逻辑从上至下:
用户输入长度为22的数组v1——随机取0-21的一个数字v7——byte_6B4270[v7]的值赋给v6——
v1[v7]的值赋给v5——验证十次如果v9^v5==v6那么成功。
所以我们求用户输入v1就是求所有的v5的值,因为v9^v5==v6,所以v5==v9^v6
细节说明:
一、byte_6B4270数组的数据查看,在代码处双击来到汇编,如果是这样的,右键选择data进行转换
二、怎么确定v1是用户输入,因为通过i(rbp+var_4)判断了用户输入长度,所以自然而然v1就是用户输入了,伪代码是反汇编出来的不是源码,所以也会有差错,这时候就要使用tab键看看汇编代码什么意思了
三、注意这里对v9强制类型转换为usigned_int8,在python里写解密代码使用0xff即可
写出解密代码:
附代码:
1 byte =[0x5F, 0x0F2, 0x5E, 0x8B, 0x4E, 0x0E,0x0A3, 0x0AA, 0x0C7, 0x93, 0x81, 0x3D, 0x5F, 0x74,0x0A3, 0x9, 0x91, 0x2B, 0x49, 0x28, 0x93, 0x67 ] 2 3 v9=0 4 5 flag=0 6 7 for i in range(0,22): 8 9 v9 = 1828812941 * v9 +12345 10 11 flag=(v9^byte[i])&0xff 12 13 print(chr(int(flag)),end='')