image-20220909152950814

静态分析挺复杂的,用动态调试

但还是能猜测一些东西

  • 长度 32 位
  • 定位点 "SWPU_2019_CTF"

    image-20220909153331793

顺利找到输入函数, 在 0x00128A1 处有判读字符长度是否为 32

找到输入的数据,然后右键建一个内存读取断点,然后直接 F9

image-20220909154301187

来到这个循环

image-20220909154625051

将 "SWPU_2019_CTF" 依次取出,与输入的数字进行异或 操作

写到这的时候虚拟机突然崩了几次,前四位内存有变化,但不影响后四位

继续向下找,这里给数据换了一下位置

image-20220909155852473

给新位置打断点,继续 F9 向下看

image-20220909155944402

又进入了一个循环,和另外一组数据进行了异或

image-20220909160122484

数据如下

[0x86, 0x0C, 0x3E, 0xCA, 0x98, 0xD7, 0xAE, 0x19, 0xE2, 0x77, 0x6B, 0xA6, 0x6A, 0xA1, 0x77, 0xB0,0x69, 0x91, 0x37, 0x05, 0x7A, 0xF9, 0x7B, 0x30, 0x43, 0x5A, 0x4B, 0x10, 0x86, 0x7D, 0xD4, 0x28]

需要注意的是:eax 的值在 0x000127DA 处已经被加上了 0x4 直接跳转到 [esi+eax] 的话要注意前面还有四字节

image-20220909160940069

这里同时将数据复制到了新的内存 ds:[ebx+eax-0x4] 给新地址 0x009BFC2C 打断点

最后这里将 ecx 里放置的地址对应的数据和经过两次异或的数据对比

image-20220909161510456

ecx -> “0x009BFC84”

数据

[0xB3, 0x37, 0x0F, 0xF8, 0xBC, 0xBC, 0xAE, 0x5D, 0xBA, 0x5A, 0x4D, 0x86, 0x44, 0x97, 0x62, 0xD3,0x4F, 0xBA, 0x24, 0x16, 0x0B, 0x9F, 0x72, 0x1A, 0x65, 0x68, 0x6D, 0x26, 0xBA, 0x6B, 0xC8, 0x67]

image-20220909161927579

总结一下处理流程

输入数据 —> 两次异或 —> 比较结果

payload

enc = [0xB3, 0x37, 0x0F, 0xF8, 0xBC, 0xBC, 0xAE, 0x5D, 0xBA, 0x5A, 0x4D, 0x86, 0x44, 0x97, 0x62, 0xD3,
       0x4F, 0xBA, 0x24, 0x16, 0x0B, 0x9F, 0x72, 0x1A, 0x65, 0x68, 0x6D, 0x26, 0xBA, 0x6B, 0xC8, 0x67]

xor2 = [0x86, 0x0C, 0x3E, 0xCA, 0x98, 0xD7, 0xAE, 0x19, 0xE2, 0x77, 0x6B, 0xA6, 0x6A, 0xA1, 0x77, 0xB0,
        0x69, 0x91, 0x37, 0x05, 0x7A, 0xF9, 0x7B, 0x30, 0x43, 0x5A, 0x4B, 0x10, 0x86, 0x7D, 0xD4, 0x28]

xor1 = [ord(x) for x in "SWPU_2019_CTF"]

flag = ""
for i in range(len(enc)):
    flag += chr(enc[i]^xor2[i]^xor1[i%13])

print(flag)

flag

flag{Y0uaretheB3st!#@_VirtualCC}

标签: none

添加新评论