2023江西省“振兴杯”网络信息行业职业技能竞赛 re1 Writeup

将文件下载下来是个exe文件,放入查壳工具进行查壳。发现是无壳64位程序,拖入IDA进行分析。

进行字符串搜索发现了Right!,我们进入到相关的函数进行查看

发现逻辑就是读取一个名为flag.txt的文件,然后将读取出来的值放入Buffer数组当中。再将Buffer中的元素与 i 进行异或,最后与str2进行比较。

根据逻辑写出exp

enc = "S[]1475XRQUHY]QIQZW"
for i in range(len(enc)):
  temp = ord(enc[i]) ^ i
  print(chr(temp),end='')
#flag{SZ_2023_ZX_CUP_FAKE}

提交flag时发现错了,看来这道题没有想的那么简单。还要再仔细的找找看,果然在函数列表中发现了Tls函数。

发现这里主要调用了两个东西一个是sub_140001240,另一个是loc_140003000。我们都点进去看看,首先看的是sub_140001240

发现就是将两个参数取反,然后将取反后的两个值进行按位与运算。再看看loc_140003000

发现是一堆数据,但是程序又调用了这个东西。那么这个看上去就像是SMC,本来想用IDApython进行解密的,但是看半天也没搞明白是什么操作进行的自解密。只能进行dump了

先动调程序,让程序将这段数据解密为一段代码

分析代码可以得出,这里既然调用了loc_140003000。那么到这里肯定就已经将数据解密为代码了,让程序跑到这个位置,然后将程序dump出来。

将dump出来的exe文件放入IDA中再次进行分析

可以看到loc_140003000已经变成了sub_140003000了,那么我们点进去看看。

发现了真正的加密函数,那么根据逻辑写出exp

def s(a1,a2):
    return ~a1 & ~a2

enc = [-83, -91, -93, -49, -52, -55, -53, -88, -82, -81, -85, -72, -89, -93, -81, -88, -89, -95, -51]
for i in range(19):
    for j in range(256):
        v16 = s(j,i)
        v17 = s(i,i)
        v1 = j
        v18 = v1
        v2 = s(v1,v1)
        v3 = s(v2,v17)
        v19 = s(v3,v16) - 1
        v20 = s(j,i)
        v21 = s(i,i)
        v4 = j
        v22 = v4
        v5 = s(v4,v4)
        v6 = s(v5,v21)
        v7 = s(v6,v20)
        Str1 = s((v7-1),v19)
        if Str1 == enc[i]:
            print(chr(j),end='')
#flag{SZ_2023_ZX_CUP_WIN!}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值