CTF-reverse逆向分析解题可能用上的脚本

注:本篇用于记录一些CTF-reverse中可能用上的脚本,脚本都来源于博主解出某道题后留下,如果遇上类似的题目,根据脚本中注释的提示更改对应的密文密钥或条件即可快速解题!

持续更新!!点个收藏关注不迷路~


一,AES解密

原文链接->AES加密解密算法_aes解密-CSDN博客

from Crypto.Cipher import AES
 
#注意解密过程中密钥的格式需要为byte类型,字符串转byte直接在开头加个b标志
key = b'1234567890123456' 
#注意解密过程中密文的格式需要为byte类型,本题获取到的是十六进制文本,处理成字符串后使用bytes.fromhex()函数转为对应的字节数组
en_text = bytes.fromhex('F3498AED82CE44E2357C23F5DCF897A43B6A7BFEE0467C591E301CBC38F99913')
 
aes = AES.new(key, AES.MODE_ECB) #创建一个AES解密对象,需要传入密钥和加密模式(这里是ECB模式)
print(aes.decrypt(en_text)) #调用decrypt方法实现解密


 二,z3求解器(求解约束方程未知数)

原文链接->z3求解器脚本(CTF-reverse必备)-CSDN博客

from z3 import *
 
#创建未知数变量
v = [Int(f'v{i}')    for i in range(0, 16)]
 
#创建解释器对象
solver = Solver()#创建一个求解器对象
 
#添加约束方程
solver.add(v[0] * 7 == 546)
solver.add(v[1] * 2 == 166)
solver.add(v[2] * 6 + v[3] * 1 + v[5] * 7 == 1055)
solver.add(v[1] * 4 + v[3] + v[4] * 4 + v[5] * 7 + v[7] * 6 + v[8] * 1 + v[13] * 2 + v[15] * 8 == 3107)
solver.add(v[4] * 4 == 336)
solver.add(v[1] * 2 + v[5] * 7 == 656)
solver.add(v[6] * 3 + v[7] * 6 + v[8] + v[9] * 5 + v[10] * 16 + v[11] * 3 + v[12] * 6 + v[13] * 2 + v[15] * 8 == 5749)
solver.add(v[7] * 6 == 606)
solver.add(v[8] + v[14] * 5 == 652)
solver.add(v[9] * 5 + v[10] * 16 + v[12] * 6 == 3213)
solver.add(v[6] * 3 + v[7] * 6 + v[8] + v[9] * 5 + v[10] * 24 + v[11] * 3 + v[12] * 6 + v[13] * 2 + v[15] * 8 == 6717)
solver.add(v[11] * 3 == 285)
solver.add(v[6] * 3 + v[7] * 6 + v[8] * 2 + v[10] * 8 + v[12] * 6 + v[13] * 2 + v[14] * 5 + v[15] * 8 == 4573)
solver.add(v[14] * 5 == 600)
solver.add(v[2] * 6 + v[3] * 1 + v[4] * 4 + v[5] * 7 + v[13] * 2 == 1615)
solver.add(v[1] * 2 + v[5] * 7 + v[7] * 6 + v[8] * 1 + v[15] * 8 == 2314)
 
#求解并转化为字符输出,得到flag
if solver.check() == sat: #check()方法用来判断是否有解,sat(即satisify)表示满足有解
    ans = solver.model() #model()方法得到解
    for i in v:
        print(chr(ans[i].as_long()), end='')
#一般不会无解,如果无解八成是未知数变量的类型不符合,或约束方程添加错误
else:
    print("no ans!")


三,base64换表解密

原文链接->CTF-reverse-simpleRE(base64变表逆向)-CSDN博客

import base64 #导入base64模块用于解密
s1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #标准表
s2 = 'qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD' #base64换表
en_text = '5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==' #密文
 
map = str.maketrans(s2, s1) #用str类中的maketrans建立映射,注意第一个参数是需要映射的字符串,第二个参数是映射的目标
map_text = en_text.translate(map) #映射实现替换密文,替换前是base64换表加密,替换后则是base64标准表加密
print(map_text) #可以先看看标准表加密的原base64密文
print(base64.b64decode(map_text)) #直接使用提供的base64解密函数解密


四,二维四向迷宫路径求解

(注:请查看原文学习使用两个脚本!)

原文链接->CTF-reverse二维四向迷宫路径求解-CSDN博客

(一)脚本一:处理迷宫为二维列表

#str为ida中使用快捷键[shift+e]提取到的数据, 如果提取的是string literal则加上引号视作字符串,如果是C array(decimal)则加上中括号视作列表
str = "字符串"/[一维列表] 
s = 0 #s用作索引访问str, 供下面tmp列表取值
 
#分析题目后设置迷宫的行列
row =  #设置二维迷宫行数
col =  #设置二维迷宫列数
 
maze = []
for i in range(row):
    tmp = []
    for j in range(col):
        tmp.append(str[s])
        s+=1
    maze.append(tmp) #凑一行添加一行到迷宫中
print(maze)

(二)脚本二:获得迷宫路径

from collections import deque
 
#设置二维四向迷宫, 如果题目是多个小迷宫问题, 拆分多次调用脚本获取路径即可
maze = 二维列表迷宫
path_len = 0x7fffffff#如果题目未给出终点坐标,则一定会指定路径的长度,在此处修改路径长度,否则请保留path_len的极大值
 
#进行BFS寻找路径
def bfs(start, end, barrier):
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 定义四个方向的移动
    for i in range(len(maze)):#获取起点和终点在列表中的索引
        for j in range(len(maze[i])):
            if(maze[i][j] == start):
                start = (i, j)
            if(maze[i][j] == end):
                end = (i, j)
    #以下均是bfs算法套路
    queue = deque()
    queue.append((start, [start]))  # (当前位置, 路径)
    visited = set()
    visited.add(start)
    while queue:
        position, path = queue.popleft()
        if position == end:
            return path
        elif len(path)==path_len:
            return path
        for d in directions:
            next_position = (position[0] + d[0], position[1] + d[1])
            if 0 <= next_position[0] < len(maze) and 0 <= next_position[1] < len(maze[0]) and \
               maze[next_position[0]][next_position[1]] != barrier and next_position not in visited:
                queue.append((next_position, path + [next_position]))
                visited.add(next_position)
    return None
 
#执行BFS搜索并打印结果
if __name__ == '__main__':
    #maze[起点x坐标][起点y坐标] = 'S' #如果题目给了起点终点的坐标,在这里直接给起点和终点添加特征
    #maze[终点x坐标][终点y坐标] = 'E' 
    
    path = bfs('S', 'E', 1) #bfs函数传入参数代表起点、终点、障碍的特征(若题目给出的数据无特征, 手动添加特征即可, 通常障碍是1也有可能是0或其它字符如'#')
    print("移动路径坐标:", path)
    print("移动路径方位:", end='')
    for i in range(1 ,len(path)):
        x1, y1, x2, y2 = path[i - 1][0], path[i - 1][1], path[i][0], path[i][1]
        if(x1 > x2):#上
            print("w", end='')
        elif(x1 < x2):#下
            print("s", end='')
        elif(y1 > y2):#左
            print("a", end='')
        elif(y1 < y2):#右
            print("d", end='')


 持续更新……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值