Constraint-guided Directed Greybox Fuzzing阅读
Constraint-guided Directed Greybox Fuzzing
难点
有导向的黑盒测试没有考虑有序的目标点和数据条件。本文提出的有约束条件导向的测试方法,将约束定义为目标点和数据条件的组合。并且驱动种子按照顺序满足有顺序的约束。
解决方法
提出新的约束距离来判断seed的优劣,约束距离需要考虑到两个方面,一是有顺序的目标点,二是数据约束,同时提出自动化产生约束的方法。
背景
DGF技术在重现崩溃时非常有用,但是耗时较长,主要是两个方面:1、DGF假设目标点是相互独立无序的,2、DGF没有考虑崩溃所需的数据条件。
介绍
CDGF要求种子满足一连串的约束条件,为了衡量种子对约束的满足程度,CDGF将种子距离定义为约束条件的距离,而不是传统的DGF中到目标点的距离。同时提出了从crash dumps和补丁日志自动生成约束的算法。
在DGF中,每个代码块被赋值为到所有目标点最短路径的调和平均数,种子的距离被定义为代码块的平均值。通常来讲,种子能覆盖更多的目标点,种子距离越小。
这里说是调和平均数,但是通过计算公式,调和平均数应该是倒数相加除以数量再取倒数,但是找了原文:D ...
AFL-fuzz实践
初次见面
这里使用AFL-TRAINING这个仓库学习AFL的FUZZ。
可以通过docker构建所需要的环境,到仓库的environment下
1docker build . -t fuzz-training
构建容器,这里因为网络问题可能失败,多构建几次就行了。同时也建议替换清华源和提前准备好AFL++仓库
12# 放到apt-get update前RUN sed -i s@/archive.ubuntu.com/@/mirrors.tuna.tsinghua.edu.cn/@g /etc/apt/sources.list && sed -i s@/security.ubuntu.com/@/mirrors.tuna.tsinghua.edu.cn/@g /etc/apt/sources.list && apt-get clean
同时需要git clone的话,可以设置docker代理~/.docker/config.json
1234567891011{ "proxies": { "defau ...
CISCN2022
初赛
baby_code
阅读ast代码
1234567891011121314151617181920212223242526272829303132333435key = '345y'def check(encoded, keyValue): b = encoded.encode() k = keyValue.encode() r0 = r1= r2 = r3 = 0 for i in range(0, len(b) - 4): r0 = b[i] r1 = b[i+1] r2 = b[i+2] r3 = b[i+3] b[i+0] = r2 ^ ((r0 >> 4 + k[0]) & 0xff) b[i+1] = r3 ^ ((r1 >> 2 + k[1]) & 0xff) b[i+2] = r0 ^ k[2] b[i+3] = r1 ^ k[3] k = k[1:]+ k[0] return b == [88, 35, 88, 225, 7, 201, 57, 94, 77, 56, 75, 168, ...
AFL-源码阅读
主要有afl-gcc和afl-fuzz两个程序,分别起到插桩和fuzz的作用。
afl-gcc
在afl-gcc中,先通过find_as找到afl-as程序,这个程序用于对.s文件进行插桩,不断读取行数,面对不同的情况插入汇编指令。
例如这里,检测到汇编时,插入一个随机数log的桩
和检测到条件跳转时
最后再如果插桩成功,将主程序插入
主程序中会开启forkserver通过共享内存与fuzzer通信。
afl-fuzz
主程序
再看到afl-fuzz程序,可以看到8044行中,fuzzer也准备好了共享内存,准备好后
1234567setup_post();setup_shm(); // 准备共享内存init_count_class16();setup_dirs_fds();read_testcases(); // 读取测试样例,并放入queue中load_auto();
然后是对测试样例进行校验(运行一次),并且选出最优测试用例
123perform_dry_run(use_argv); // 校验cull_queue(); // 择优
其中,对一个testcase的校验通过此 ...
AFL-变异策略
主要有以下几种
bitflip,按位翻转,1变为0,0变为1
arithmetic,整数加/减算术运算
interest,把一些特殊内容替换到原文件中
dictionary,把自动生成或用户提供的token替换/插入到原文件中
havoc,对原文件进行大量变异
splice,将两个文件拼接得到新的文件
bitflip
在这个过程中,会根据不同的步长来翻转bit。
同时在连续翻转时,会有afl自定义策略:自动检测token,即例如翻转文件头时,因为文件头被破坏,程序的运行路径就与原来不一样了,所以破坏文件头里的任一bit效果是一样的,随后afl会将这个文件头作为一个可能的token存储起来。
在每次翻转相邻的8bit时,会有策略生成effector map,这个map里存储了无效的data字节,即在进行字节翻转(8bit)时,如果对一个字节翻转后,路径没有变化,说明这个字节很有可能对fuzzing的意义不大,所以被加入到map中,之后的变异过程中,就会根据map跳过一些无用的字节。
其中比较详细的介绍可以参考https://paper.seebug.org/496/#part-2af ...
C++ 常用STL
记录下常用STL的操作函数
stack
top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
pop():弹出栈顶元素。
size():返回栈中元素的个数。
empty():在栈中没有元素的情况下返回 true。
emplace():用传入的参数调用构造函数,在栈顶生成对象。
queue
front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底 ...
记一次iOS14下Crash的故障排查过程
新版本上线后,许多iOS14用户反馈闪退问题,于是在Xcode里下载14.2的Simulator,并且运行。
运行结果如下,在切换TabView的时候发生报错,
在AppDelegate中报错,由于没有报错信息,只能通过调用栈来按图索骥,但是在看之前,简单看这个报错,INVOP表示空指针读取,即访问了异常内存地址产生的报错。
看到调用栈中有collectionView中的回调函数,这个函数一搜或者了解UIKit的开发者都知道,是控制CollectionView中Cell UI返回的回调函数,于是搜索错误代码和这个回调函数,能够找到一些问题,但是不是我们想要的答案。
直接搜索EXC_BAD_INSTRUCTION swiftui tabview,能够找到论坛中的一个帖子https://developer.apple.com/forums/thread/681903,问题得到回复,iOS15修了,好吧。。但是iOS14咋办呢,直接搜索下这个Style,第一篇Stack Overflow上就提到了解决办法,原来是iOS14中NavigationView与TabView的冲突。
问题得到 ...
记在ubuntu下配置Clash的过程
本来是想使用clash for linux的,最后发现配置过于麻烦,不如使用clash for windows里的linux安装包。
https://github.com/Fndroid/clash_for_windows_pkg/releases
解压后,熟悉的界面出现在我们眼前,直接使用即可
这里直接复制订阅连接,在Profiles界面输入并且下载使用即可
然后打开ubuntu的设置,在网络里设置代理即可
成功使用上Google
Git Commit的小trick
当我们想在两个差别很大的分支之间同步一个小feature的话,可以使用cherry-pick,例如在这里我们有master和dev两个分支。
在dev分支的dev fea 2中,对123文件进行了修改,而fea 1中,新增了其他文件的内容,我们仅需要将dev fea 2 commit中的修改同步到master上,可以在master分支cherry-pick这个commit
commit的hash值为3ff5b7
所以在master分支下执行
1git cherry-pick 3ff5b7
便可以合并分支
在解决冲突后,成功的将commit合并过来了
Ubuntu安装nodejs
近日迁移服务器,发现nodejs安装过程还有点坑,记录一下。
安装npm中报错
The following packages have unmet dependencies: npm : Depends: node-gyp (>= 0.10.9) but it is not going to be installed
需要先安装一些依赖
1sudo apt install nodejs-dev node-gyp libssl1.0-dev
这时候可能下载的npm版本比较老,需要下载最新的nodejs
12curl -fsSL https://deb.nodesource.com/setup_17.x | sudo -E bash -sudo apt-get install -y nodejs
只能使用nodejs来调用程序,需要创建一个软连接。
1ln -s /usr/bin/nodejs /usr/bin/node
总体过程为
123curl -fsSL https://deb.nodesource.com/setup_17.x | sudo -E bash -sud ...