TJCTF之Python Reversing

本文介绍了作者在TJCTF中遇到的一道Python逆向分析题目。通过逐步解析代码,发现了一个未知库中的函数,并通过调试理解了程序逻辑。通过计算得出每个字符可能对应的位数,并利用提示进行爆破。最终,作者分享了简化版的解决代码,强调理解逻辑的重要性,并提供了题目链接供读者实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客已经转移

https://noone-hub.github.io/

这个题目先做出来,晚发布,因为做着下一道题卡住了,忘了来写博客记录了,现在补上,这道题其实不难,就是我语文水准不好

贴上代码先

import numpy as np #取随机库

flag = 'redacted'

np.random.seed(12345)#给个seed取随机数
arr = np.array([ord(c) for c in flag])#创建一个数组 为字符转数字的
other = np.random.randint(1,5,(len(flag)))#生成范围为1-5,长度为flag的数组
arr = np.multiply(arr,other)#将两个数组相乘

b = [x for x in arr]
lmao = [ord(x) for x in ''.join(['ligma_sugma_sugondese_'*5])]
c = [b[i]^lmao[i] for i,j in enumerate(b)] #这是生成带序号的一个list
print(''.join(bin(x)[2:].zfill(8) for x in c))#zfill是填充0如果没8位,bin(x)[2:]是去掉0b的前缀,这都是调试过后得到的,自己也可以做

# original_output was 1001100001011110110100001100001010000011110101001100100011101111110100011111010101010000000110000011101101110000101111101010111011100101000011011010110010100001100010001010101001100001110110100110011101

这里有一个库和库里的很多函数我都不认识,一个个百度,我给你写上注释了,

起初我以为程序运行结果是下面那个注释,结果浪费好长时间,实际不是的

运行这个py得到

1001110101010001110101111101011110000001010110111101011100101011001

len一下得到67

redacted 求len一下8

也就是说,8位或者9位对应一个字符

然后原文中的提示,求len一下 2012

然后202/8一下子喽,25,为什么要25,不除以9呢,自己调试就懂了,然后此题目,前后的代码不是有一串串联系的,所以比较好搞,下一题就比较复杂点,所以一位位爆破就可以了,25位,25*(127-30),爆破次数不大,可以进行

最后贴上代码

#!/usr/bin/env python
# coding=utf-8
import numpy as np

key="1001100001011110110100001100001010000011110101001100100011101111110100011111010101010000000110000011101101110000101111101010111011100101000011011010110010100001100010001010101001100001110110100110011101"
flag=""
ans=""
for i in range(25):
    for w in range(30,127):
        flag=ans+chr(w)
        np.random.seed(12345)
        arr = np.array([ord(c) for c in flag])
        other = np.random.randint(1,5,(len(flag)))
        arr = np.multiply(arr,other)

        b = [x for x in arr]
        lmao = [ord(x) for x in ''.join(['ligma_sugma_sugondese_'*5])]
        c = [b[i]^lmao[i] for i,j in enumerate(b)]
        temp=''.join(bin(x)[2:].zfill(8) for x in c)
        if temp[len(temp)-9:len(temp)]== key[len(temp)-9:len(temp)]:
            ans+=chr(w)
            print ans
            break

这是我练习python的东东,所以大部分代码还是抄大神的writeup,逻辑理解完就好,最后那个判断便是一位位判断对不对,其实可以直接输出flag就不会这么多了

附上题目:链接: https://pan.baidu.com/s/13fz6KCLpEO19rUxm4B2eeA 密码: vt4p

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值