分析一个执行比特翻转的变异函数

本文分析了如何在fuzzing过程中使用flip_random_character函数进行字符串变异,通过随机选择字符并进行比特翻转,确保变异的可控性。作者通过实例展示了如何实现比特翻转以及其在测试中的作用。

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

在阅读fuzzing book 的mutation-based fuzzing一节时,碰到一个执行比特翻转的变异函数,代码如下

def flip_random_character(s):
    """Returns s with a random bit flipped in a random position"""
    if s == "":
        return s

    pos = random.randint(0, len(s) - 1)
    c = s[pos]
    bit = 1 << random.randint(0, 6)
    new_c = chr(ord(c) ^ bit)
    # print("Flipping", bit, "in", repr(c) + ", giving", repr(new_c))
    return s[:pos] + new_c + s[pos + 1:]

从代码中可以看出,这个函数输入的是字符串,确定字符串时非空的以后,会随机选中这个字符串中的某个字符,然后在随机生成一个变量bit,这个bit的特征是,转化成二进制后,只有一个位上是1,而其他位都是0,再用这个bit和选中的字符进行异或运算,再将异或之后的结果贴回原字符串。

如果我们这样使用下面的函数

seed_input = "A quick brown fox"
for i in range(10):
    print(repr(flip_random_character(seed_input)))

可能得到下列输出

'A quick bRown fox'
'A quici brown fox'
'A"quick brown fox'
'A quick brown$fox'
'A quick bpown fox'
'A quick brown!fox'
'A 1uick brown fox'
'@ quick brown fox'
'A quic+ brown fox'
'A quick bsown fox'

读完第一遍以后,我对这个函数的基本用途有了掌握,但是对它具体的写法还是有些困惑。

于是在gpt的帮助下写了下面这个程序

import random

# 初始字符
c = 'A'
print("初始字符:", c, "ASCII值:", ord(c), "二进制:", bin(ord(c)))

# 随机生成比特位
bit = 1 << random.randint(0, 6)
print("十进制:",bit)
print("比特位:", bin(bit))

# 对字符的 ASCII 值进行异或操作
new_c = chr(ord(c) ^ bit)
print("异或操作后的字符:", new_c, "ASCII值:", ord(new_c), "二进制:", bin(ord(new_c)))

# 再次对新字符进行异或操作,应该可以恢复原始字符
restored_c = chr(ord(new_c) ^ bit)
print("恢复原始字符:", restored_c, "ASCII值:", ord(restored_c))

上面的程序某一次的运行结果如下

初始字符: A ASCII值: 65 二进制: 0b1000001
十进制: 1  
比特位: 0b1
异或操作后的字符: @ ASCII值: 64 二进制: 0b1000000
恢复原始字符: A ASCII值: 65

再一次运行结果如下

初始字符: A ASCII值: 65 二进制: 0b1000001
十进制: 4
比特位: 0b100
异或操作后的字符: E ASCII值: 69 二进制: 0b1000101
恢复原始字符: A ASCII值: 65

可以看出,每一次bit这个变量的二进制为1的那一位上才会进行比特翻转。而将bit的1的个数控制在一个,也是为了保证变异的程度不要太大,否则就更可能得到非法的输入,失去了mutational fuzzing的最初目的。

参考文档

Mutation-Based Fuzzing - The Fuzzing Book

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSU迦叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值