高校战“疫”网络安全分享赛Re:天津垓WP

7 篇文章 0 订阅
6 篇文章 0 订阅

复现题

我下载的时候这个题缺了个dll,补上后运行下程序,观察。
在这里插入图片描述
需要输入授权字符串。拖入IDA查看,查看字符串,发现有限制调试工具的代码,解除。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找到第一个输入点。需要输入符号位运算的合法输入,写个脚本破解,如下:

str = [0x52, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x48, 0x6f, 0x70, 0x70, 0x65, 0x72, 0x21]
arr = [17, 8, 6, 10, 15, 20, 42, 59, 47, 3, 47, 4, 16, 72, 62, 0, 7, 16]

flag = ''
for i in range(18):

    for j in range(127):
        v43 = ~(j & str[i % 14]) & (j | str[i % 14])
        if v43 == arr[i]:
            flag += chr(j)
print(flag)

得到结果:
在这里插入图片描述
输入验证后发现程序直接退出了。
在这里插入图片描述
接着往下看,发现text代码段有一段数据,没有解析为指令。
在这里插入图片描述
使用IDA分析下看看,没有解析成功,应该是人为加密了。用交叉引用查哪里曾经调用了这段代码。发现有段汇编call了那段数据,说明是个函数。此处查看下伪代码,找到了一个加密数据的函数。
在这里插入图片描述
这个函数调用了一个win32API,而根据微软msdn中给出的描述,这个API的作用是指定某段区域设置访问保护,然后这个函数紧接着对保护区域与输入进行异或以加密。
我们只需要对保护区域的数据进行解密即可用IDA分析得到保护区域的原数据,也就是汇编指令。
在这里插入图片描述
参考大佬的脚本后发现,可以直接用IDAPython的API进行操作,实在是太方便了。脚本如下(必须要在IDA中跑):

input =[67, 97, 117, 99, 97, 115, 117, 115, 64, 115, 95, 97, 98, 105, 108, 105, 116, 121]
for i in range(1045):
    address = 0x10040164D + i
    byte = get_bytes(address, 1)#IDApythonAPI,作用是获取指定地址的指定字节数
    byte = ord(byte) ^ input[i%18]
    patch_byte(address, byte)#IDApythonAPI,更改指定地址的字节为byte

分析解密的数据段,并创建函数,查看伪代码。
在这里插入图片描述
上图红框同样和第一次输入时做了类似的事情。写个逆向脚本破解即可,如下:

data = [
2007666,
2125764,
1909251,
2027349,
2421009,
1653372,
2047032,
2184813,
2302911,
2263545,
1909251,
2165130,
1968300,
2243862,
2066715,
2322594,
1987983,
2243862,
1869885,
 2066715,
 2263545,
 1869885,
 964467,
 944784,
 944784,
 944784,
 728271,
 1869885,
 2263545,
 2283228,
 2243862,
   2184813,
   2165130,
   2027349,
 1987983,
2243862,
1869885,
2283228,
2047032,
1909251,
2165130,
1869885,
2401326,
1987983,
2243862,
2184813,
885735,
2184813,
2165130,
1987983,
2460375]

v61 = 0x4CE3
v62 = 0x8000000B
flag = ''
for i in range(51):
    for j in range(127):
        v60 = v61 * j % v62
        if v60 == data[i]:
            flag += chr(j)
print(flag)

运行获得flag
在这里插入图片描述

flag{Thousandriver_is_1000%_stronger_than_zero-one}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值