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}

浙公网安备 33010602011771号