190617 逆向-神盾杯(Reverse)

突然想起来我还有个博客(……
这一个月来各种比赛跑,然而主要都是被pizza带飞。得赶紧抽空整理一下各种题目

神盾杯re500的c#没啥思路,本身对.net机制确实没啥深入理解…加入TODOLIST留待日后研究了(

babyjs

拿到html后发现按钮调用了checkLogin函数
在这里插入图片描述
在控制台输入checkLogin即可看到源码
在这里插入图片描述

obfacros

输入被切分成了三段,分别是开头的flag和输入的两段8个字符,分别称为a和b
整体框架又是控制流平坦化,在输入变量上下断然后跑起来,单步执行一阵子可以发现是以jmp eax为分界,在这个关键点下断,跟了几个循环后感觉出是类似于基于栈的虚拟机结构,有类似push pop的函数。
主要执行代码是m = a << k, n = a>>(64-k), m|n,其实就是循环左移k位
取a循环左移1和8位的结果相与,再与a左移2位的结果异或,作为c
然后判断a的最低位,非1则异或本轮prefix
prefix = flag每轮循环左移0x1f的结果
将c与b异或,最后a=b, b=c移位,即完成一轮操作

一共进行了0x1f轮
打上log,匹配值校验算法正确即可

def ff(x, n):
    pp = x<<n
    q = (x>>(64-n))

    # print("%x: %x, %x"%(x,n,(pp|q)&0xffffffffffffffff))
    return (pp|q)&0xffffffffffffffff

def f(x):
    print("result:\t",end='\t')
    p(ff(x,1)&ff(x,8)^ff(x,2))
    return  ff(x,1)&ff(x,8)^ff(x,2)


prefix = 0x67616c66
b = 0x3837363534333231
a = 0x6867666564636261
for i in range(0x1f):
    # prefix = ff(prefix, 0x1b)^prefix
    # prefixs.append(prefix)
    prefix = prefixs[i]
    print(i)
    pt("prefix",prefix)
    pt("a", a)
    c = f(b)^a
    if(not b&1):
        c ^= prefix
    a,b = b,c
    pt("a",a)
    pt("b",b)
    pt("c",c)
    print()

逆算法很好写,最终结果给的是b,c,只需要通过f(b)和c异或得到a即可进行上一轮的逆推

b = 0x209E9FA397B934D2
a = 0xFDADF00EFE1F6806

for i in range(0x1e,-1,-1):
    b, c = a, b
    if(not b&1):
        c ^= prefixs[i]
    a = f(b)^c
print((bytes.fromhex(hex(a)[2:]) + bytes.fromhex(hex(b)[2:]))[::-1])

Encoder

程序使用了时间换空间的方法,将表通过一定算法生成,另一方面静态分析难以找到有特征的常数
动态调试,待box生成以后再查找即可发现是twofish加密
轮子一跑发现还是不对,继续对应内容,发现从key_generate到encrypt都有改动,狗比出题人(╯‵□′)╯︵┻━┻

key_generate调了一处又有一处不对,懒得研究了直接扒子密钥出来
encrypt调了一下发现只有fkh部分改了大小端序,把字节序逆一下以及ENC_ROUND里T1的ROL改成ROR即可
decrypt也使用了fkh宏,所以直接跑就行
解密代码:

u32 QFF[4][256] = {
   0x16a7acac, 0x47b82f2f, 0xae316666, 0x89f10101, 0x9a084545, 0xfd985252, 0x3562cccc, 0x3fde7575, 0x56f7dcdc, 0x7532bcbc, 0x4fb22121, 0x9359a4a4, 0x3ed5858, 0xb896caca, 0x3d68c2c2, 0xe26e1f1f, 0xfa700d0d, 0xaf6a8989, 0xef3af9f9, 0x67901717, 0xb7749b9b, 0x4050707, 0xa7608787, 0xed8c4e4e, 0x44557777, 0xecd7a1a1, 0xcf12c1c1, 0xf5925c5c, 0xba207d7d, 0x53a93434, 0x1ff64d4d, 0x88aaeeee, 0xc4f59797, 0xabcb9b9, 0xa48ddfdf, 0x6929a9a9, 0xf4c9b3b3, 0x5c4b6565, 0xde5d3232, 0xbe75656, 0x2b6b7b7, 0xb62f7474, 0xf321ecec, 0x76dfe4e4, 0xee611616, 0x2a948181, 0xc31dc8c8, 0x6f9a1919, 0xeb9bebe, 0xd4e18b8b, 0xf99d5555, 0x63951010, 0x551a8484, 0xb9cd2525, 0xc5ae7878, 0x7e85f5f, 0x8e195e5e, 0x368f9494, 0x1945fdfd, 0xe730f7f7, 0xbf7e9595, 0xc8fa9e9e, 0x2e918686, 0x4ee9cece, 0x34392323, 0xf8c6baba, 0x7d38b2b2, 0x38362a2a, 0x85fe0808, 0xf0ccb4b4, 0x43bd2828, 0x50446c6c, 0xca4c2929, 0xb499c3c3, 0xe9894949, 0xd70cd3d3, 0xd0e48c8c, 0x55ee8e8, 0x3167cbcb, 0x6c774141, 0x181e1212, 0x450e9898, 0xf724ebeb, 0xdf06dddd, 0x9de01a1a, 0xbb7b9292, 0xce492e2e, 0xb5c22c2c, 0x5af8d5d5, 0x4d049696, 0x1d40fafa, 0xcda47676, 0x6b9f1e1e, 0x80a0e0e0, 0x8df40606, 0xd9b56d6d, 0x96074c4c, 0x95ea1414, 0xa63b6868, 0x52f2dbdb, 0x647d4f4f, 0x92024b4b, 0x13f94444, 0xd5ba6464, 0x9b53aaaa, 0xe4ddafaf, 0xc6432020, 0x12a2abab, 0x9f56adad, 0xb3719c9c, 0xbdc82222, 0xa3658080, 0x6d2caeae, 0x242d3f3f, 0x303c2424, 0xd2523b3b, 0x6ec1f6f6, 0x81fb0f0f, 0xaa346161, 0x14111b1b, 0x3c332d2d, 0x62ceffff, 0x82165757, 0xa9d93939
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值