PE64位程序,ida打开

scanf函数参数不完整,不下断点运行后正常

v29为我们输入的内容,可知input共有32字节,对input进行了换表的base64编码后判断v13

跟进dword_7FF751136018后发现该操作实在判断cpu的型号以及是否支持SSE指令集等参数

cpuid
当EAX为0调用cpuid时,会返回cpu的种类,Inel的CPU将返回:EBX:756E6547H 'Genu'EDX:49656E69H 'ineI',ECX:6C65746EH 'ntel',EBX,EDX,ECX 将连成"GenuineIntel"。
AMD 的CPU 将返回:EBX:41757468H,EDX:656E7469H,ECX:63414D44H"AuthenticAMD"。
上图显示让EAX=0调用cpuid判断是否为GenuineIntel及Inel的CPU并校验一些值后让EAX为1调用cpuid
返回的EAX的8到11位就表明CPU的种类如Inel 80386,80486等,EDX的第23位:CPU是否支持IA MMX
根据返回值设置dword_7FF751136018判断用SSE还是异或解密数据,故上下效果相同。

进入两个函数进行加密和比较,进入10E0函数发现其在用上述解密后的数据初始化一个加密用到数组,和我们输入值无关,动调拿一下值即可

1E10函数则是类似base64解密函数,有五个相同的操作,只看一个即可,动调看一下下列的值

v3,v5,result全为0

看向do while

v4[v7-1]正指向我们输入的base64的值,故上述在查找在base64码表的位置

接下来是和base64解码操作相似,v3=0,v13=1,故不会进入if语句,v5将永远为0,v3在第五个操作后重新赋值,故v3将一直累加1.

我们可以爆破flag,上述变成
v12=key[(x+index)&0x3f]&0x3f
v14=key[(key[v12+64]&0x3f)+128]
python爆破即可得出答案
encrypt="ksPhS/34MXifj+Ibtjud2Tikj5HkA7iTpbaNELBebOaIm"
key=[0x33, 0x34, 0x2C, 0x36, 0x1D, 0x12, 0x1E, 0x0C, 0x1A, 0x3C,
0x29, 0x10, 0x20, 0x14, 0x3D, 0x3B, 0x19, 0x08, 0x0E, 0x1F,
0x30, 0x05, 0x38, 0x03, 0x11, 0x1B, 0x17, 0x21, 0x2E, 0x04,
0x18, 0x23, 0x2B, 0x02, 0x27, 0x37, 0x1C, 0x24, 0x39, 0x3F,
0x35, 0x2D, 0x26, 0x13, 0x2A, 0x0A, 0x00, 0x07, 0x3E, 0x01,
0x28, 0x2F, 0x32, 0x22, 0x0D, 0x06, 0x25, 0x3A, 0x09, 0x0F,
0x16, 0x0B, 0x15, 0x31, 0x0C, 0x2C, 0x0D, 0x21, 0x22, 0x09,
0x02, 0x39, 0x31, 0x17, 0x1A, 0x33, 0x06, 0x24, 0x10, 0x04,
0x1B, 0x0B, 0x34, 0x12, 0x38, 0x27, 0x0E, 0x20, 0x2B, 0x2E,
0x00, 0x13, 0x3E, 0x3A, 0x05, 0x1E, 0x36, 0x08, 0x32, 0x29,
0x19, 0x23, 0x3D, 0x3B, 0x3C, 0x3F, 0x37, 0x30, 0x18, 0x16,
0x35, 0x25, 0x0A, 0x2D, 0x28, 0x26, 0x15, 0x11, 0x07, 0x1D,
0x2A, 0x0F, 0x1F, 0x14, 0x01, 0x1C, 0x03, 0x2F, 0x13, 0x0D,
0x35, 0x31, 0x07, 0x11, 0x1B, 0x23, 0x0B, 0x0C, 0x10, 0x25,
0x2B, 0x21, 0x33, 0x18, 0x27, 0x29, 0x02, 0x2F, 0x28, 0x30,
0x0E, 0x19, 0x3C, 0x08, 0x34, 0x20, 0x3D, 0x2E, 0x05, 0x15,
0x2C, 0x1C, 0x36, 0x22, 0x1E, 0x24, 0x38, 0x0A, 0x3F, 0x1A,
0x04, 0x26, 0x16, 0x2A, 0x3A, 0x1F, 0x2D, 0x32, 0x06, 0x37,
0x03, 0x3B, 0x00, 0x17, 0x1D, 0x12, 0x09, 0x01, 0x3E, 0x39,
0x0F, 0x14]
table="XiIzDuAoGlaK6JcjM3g/9YQmHBOsxn1hLZ4w7Tt0PV5pNqUFC+rE2dSfyvWe8kRb"
for x in range(45):
for y in table:
index=table.find(y)
v12=key[(x+index)&0x3f]&0x3f
v14=key[(key[v12+64]&0x3f)+128]
if table[v14]==encrypt[x]:
print(y,end="")
break

Comments NOTHING