-
-
[原创]2021年第四届红帽杯Re-virtual_world
-
2021-5-10 15:16
5506
-
[原创]2021年第四届红帽杯Re-virtual_world
分配指令空间和数据存储空间
进入vmp解释器
解释器结构
由于时间问题没法快速解析指令对应的handler,所以采取IDA指令跟踪的方式
根据对handler指令分析可以发现
1 2 3 4 5 6 7 | add ?, ?
imul ?, ?
div ?
movzxeax, byte ptr [?]取单字节数据
|
可能为相关运算操作指令
使用IDA指令跟踪可以快速分析指令执行
当数据编码完成后开始对比数据
0x2B为输入数据编码后的结果
直接nop掉跳转指令,运行获取全部对比数据,得到数据
1 | 612a725f7e736dda72df43ab72bf4de96bc965
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import binascii
import z3
z = z3.Solver()
right = binascii.unhexlify( "612a725f7e736dda72df43ab72bf4de96bc965" )
flag = [z3.BitVec( "a%d" % _, 32 ) for _ in range ( 0x13 )]
buff = []
temp = flag[ 0 ]
for _ in range ( len (flag)):
try :
temp = temp * 3 + flag[_ + 1 ]
except IndexError:
temp = temp * 3
temp % = ( 0x1000 + 1 )
temp & = 0xFF
buff.append(flag[ 0 ] ^ temp ^ len (flag))
temp1 = temp + len (flag)
for _ in range ( 1 , len (flag)):
buff.append(flag[_] ^ temp1 ^ buff[_ - 1 ])
temp1 + = len (flag) - _
temp1 & = 0xFF
for p, i in enumerate (buff):
z.add(z3.simplify(i = = right[p]))
if z.check() = = z3.sat:
for i in flag:
print ( chr (z.model()[i].as_long()), end = "")
|
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-5-10 15:35
被Delevy编辑
,原因: