syc_level7

syc_level7

这种异常处理的catch代码一开始不会找,后来看了三叶草的战队的解答才知道怎么操作

这里有四个throw块,要找到对应catch代码,然后jmp过去就能看见源码,三叶草那边的解答是手撸汇编代码,说实话这种分析太慢,而且容易出错,还不如让ida来帮我们分析

image-20221220115828084

转到卡片形式汇编代码,有这种标志的就是catch代码

image-20221220115956022

然后将所有的catch块打上断点

image-20221220120047338

然后在throw代码之前也都打上断点

image-20221220120159946

然后,运行程序找到,各个throw对应的catch块

修改throw代码为jmp 对应catch地址,直接看到源码

image-20221220113600556

这里随机数,大循环32次每一次要重置srand,小循环四次,所以只需要输出4个随机数即可

这里用c语言中的srand代码生成随机数,值得注意的是,==我在windows上用c语言跑,跑出来的随机数根本不对。要在linux上面跑才行==

image-20221220114740283

image-20221220114707904

这里根据随机数,标上代码块的执行顺序

image-20221220114941422

最后python伪代码:

enc = [0xA3A7C060, 0xEE6E5485, 0x244B2655, 0x318482D9]
delta = 0x9E3779B9
for i in range(32):
    v11 += delta
    v12 += delta
    v7 += ((v8 >> 5) + 6) ^ (v8 + v11) ^ (16 * v8 + 8) ^ (i + v11)
    v9 += ((v10 >> 5) + 6) ^ (v10 + v12) ^ (16 * v10 + 8) ^ (i + v12)
    v8 += ((v7 >> 5) + 7) ^ (v7 + v11) ^ (16 * v7 + 9) ^ (i + v11)
    v10 += ((v9 >> 5) + 7) ^ (v9 + v12) ^ (16 * v9 + 9) ^ (i + v12)
v19 = v7 ^ HIBYTE(delta)
v20 = v8 ^ BYTE2(delta)
v21 = v9 ^ BYTE1(delta)
v22 = v10 ^ (unsigned __int8)delta

然后根据这个代码写出解密脚本:

# lesson7
from Crypto.Util.number import *
enc = [0xA3A7C060, 0xEE6E5485, 0x244B2655, 0x318482D9]
delta = 0x9E3779B9
s = (delta*32)&0xffffffff
v7 = enc[0]^0x9e
v8 = enc[1]^0x37
v9 = enc[2]^0x79
v10 = enc[3]^0xb9
for i in range(31,-1,-1):
    v10 -= ((v9 >> 5) + 7) ^ (v9 + s) ^ (16 * v9 + 9) ^ (i + s)
    v10 = v10&0xffffffff
    v8 -= ((v7 >> 5) + 7) ^ (v7 + s) ^ (16 * v7 + 9) ^ (i + s)
    v8 = v8&0xffffffff
    v9 -= ((v10 >> 5) + 6) ^ (v10 + s) ^ (16 * v10 + 8) ^ (i + s)
    v9 = v9&0xffffffff
    v7 -= ((v8 >> 5) + 6) ^ (v8 + s) ^ (16 * v8 + 8) ^ (i + s)
    v7 = v7&0xffffffff
    s = (s-delta)&0xffffffff
enc = [v7,v8,v9,v10]
flag = int(''.join(map(lambda x: hex(x)[2:],enc)),16)
long_to_bytes(flag)
#SYC{ediGegTEaEi}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

×

喜欢就点赞,疼爱就打赏