Buuctf - jocker2

总结前文的分析,

看到这么多数据,以及ViretualProtect,我们可以联想到SMC自解密函数
处理这类问题的方法有两种:
1.静态修改IDA的分析
2.动态调试后Dump

IDA脚本实现静态修改IDA分析

在主函数里我们已经知道加密函数

  for ( i = 0; i <= 186; ++i )
    *((_BYTE *)encrypt + i) ^= 0x41u;

而异或的逆向也是异或,idapython脚本如下:

import idc
addr = 0x401500 #encrypt函数的地址
for i in range(187):
  b = get_bytes(addr + i, 1)
  idc.patch_byte(addr + i, ord(b) ^ 0x41)

不要以为它没执行,其实已经把opcode bytes更改

运行前

运行后

此时再让IDA重新分析即可

查看函数逻辑,简单的异或,脚本如下:

a = [0x0000000E, 0x0000000D, 0x00000009, 0x00000006, 0x00000013, 0x00000005, 0x00000058, 0x00000056, 0x0000003E, 0x00000006, 0x0000000C, 0x0000003C, 0x0000001F, 0x00000057, 0x00000014, 0x0000006B, 0x00000057, 0x00000059, 0x0000000D]
b = "hahahaha_do_you_find_me?"
c = [0] * 18
for i in range(18):
    c[i]= a[i] ^ ord(b[i])
    print(chr(c[i]), end = "")

前半段flag:flag{d07abccf8a410

再看finally函数

因为最后一个字符应该是'}',假设逻辑不变,那么':'异或'}'得到的值就是我们应该异或的值

脚本如下

a = "%tp&:"
b = '}'
xor = (ord(a[-1]) ^ ord('}'))
print(xor)
a = list(a)
for i in range(len(a)):
    a[i] = chr(ord(a[i]) ^ int(xor))
    print(a[i], end = "")

得到后一段flag:b37a}

动态调试后Dump

posted @ 2025-04-29 12:50  Bri1  阅读(18)  评论(0)    收藏  举报