[鹏城杯 2022]rota

最后更新于 2024-09-23 697 字 预计阅读时间: 3 分钟


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
此作者没有提供个人介绍。
最后更新于 2024-09-23