How (and How Not) to Write a Good Design Paper

How (and How Not) to Write a Good Design Paper 论文细读

如何(如何不)写一篇好的设计论文

extension://bfdogplmndidlpjfhoijckpakkdjkkil/pdf/viewer.html?file=https%3A%2F%2Fwww.ida.liu.se%2F~matar63%2Fdesignpaper.pdf

论文类别

1、论文呈现了一个真正的设计项目,要么通过整个设计项目的全球调查,要么通过设计中体现的特定主题的选择性审查

2、论文展示了从未实现或实例化的概念设计工作,使用了我们认为设计者应该知道的想法或技术

3、论文解决了研究领域的一个方向,比如说可持续性

投稿的评价标准

独到见解

将论文投稿至与原创作品相关的会议或期刊时,论文至少包含一个新的想法,我们必须熟悉论文所涉及领域的最新技术和研究现状,才能知道我们的工作的原创的。

我们能简明扼要地陈述这个新想法吗?如果我们的论文是为了推进知识的状态,那么我们的读者必须能够发现新思想并理解它们。尝试把每个想法写在一个段落中,一般精通领域相关的人都能理解。如果做不到把每个想法写在一个段落中,那么可能我们自己没有真正理解这个想法的可能性,当我们有了框架,在论文摘要中要写到它们。

要解决的具体设计挑战是什么?我们不能之王读者只看到设计解决方案的描述就猜到我们面临的挑战或问题。一定要具体解释为什么以前的论文没法很好解决我们的设计挑战。

这些想法是否足够重要,足以证明论文的合理性?通常,描述真实设计工作的论文包含一到两个既定技术的改进,新的想法可以用几段话来描述,没必要一篇论文写20页,这样可能会掩盖实际的创新。开发一个真正的设计是一项繁重的工作,作者有时会不经意间将全部努力与新工作混为一谈,如果创新小,在合适的期刊或会议上发表一篇简短的论文或笔记,比发表完整论文更合适。

描述的工作是否与现有的相关工作有显著不同?我们基于先前发表的方法、技术或设计解决方案的扩张,不值得发表,我们必须证明自己的工作代表着与先进技术的背离,如果做不到,问自己为什么要写这篇文章,我们要让更多人愿意看我们的文章。

相关工作都有参考吗,针对读过被引用的材料吗?除非我们明确地将论文与之前发表的作品区分开,否则很耐说服读者相信我们的原创性。并且,如果读者读过被引用的文章,而我们没读过,那么会更难说服读者认可我们方法的优越性。

与以前工作的比较是否清楚和明确?我们不能简单地说我们的方法与别人的有所不同,我们要具体地说,我们的用户界面方法使用的是有形的部件,而不是像别人那样设计的触摸板,预期会增加几个用户的合作与参与度。

这项工作是否包含了对早期但未经证实的想法的扩展,验证或否定?支持或反驳先前发表的论文设计的评估经验是非常有价值的。

我们引用的最古老的论文是什么,最新的呢?有没有提到其他机构的类似工作?引用过技术报告,未发表的备忘录,未审阅的在线材料,个人交流吗?这些问题有助于提醒我们在知识或理解上存在的盲点。

现实

这篇论文描述的是一些已经以某种方式实现的东西还是完全是概念性的?有很多论文在结束语部分才会揭示,这是不太好的,读者英高在一开始就知道正在讨论的设计作品是一个真正的设计项目,还是仅仅为论证而做的概念设计。

如果设计已经实现,它是如何被使用的,这种使用表明了关于想法的实际重要性的什么?如果设计工作是一个尚未实现或原型化的概念,那么这些想法现在是否有出版的理由?审稿人通常对只有设计而没有任何评估的论文持怀疑态度,除非有高质量的新想法。

教训

如果我们在工作中什么都没学到,那么读者也学不到,我们的论文只会浪费读者的时间。我们要清楚地陈述我们结论所基于的假设,并且在陈述结论时,有必要再次陈述假设,因为读者读到后面可能会忘记假设。

选择

我们考虑了哪些备选方案,为什么会做出这样的选择?一篇好的论文不只是描述,而是解释,我们要告诉读者我们做了什么,并不是让他们知道我们的选择有多仔细。

这些选择最终被证明是正确的吗?如果是,那么最初选择它的原因是什么,我们从这个经理中学到了什么?如果我们在研究过程中碰到了死胡同,可以记录下来,让读者不要走同样的死胡同。

上下文

如果想读者对我们的观点持支持态度,我们要首先将论点假设陈述出来。

它们现实吗?对于理论研究,必须清楚假设如何反应现实。

工作对假设的变化是否敏感?如果如果结果巧妙地建立在一个由不稳定的假设组成的高塔上,那么对于读者来说,它的用处将不如建立在更广泛,更牢固的基础上的结果有用。

如果提出一个理论模型,它是否给出了新的信息和见解?简单地为模型本身定义并没有用。

焦点

介绍性材料是否包含我们的主要设计重点的多余内容?我们要避免在同一个深度层次上描述你的设计所由的主要特征,应该专注于新颖或不寻常的内容,这才是论文原始设计内容的重点。

演讲

这些想法是否以清晰且有逻辑的方式组织和呈现?术语在使用前是否有明确定义?前向引用是否保持在最低限度?当读者反复遇到“***将在后面一节详细描述”这样的语句时会感到非常恼火,读者必须记住专业术语,且此时还没给出这个术语的定义,这对读者来说是不易于理解的。

摘要是先写的吗?它是否传达了论文的重要思想?论文中描述设计的摘要被滥用严重,摘要通常是一个散文的目录,而不是论文的技术内容摘要。

论文写完了吗?审稿人通常可以帮忙改进论文,但是不能替我们写。并且在描述设计的论文中,审稿人不能容忍作者遗漏重要的解释或论证。

写作风格

文章是否清晰简洁?单词的拼写和使用正确吗?句子是否完整,语法是否正确?是否避免歧义?在提交论文前,我们要仔细阅读论文,检查错误。

总结

在写论文,组织演讲时,我们要不断问自己上述的问题。有一些问题针对的是“设计”论文中的具体问题,有的适用于一般的研究论文。写一篇好的论文是一项艰苦的工作,但是我们能学到很多,并且帮助读者从我们的想法中有所收获。

Exercise 7 - VLC Media Player

Exercise 7 - VLC Media Player

一、实验背景

CVE-2019-14776是一个越界读取漏洞,可以通过精心制作的WMV/ASF (Windows Media Video)文件触发。越界读取是当程序读取数据超过预期缓冲区的末尾或开始之前时发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。

越界读取漏洞(https://cwe.mitre.org/data/definitions/125.html)

部分仪器仪表

使用进化覆盖引导的模糊器的优点之一是,它能够自己找到新的执行路径。然而,这通常也是一个缺点。当我们面对具有高度模块化架构的软件(如VLC媒体播放器)时,每个模块执行特定的任务。

那么,假设我们给监控器提供了一个有效的MKV文件。但是在对输入文件进行了几次修改之后,“magic bytes”文件发生了变化,现在我们的程序将输入文件视为AVI文件。因此,这个“变异的MKV文件”现在由AVI Demux处理。一段时间后,文件魔术字节再次改变,现在文件被视为MPEG文件。在这两种情况下,这个新修改的文件增加代码覆盖率的可能性都很低,因为这个新文件没有任何有效的语法结构。

简而言之,如果我们不对代码覆盖率施加限制,模糊测试者很容易选择错误的路径,从而使模糊测试过程效率降低。

为了解决这个问题,afl++包含了一个部分插装特性,它允许指定应该使用或不使用插装来编译哪些函数/文件。这有助于模糊器专注于程序的重要部分,通过执行无趣的代码路径来避免不必要的噪声和干扰。

为了使用它,我们在编译时设置环境AFL_LLVM_ALLOWLIST变量。这个环境变量必须指向一个包含所有应该检测的函数/文件名的文件。

afl++部分仪器(https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.instrument_list.md)

二、实验目的

模糊VLC媒体播放器。目标是在VLC 3.0.7.1中找到CVE-2019-14776的崩溃/PoC

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建一个新目录

1
2
cd $HOME
mkdir fuzzing_vlc && cd fuzzing_vlc

下载并解压vlc-3.0.7.1.tar.xz

1
2
wget https://download.videolan.org/pub/videolan/vlc/3.0.7.1/vlc-3.0.7.1.tar.xz
tar -xvf vlc-3.0.7.1.tar.xz && cd vlc-3.0.7.1/

image

发现下载链接连接失败,用管理员身份下载,解决问题

image

2、构建VCL
1
2
./configure --prefix="$HOME/fuzzing_vlc/vlc-3.0.7.1/install" --disable-a52 --disable-lua --disable-qt
make -j$(nproc)

image

报错

image

解决方案

安装一些必要的依赖库

1
2
3
4
5
apt-get install libxcb-composite0-dev libxcb-glx0-dev libxcb-dri2-0-dev libxcb-xf86dri0-dev libxcb-xinerama0-dev libxcb-render-util0-dev
apt-get install libxcb-xv0-dev
apt-get install libxcb-randr0-dev
apt-get install libasound2-dev
apt-get install libvlc-dev

image

image

image

image

image

image

image

image

image

安装完依赖库后,重新运行.config,成功构建VCL

image

测试工作是否正确

1
./bin/vlc-static --help

如看到以下页面,说明工作正确

image

3、种子语料库创建

可以在ffmpeg示例库中找到大量视频示例。

建议挑选一些样本,然后使用视频编辑器将视频文件缩小到尽可能小的大小。

以下是一些开源视频编辑器的例子:

——(OpenShot) (https://www.openshot.org/)

——(Shotcut) (https://shotcut.org/)

或者复制short2.wmvveryshort.wmv文件到AFL输入文件夹

image

4、fuzzing线束

如果尝试直接模糊“vlc-static”二进制文件,将看到AFL每秒只执行几次。这是因为VLC启动非常耗时。这就是为什么为模糊测试VLC创建一个自定义模糊测试线束。

修改’ ‘ ./test/vlc-demux-run.c ‘ ‘文件以包含模糊测试工具。通过这种方式,只需执行以下操作即可编译该harness:

1
2
3
cd test
make vlc-demux-run -j$(nproc) LDFLAGS="-fsanitize=address"
cd ..

image

由于该错误存在于ASF解模中,所以调用vlc_demux_process_memory函数。这个函数尝试删除先前存储在内存中的数据缓冲区。可以在这里找到代码修改(./fuzzing_harness.patch)

5、部分仪器化

一开始,尝试只包括ASF拆模所涉及的文件名。不幸的是,这种方法不起作用。似乎文件名匹配是并不总是可能的,所以选择了一个混合的方法,包括函数匹配和文件名匹配

可以下载部分检测文件(./Partial_instrumentation)

6、小改动

为了加快ASF模糊测试的速度,建议将这个补丁应用到modules/demux/libasf.c (目前没有更多的线索;)):[speeup .patch](./ speeup .patch)

7、fuzzing

使用afl-clang-fast作为编译器并启用ASAN构建VLC的时间

1
2
CC="afl-clang-fast" CXX="afl-clang-fast++" ./configure --prefix="$HOME/fuzzing_vlc/vlc-3.0.7.1/install" --disable-a52 --disable-lua --disable-qt --with-sanitizer=address
AFL_LLVM_ALLOWLIST=$HOME/fuzzing_vlc/vlc-3.0.7.1/Partial_instrumentation make -j$(nproc) LDFLAGS="-fsanitize=address"

image

image

构建模糊控制装置

1
2
3
cd test
make vlc-demux-run -j$(nproc) LDFLAGS="-fsanitize=address"
cd ..

image

运行fuzzer

1
afl-fuzz -t 100 -m none -i './afl_in' -o './afl_out' -x asf_dictionary.dict -D -M master -- ./test/vlc-demux-run @@    

注意事项:超时参数严重依赖于计算机,需要调整这个值

过一段时间,可以看到多个崩溃

image

image-20230802153658669

Image1

8、Triage

ASan跟踪可能看起来像

image3

9、修复问题

修复这两个bug后重建目标,并检查PoC不再使程序崩溃

五、总结

通过这个实验,我了解了CVE-2019-14776漏洞,学会如何使用部分仪器只对程序的相关部分进行仪器检测,如何编写模糊测试工具来更有效地测试大型应用程序

Exercise 6 - GIMP

Exercise 6 - GIMP

一、实验背景

CVE-2016-4994是一个可以通过精心制作的XCF文件触发的Use-After-Free漏洞。当程序在释放指针后继续使用指针时,会发生释放错误。这可能会产生许多不良后果,从破坏有效数据到执行任意代码。

Use-After-Free漏洞(https://cwe.mitre.org/data/definitions/416.html)

持久模式

AFL持久模式基于进程内fuzzers: fuzzers利用单个进程,将代码注入目标进程并更改内存中的输入值。full -fuzz支持一种工作模式,它结合了进程内模糊测试的优点和更传统的多进程工具的健壮性:持久模式。在持久模式下,afl++在单个分叉进程中对目标进行多次模糊处理,而不是为每次执行模糊处理都创建一个新进程。该模式可将模糊测试速度提高20倍。

目标的基本结构如下

1
2
3
4
5
6
7
8
9
10
11
//Program initialization

while (__AFL_LOOP(10000)) {

/* Read input data. */
/* Call library code to be fuzzed. */
/* Reset state. */
}

//End of fuzzing

afl++持久模式(https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md)

二、实验目的

模糊GIMP图像编辑器。目标是在GIMP 2.8.16中找到CVE-2016-4994的崩溃/PoC

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建一个新目录

1
2
cd $HOME
mkdir Fuzzing_gimp && cd Fuzzing_gimp

安装依赖项

1
sudo apt-get install build-essential libatk1.0-dev libfontconfig1-dev libcairo2-dev libgudev-1.0-0 libdbus-1-dev libdbus-glib-1-dev libexif-dev libxfixes-dev libgtk2.0-dev python2.7-dev libpango1.0-dev libglib2.0-dev zlib1g-dev intltool libbabl-dev

image

下载并构建GEGL 0.2(通用图形库)

1
2
wget https://download.gimp.org/pub/gegl/0.2/gegl-0.2.0.tar.bz2
tar xvf gegl-0.2.0.tar.bz2 && cd gegl-0.2.0

image

对源代码做两个小的修改

1
2
sed -i 's/CODEC_CAP_TRUNCATED/AV_CODEC_CAP_TRUNCATED/g' ./operations/external/ff-load.c
sed -i 's/CODEC_FLAG_TRUNCATED/AV_CODEC_FLAG_TRUNCATED/g' ./operations/external/ff-load.c

image

构建并安装Gegl-0.2

1
2
3
./configure --enable-debug --disable-glibtest  --without-vala --without-cairo --without-pango --without-pangocairo --without-gdk-pixbuf --without-lensfun --without-libjpeg --without-libpng --without-librsvg --without-openexr --without-sdl --without-libopenraw --without-jasper --without-graphviz --without-lua --without-libavformat --without-libv4l --without-libspiro --without-exiv2 --without-umfpack
make -j$(nproc)
sudo make install

image

image

image

如果在测试阶段看到一些错误消息,不要担心

下载并解压GIMP 2.8.16

1
2
3
cd ..
wget https://mirror.klaus-uwe.me/gimp/pub/gimp/v2.8/gimp-2.8.16.tar.bz2
tar xvf gimp-2.8.16.tar.bz2 && cd gimp-2.8.16/

image

使用afl-clang-lto作为编译器构建GIMP的时间(可能需要一些时间)

1
2
3
CC=afl-clang-lto CXX=afl-clang-lto++ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Fuzzing_gimp/gegl-0.2.0/ CFLAGS="-fsanitize=address" CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" ./configure --disable-gtktest --disable-glibtest --disable-alsatest --disable-nls --without-libtiff --without-libjpeg --without-bzip2 --without-gs --without-libpng --without-libmng --without-libexif --without-aa --without-libxpm --without-webkit --without-librsvg --without-print --without-poppler --without-cairo-pdf --without-gvfs --without-libcurl --without-wmf --without-libjasper --without-alsa --without-gudev --disable-python --enable-gimp-console --without-mac-twain --without-script-fu --without-gudev --without-dbus --disable-mp --without-linux-input --without-xvfb-run --with-gif-compression=none --without-xmc --with-shm=none --enable-debug  --prefix="$HOME/Fuzzing_gimp/gimp-2.8.16/install"
make -j$(nproc)
make install

image

image

image

2、持久模式

有两种非常简单的方法:

第一个是修改’ ‘ app.c ‘ ‘文件,并将AFL_LOOP宏包含到for循环中

image

第二种方法是在’ ‘ xcf_load_invoker ‘ ‘函数中插入AFL_LOOP宏

Image1

虽然第一个允许我们针对不同的输入格式,第二个更快,我们将有更多的机会抓住错误。

下载第二个补丁在这里

2、种子语料库创建

建议创建多个GIMP项目并保存它们以获得多个.xcf示例,或者,可以将SampleInput.xcf文件复制到您的AFL输入文件夹中

image

3、fuzzing

由于该漏洞影响GIMP核心,可以通过删除不需要的插件来节省一些启动时间

1
rm ./install/lib/gimp/2.0/plug-ins/*

image

使用以下命令运行fuzzer

1
ASAN_OPTIONS=detect_leaks=0,abort_on_error=1,symbolize=0 afl-fuzz -i './afl_in' -o './afl_out' -D -t 100 -- ./install/bin/gimp-console-2.8 --verbose -d -f @@

image

笔记:

  • gimp-console-2.8是GIMP的控制台版本
  • 我建议启用确定性突变(-D)
  • 代码中还有一个无限循环的bug,所以我们需要设置一个较低的超时限制(例如-t 100)。此超时限制取决于您的机器功能,因此您需要根据具体情况对其进行调整

几分钟后可以看见有多个崩溃

Image2

4、Triage

ASan跟踪可能看起来像

image3

5、修复问题

修复这两个bug后重建目标,并检查PoC不再使程序崩溃

五、总结

通过这个实验,我了解了CVE-2016-4994漏洞,学会如何使用持久模式加快模糊测试,如何模糊交互/ GUI应用程序

Exercise 4 - LibTIFF

Exercise 4 - LibTIFF

一、实验背景

CVE-2016-9297是一个越界读取漏洞,可以通过制作TIFF_SETGET_C16ASCII或TIFF_SETGET_C32_ASCII标签值触发。越界读取是当程序读取数据超过预期缓冲区的末尾或开始之前时发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。

越界读取漏洞(https://cwe.mitre.org/data/definitions/125.html)

二、实验目的

模糊LibTIFF图像库,在libtiff 4.0.4中找到CVE-2016-9297漏洞/PoC,以测量崩溃/PoC的代码覆盖数据

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建一个新目录

1
2
cd $HOME
mkdir fuzzing_tiff && cd fuzzing_tiff/

下载并解压libtiff 4.0.4

1
2
wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz

image

构建并安装libtiff

1
2
3
4
cd tiff-4.0.4/
./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install

image

image

image

作为目标二进制,可以模糊’ ‘ tiffinfo ‘ ‘二进制位于’ ‘ /bin ‘ ‘文件夹,使用’ ‘ /test/images/ ‘ ‘文件夹中的示例图像作为种子输入语料库。

测试工作是否正常

1
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff

看到如下页面说明正常

image

在最后一个命令行中,启用了所有这些标志:”-j -c -r -s -w”。这是为了提高代码覆盖率,增加发现bug的机会。

但是我们如何度量给定输入情况的代码覆盖率呢?

2、代码覆盖率

代码覆盖率是一个软件度量,显示每行代码被触发的次数。通过使用代码覆盖率,我们将了解哪些部分的代码已经被模糊器到达,并可视化模糊过程。

安装lcov

1
sudo apt install lcov

image

用“——coverage”标志重新构建libTIFF(编译器和链接器)

1
2
3
4
5
6
7
rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean

CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install

image

image

image

image

通过输入以下代码来收集代码覆盖率数据

1
2
3
4
5
cd $HOME/fuzzing_tiff/tiff-4.0.4/
lcov --zerocounters --directory ./
lcov --capture --initial --directory ./ --output-file app.info
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
lcov --no-checksum --directory ./ --capture --output-file app2.info

image

image

每一个命令的解释:

  • lcov --zerocounters --directory ./ : 重置之前的计数器
  • lcov --capture --initial --directory ./ --output-file app.info : 返回“基线”覆盖率数据文件,该文件包含每个测量行的零覆盖率
  • $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff : 运行需要分析的应用程序,可以使用不同的输入多次运行它
  • lcov --no-checksum --directory ./ --capture --output-file app2.info: 将当前覆盖状态保存到app2.info文件中

最后,生成HTML输出

1
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info

image

如果一切顺利,代码覆盖率报告将在“html-coverage”文件夹中创建。只要打开./html-coverage/index.html文件,可以看到如下内容

image

可以浏览不同的文件夹和文件,并查看每行执行的次数

3、fuzzing

要编译启用了ASAN的libtiff

首先,要清理所有之前编译过的目标文件和可执行文件

1
2
3
rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean

image

调用make之前设置AFL_USE_ASAN=1

1
2
3
4
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
AFL_USE_ASAN=1 make -j4
AFL_USE_ASAN=1 make install

image

image

image

使用以下命令运行fuzzer

1
afl-fuzz -m none -i $HOME/fuzzing_tiff/tiff-4.0.4/test/images/ -o $HOME/fuzzing_tiff/out/ -s 123 -- $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@

几分钟后可以看见有多个崩溃

image

image

4、Triage

ASan跟踪可能看起来如下图所示

1
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w '/home/fuzz/fuzzing_tiff/out/default/crashes/id:000000,sig:06,src:000000,time:1806,execs:1009,op:havoc,rep:1'

可以得到一个很好的奔溃摘要,包括执行跟踪

image

image

报错信息

AddressSanitizer: heap-buffer-overflow on address 0x602000000071 at pc 0x0000002aafc2 bp 0x7ffd9d5ea570 sp 0x7ffd9d5e9d30

堆溢出

5、代码覆盖度量

尝试度量PoC的代码覆盖率。需要获得一个覆盖率html报告,类似于上面的例子。

6、修复问题

修复bug后重建目标,并检查PoC不再使程序崩溃

五、总结

通过这个实验,我了解了CVE-2016-9297漏洞,学会如何使用LCOV来衡量代码覆盖率,如何使用代码覆盖率数据来提高模糊测试的有效性、

Exercise 3 - TCPdump

Exercise 3 - TCPdump

一、实验背景

CVE-2017-13028是一个越界读取漏洞,可以通过BOOTP数据包(引导协议)触发,越界读取是当程序读取数据超过预期缓冲区的末尾或开始之前时发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。

越界读取漏洞(https://cwe.mitre.org/data/definitions/125.html)

**AddressSanitizer (ASan)**是C和c++的快速内存错误检测器。它最初是由谷歌(Konstantin Serebryany, Derek Bruening, Alexander Potapenko, Dmitry Vyukov)开发的,并于2011年5月首次发布。

它由编译器插装模块和运行时库组成。该工具能够查找对堆、堆栈和全局对象的越界访问,以及use-after-free、double-free和内存泄漏错误。

AddressSanitizer是开源的,并且从3.1版开始集成到LLVM编译器工具链中。虽然它最初是作为LLVM的一个项目开发的,但它已被移植到GCC,并包含在GCC版本>= 4.8中

AddressSanitizer(https://clang.llvm.org/docs/AddressSanitizer.html)

二、实验目的

模糊TCPdump数据包分析器。目标是在TCPdump 4.9.2中找到CVE-2017-13028漏洞

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建一个新目录

1
2
cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/

image

下载并解压tcpdump-4.9.2.tar.gz

1
2
wget https://github.com/the-tcpdump-group/tcpdump/archive/refs/tags/tcpdump-4.9.2.tar.gz
tar -xzvf tcpdump-4.9.2.tar.gz

image

下载libpcap(TCPdump需要的一个跨平台库)并解压libpcap-1.8.0.tar.gz

1
2
wget https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.8.0.tar.gz
tar -xzvf libpcap-1.8.0.tar.gz

image

我们需要将“libpcap-libpcap-1.8.0”重命名为“libpcap-1.8.0”。否则,tcpdump找不到libpcap的本地路径

1
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0

构建并安装libpcap

1
2
3
4
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
./configure --enable-shared=no
make
make install

image

image

构建并安装tcpdump

1
2
3
4
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
./configure --prefix="$HOME/fuzzing_tcpdump/install/"
make
make install

image

image

image

测试工作是否正常

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -h

看到如下页面说明正常

image

tcpdump version 4.9.2

libpcap version 1.8.0

检查版本号是否与实验手册的一致,若一致,则继续下面的实验

2、创建种子语料库

可以在“.pcap”中找到许多. pcap示例,“/tests”文件夹中。你可以用下面的命令行运行这些.pcap文件

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r [.pcap file]

例如

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r ./tests/geneve.pcap

然后会看到如下页面

image

3、构建时启用ASan

构建启用了ASAN的tcpdump(和libpcap)

要清理所有之前编译过的目标文件和可执行文件

1
2
3
4
5
6
rm -r $HOME/fuzzing_tcpdump/install
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
make clean

cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
make clean

image

调用configure和make之前设置AFL_USE_ASAN=1

1
2
3
4
5
6
7
8
9
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make

cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
AFL_USE_ASAN=1 CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install

image

image

image

image

image

Afl-clang-lto编译可能需要几分钟才能完成

4、fuzzing

使用以下命令运行fuzzer

1
afl-fuzz -m none -i $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o $HOME/fuzzing_tcpdump/out/ -s 123 -- $HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@

image

注意:64位系统上的ASAN需要大量虚拟内存。这就是为什么我在AFL中设置了禁用内存限制的标志“-m none”

几小时后可以看见有多个崩溃

image

5、Triage

调试用ASan构建的程序,需要给程序提供崩溃文件

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/fuzz/fuzzing_tcpdump/out/default/crashes/id:000000,sig:06,src:003788,time:8574962,execs:1212760,op:havoc,rep:3'

可以得到一个很好的奔溃摘要,包括执行跟踪

image

image

image

报错信息

AddressSanitizer: heap-buffer-overflow on address 0x6100000000ff at pc 0x0000003cee45 bp 0x7fff77cbed90 sp 0x7fff77cbe538

堆溢出

6、修复问题

https://github.com/the-tcpdump-group/tcpdump/commit/85078eeaf4bf8fcdc14a4e79b516f92b6ab520fc#diff-05f854a9033643de07f0d0059bc5b98f3b314eeb1e2499ea1057e925e6501ae8L381

五、总结

通过这个实验,我了解了CVE-2017-13028漏洞,了解运行时内存错误检测工具**ASan (Address Sanitizer)**,学会如何使用ASAN模糊目标,使用ASan对崩溃进行分类

Exercise 2 - libexif

Exercise 2 - libexif

一、实验背景

CVE-2009-3895是一个基于堆的缓冲区溢出,可以通过无效的EXIF图像触发。基于堆的缓冲区溢出是发生在堆数据区域的一种缓冲区溢出,它通常与显式动态内存管理(使用malloc()和free()函数进行分配/回收)有关。因此,远程攻击者可以利用此问题在使用受影响库的应用程序上下文中执行任意代码。

基于堆的缓冲区溢出漏洞(https://cwe.mitre.org/data/definitions/122.html)

CVE-2012-2836是一个越界读取漏洞,可以通过带有精心制作的EXIF标签的图像触发。越界读取是当程序读取数据超过预期缓冲区的末尾或开始之前时发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。

越界读取漏洞(https://cwe.mitre.org/data/definitions/125.html)

二、实验目的

这次我们将模糊libexif EXIF解析库。目标是在libxif 0.6.14中找到CVE-2009-3895CVE-2012-2836的崩溃/PoC。

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

为模糊的项目创建一个新目录

1
2
cd $HOME
mkdir fuzzing_libexif && cd fuzzing_libexif/

下载并解压libexif-0.6.14

1
2
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz

image

构建并安装libexif

1
2
3
4
5
6
cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install

image

image

image

image

image-20230727232107643

2、选择一个接口应用程序

libexif是一个库,我们需要另一个应用程序来使用这个库,这个应用程序将被模糊化。对于这个任务,我们将使用exif command-line,下载并解压exif command-line 0.6.15:

1
2
3
cd $HOME/fuzzing_libexif
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz

image

image

构建并安装exif command-line实用程序

1
2
3
4
5
cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install

image

image-20230727232415273

image

image

测试是否正常工作

1
$HOME/fuzzing_libexif/install/bin/exif

看到如下页面说明工作正常

image

3、创建种子语料库

现在我们需要一些出口样本。我们将使用以下repo中的样例图像:https://github.com/ianare/exif-samples。通过以下指令下载

1
2
3
cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip

image

举例

1
$HOME/fuzzing_libexif/install/bin/exif $HOME/fuzzing_libexif/exif-samples-master/jpg/Canon_40D_photoshop_import.jpg

可以看到如下输出

image

4、Afl-clang-lto

使用afl-clang-lto作为编译器来构建libexif。

1
2
3
4
5
6
7
rm -r $HOME/fuzzing_libexif/install
cd $HOME/fuzzing_libexif/libexif-libexif-0_6_14-release/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
1
2
3
4
5
6
cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install

image

image-20230727233607562

image

image

image

image

image

image-20230727233940330

使用了afl-clang-lto而不是afl-clang-fast。一般来说,afl-clang-lto是最好的选择,因为它是一个无冲突的工具,而且它比afl-clang-fast快。

如果不确定何时使用afl-clang-ltoafl-clang-fast,可以检查从[AFLplusplus:检测目标]提取的下图(https://github.com/AFLplusplus/AFLplusplus#1-instrumenting-that-target)

](https://github.com/AFLplusplus/AFLplusplus#1-instrumenting-that-target)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+--------------------------------+
| clang/clang++ 11+ is available | --> use LTO mode (afl-clang-lto/afl-clang-lto++)
+--------------------------------+ see [instrumentation/README.lto.md](instrumentation/README.lto.md)
|
| if not, or if the target fails with LTO afl-clang-lto/++
|
v
+---------------------------------+
| clang/clang++ 6.0+ is available | --> use LLVM mode (afl-clang-fast/afl-clang-fast++)
+---------------------------------+ see [instrumentation/README.llvm.md](instrumentation/README.llvm.md)
|
| if not, or if the target fails with LLVM afl-clang-fast/++
|
v
+--------------------------------+
| gcc 5+ is available | -> use GCC_PLUGIN mode (afl-gcc-fast/afl-g++-fast)
+--------------------------------+ see [instrumentation/README.gcc_plugin.md](instrumentation/README.gcc_plugin.md) and
[instrumentation/README.instrument_list.md](instrumentation/README.instrument_list.md)
|
| if not, or if you do not have a gcc with plugin support
|
v
use GCC mode (afl-gcc/afl-g++) (or afl-clang/afl-clang++ for clang)

5、fuzzing

使用以下命令运行fuzzer

1
afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@

image

几分钟后可以看见有多个崩溃

image

可以在这里找到崩溃的图像文件

image

6、动态调试

编译出带调试信息的可执行文件

image

image

image

image

image

image

image

image-20230728003925454

放到gdb中,跑出clash

clash1

image

报错信息**Program received signal SIGSEGV, Segmentation fault.**存在内存泄漏

报错位置in exif_data_load_data (data=0x4538c0, d_orig=, ds_orig=) at exif-utils.c:94 94 return ((buf[1] << 8) | buf[0]);

注意这里的报错,内存地址无法访问,再看地址,猜测为堆缓冲区溢出

clash2

image

报错信息**Program received signal SIGSEGV, Segmentation fault.**存在内存泄露

报错位置in exif_data_load_data (data=0x4538c0, d_orig=, ds_orig=) at exif-utils.c:94

clash3

image

报错信息**Program received signal SIGSEGV, Segmentation fault.**存在内存泄露

报错位置in exif_data_load_data (data=0x4538c0, d_orig=, ds_orig=) at exif-utils.c:94

7、漏洞修复

https://github.com/libexif/libexif/commit/8ce72b7f81e61ef69b7ad5bdfeff1516c90fa361

https://github.com/libexif/libexif/commit/00986f6fa979fe810b46e376a462c581f9746e06

五、总结

通过这个实验,我了解了CVE-2009-3895漏洞和CVE-2012-2836漏洞,学习了libexif,找到一个使用libexif库的接口应用程序,创建一个出口样本的种子语料库使,用afl-clang-lto编译libexif和选择的应用程序,模糊libexif,直到有一些独特的崩溃,分类崩溃以找到每个漏洞的PoC

《The structure of paper/report in Systems》

系统中纸张/报告的结构

结构 (ucr.edu)

写论文时要遵循一些规则:

递归性1:每一部分的第一段应该是本节的摘要/概述,可以先说“在本节中,我们将介绍…”

递归性2:每个段落中,第一行/第二行应该对应于段落的摘要

自上而下:从高层次开始,慢慢增加细节,让读者知道我们想往哪方面扩展

摘要

摘要主要介绍我们所做的工作,一段200-300字,用于吸引读者阅读文章

  1. 本文的目标(1-2行)
  2. 工作的动机和重要性(1-2行)
  3. 我们工作的结果或贡献(1-2行)最好引用直观或易于解释的指标的数字来量化

引言

提出问题,动机,重要性,主要贡献

  1. 问题:高层次的定义,意义
  2. 以前的工作
  3. 我们的贡献
  4. 本文结构介绍

背景和模型

定义,场景,模型

  1. 以前的工作,有助于于我们的工作进行对比,来说我们的工作是否有创新点,与以前的工作相比有什么优势
  2. 以前工作的弱点,或在一些方面有什么没有考虑到的东西
  3. 我们工作的假设和局限性(只是诚实地提出来,不要谴责我们的工作)

我们的想法

介绍我们的创新点

如果有必要,对我们所作的工作中的一些名词进行介绍,它的定义以及它是如何工作的

详细地介绍细节

对我们在这一节写的内容进行分析

实验结果

实验概述:我们了做什么,我们没做什么,为什么

模拟模型或测量基础设施

实验结果

使用标题(粗体) 区分实验(即尺寸对性能的影响,或者甚至更好的尺寸不会影响性能)

每个情节都应该出现一个明确的原因(比如说负载越大,吞吐量越差)

解释每个图:轴,我们看到的,趋势是什么,为什么是这样的趋势

统计,强化结果:置信区间、相关系数等。

每个数字应该是准确的:标题应该是可读的,并且可理解的。

评论,讨论, 解释

讨论

如果我们还有想法,可以在论文中展示出来,比如说重要性,与其他作品的关系,可能的实际应用

结论

结论是非常重要的,我们在结论中要

  1. 对所作的工作进行概述
  2. 主要成果和贡献
  3. 重要性
  4. 实用技巧(帮助别的研究人员使用我们做的东西,避免错误)
  5. 未来工作,强调工作的重要性,但是要避免给出自己的想法

参考文献

要按照参考文献的标准,必须正确、完整、准确

附录

我们可以再附录写任何我们想写的东西

  1. 提供额外的结果,以加强我们的论点
  2. 通过在这里放一个冗长的证明或讨论一个细节来保持论文的流畅性
  3. 解决一个问题,表明我们已经深入思考了这个问题

Exercise 1 - Xpdf

Exercise 1 - Xpdf

一、实验背景

CVE-2019-13288是一个可能通过精心制作的文件导致无线递归的漏洞

程序中每个被调用的函数都在堆栈上分配一个堆栈帧,如果一个函数被递归调用多次,可能会导致堆栈内存耗尽和程序崩溃,因此,远程攻击者可以利用该漏洞进行Dos攻击

非受控制递归漏洞(https://cwe.mitre.org/data/definitions/674.html)

二、实验目的

模糊Xpfd(PDF查看器),目标是在XPDF 3.02中找到CVE-2019-13288漏洞

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建目录

1
2
cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/

image

安装make和gcc,准备好环境,注意要先更新apt-get,否则会出现错误Unable to locate package build-essential

1
2
sudo apt-get update 
sudo apt install build-essential

image

image

下载Xpdf 3.02压缩包并解压

1
2
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz

image

构建Xpdf

1
2
3
4
5
cd xpdf-3.02
sudo apt update && sudo apt install -y build-essential gcc
./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

image

image

image

image

下载一些PDF示例用于后续验证

下载pdf时注意在后面加参数–no-check-certificate跳过验证证书,否则会报错unable to establish ssl connection.

1
2
3
4
5
cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf –no-check-certificate
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf

image

image

测试pdfinfo二进制文件

1
$HOME/fuzzing_xpdf/install/bin/pdfinfo -box -meta $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf

看到如下页面说明验证成功

image

2、安装AFL++

采用本地安装的方式,首先安装依赖项

1
2
3
4
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

image

image

image

构造AFL++

1
2
3
4
5
cd $HOME
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
export LLVM_CONFIG="llvm-config-11"
make distrib
sudo make install

image-20230726155938884

image

Docker image

安装docker,第一次安装后无法使用docker,使用snap重新下载后可以使用

1
sudo apt install docker

image

image

Pull图像,要加上sudo以管理员身份运行,否则会报错connect: permission denied

1
docker pull aflplusplus/aflplusplus

image-20230726161946524

image

启动AFLPlusPlus docker容器

1
docker run -ti -v $HOME:/home aflplusplus/aflplusplus

再运行

1
export $HOME="/home"

输入afl-fuzz运行afl-fuzz,出现下图说明运行成功

image

3、开始实验

为了使我们的目标应用程序启用插装,我们需要使用AFL的编译器编译代码,首先,我们要清理所有之前编译过的目标文件和可执行文件

1
2
3
rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean

image

使用afl-clang-fast编译器构建xpdf

1
2
3
4
export LLVM_CONFIG="llvm-config-11"
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

image

image

image

每个选项的简要说明:

  • -i 表示我们必须放置输入大小写的目录(即文件示例)
  • -o 表示afl++存储修改后文件的目录
  • -s 表示使用静态随机种子
  • @@ 是AFL将用每个输入文件名替换的占位符目标的命令行

fuzzer基本上会运行下面这个命令,用于每个不同的输入文件

1
2
$HOME/fuzzing_xpdf/install/bin/pdftotext <input-file-name>
$HOME/fuzzing_xpdf/output

使用以下命令运行fuzzer,出现错误如下图

1
afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output

image

如果收到消息“Hmm, your system is configured to send core dump notifications to an external utility…”,只要这样做

1
2
3
sudo su
echo core >/proc/sys/kernel/core_pattern
exit

image

再运行fuzzer,几分钟后,可以看到如下页面

image

看到saved crashes的值,是崩溃的数量

可以在“$HOME/fuzzing_xpdf/out/”目录中找到这些崩溃文件

image

4、调试和分类

通过调试和分类,来找到关于这个bug的信息

1)用指定的文件重现崩溃
2)调试崩溃找出问题所在
3)修复问题

在’ $HOME/fuzzing_xpdf/out/ ‘目录中找到与崩溃对应的文件。文件名类于“id:000000,sig:11,src:000526,time:534057,execs:257582,op:havoc,rep:8”

image

将此文件作为输入传递给pdftotext二进制文件

1
$HOME/fuzzing_xpdf/install/bin/pdftotext '$HOME/fuzzing_xpdf/out/default/crashes/<your_filename>' $HOME/fuzzing_xpdf/output

它将导致分割错误,并导致程序崩溃

image

使用gdb找出使用此输入导致程序崩溃的原因

GDB的简单入门(http://people.cs.pitt.edu/~mosse/gdb-note.html)

首先,使用调试信息重新构建Xpdf,以获得符号堆栈跟踪

1
2
3
4
5
6
rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

image

image

image

image

运行GDB

1
2
3
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:000526,time:534057,execs:257582,op:havoc,rep:8 $HOME/fuzzing_xpdf/output

>> run

image

正常情况下可看到如下输出

看到Program received signal SIGSEGV, Segmentation fault,说明存在内存泄漏

报错位置是in _int_malloc (av=av@entry=0x7ffff7c63b80 , bytes=bytes@entry=4) at malloc.c:3545,glibc报了个错,显然是堆内存出了问题

image

再输入bt获取回溯

image

滚动调用堆栈,可以看到许多对“Parser::getObj”方法的调用,这些调用似乎表示无限递归。访问https://www.cvedetails.com/cve/CVE-2019-13288/可以看到描述从GDB获得的回溯匹配。

执行流信息,分析一下可以看出调用过程是循环的,判断为无限循环漏洞

根据函数调用找到漏洞位置

从fuzzing_xpdf/xpdf-3.02/xpdf/Parse.cc 94行的makeStream调用,一路跟着报错往下翻就会找到这个套娃

image

5、修复问题

方法

  1. 修复后重建目标,并检查用例是否不再导致分段错误
  2. 安装错误已经修复的Xpdf 4.02,并检查分段错误是否消失

我选择的是安装已修复的Xpdf 4.02,对比源代码,发现再Xpdf 4.02的文件Parse.cc中,加了个变量,记录循环次数,超过一定次数就结束进程

1
2
wget https://dl.xpdfreader.com/old/xpdf-4.02.tar.gz
tar -xvzf xpdf-4.02.tar.gz

image

image

五、总结

通过这个实验,我了解了CVE-2019-13288漏洞,学习了**AFL++**,如何使用带有插装的afl编译器编译目标,如何启动afl++,如何检测目标崩溃。

image

界面信息介绍

process timing:执行时间信息

run time:运行总时间

last new find:距离最近一次发现新路径的时间

last saved crash:距离最近一次保存程序崩溃的时间

last saved hang:距离最近一次保存挂起的时间

overall results:

cycles done:运行的总周期数

corpus count:语料库计数

saved crashes:保存的程序崩溃个数

saved hang:保存的挂起个数

cycle progress:

now processing:当前的测试用例ID(所在输入队列的位置)

runs timed out:超时数量

map coverage:覆盖率

map density:目前已经命中多少分支元组,与位图可以容纳多少的比例

count coverage:位图中每个被命中的字节平均改变的位数

stage progress:

now trying: 指明当前所用的变异输入的方法

stage execs: 当前阶段的进度指示

total execs: 全局的进度指示

exec speed: 执行速度

findings in depth:种子变异产生的信息

favored items: 基于最小化算法产生新的更好的路径

new edges on: 基于更好路径产生的新边

total crashes: 基于更好路径产生的崩溃

total tmouts: 基于更好路径产生的超时 包括所有超时的超时

fuzzing strategy yields: 进一步展示了AFL所做的工作,在更有效路径上得到的结果比例,对应上面的now trying

bit flips: 比特位翻转,例如:

bitflip 1/1,每次翻转1个bit,按照每1个bit的步长从头开始

bitflip 2/1,每次翻转相邻的2个bit,按照每1个bit的步长从头开始

byte flips: 字节翻转

arithmetics: 算术运算,例如:

arith 16/8,每次对16个bit进行加减运算,按照每8个bit的步长从头开始,即对文件的每个word进行整数加减变异

know ints: 用于替换的基本都是可能会造成溢出的数,例:

interest 16/8,每次对16个bit进替换,按照每8个bit的步长从头开始,即对文件的每个word进行替换

dictionary: 有以下子阶段:

user extras (over),从头开始,将用户提供的tokens依次替换到原文件中

user extras (insert),从头开始,将用户提供的tokens依次插入到原文件中

auto extras (over),从头开始,将自动检测的tokens依次替换到原文件中

其中,用户提供的tokens,是在词典文件中设置并通过-x选项指定的,如果没有则跳过相应的子阶段。

havoc:顾名思义,是充满了各种随机生成的变异,是对原文件的“大破坏”。具体来说,havoc包含了对原文件的多轮变异,每一轮都是将多种方式组合(stacked)而成

splice:在任意选择的中点将队列中的两个随机输入拼接在一起.

py/custom/req:

trim:修建测试用例使其更短,但保证裁剪后仍能达到相同的执行路径

eff

item geometry:

levels: 表示测试等级

pending: 表示还没有经过fuzzing的输入数量

pend fav: 表明fuzzer感兴趣的输入数量

own finds: 表示在fuzzing过程中新找到的,或者是并行测试从另一个实例导入的数量

imported: n/a表明不可用,即没有导入

stability: 表明相同输入是否产生了相同的行为,一般结果都是100%

参考博客:https://blog.csdn.net/qq_40025866/article/details/127823491

clash科学上网

登录clash官方网站

https://ikuuu.art/

(网站可能会挂,按照提示访问新域名)

在左侧下载和教程中选择Linux使用教程

1、在用户目录下创建clash文件夹

1
2
mkdir clash
cd clash

2、下载clash二进制文件并解压,重命名为clash,存放在clash目录下

下载链接:

Releases · Dreamacro/clash (github.com)

我下载的是clash-linux-amd64-v3-v1.17.0.gz

改名为clash.gz后解压为clash文件

1
gzip -dv clash.gz

3、执行如下命令,下载clash配置文件

1
wget -O config.yaml "https://api.sub-200.club/link/k726BxGA2nMeyL8V?clash=3"

4、启动clash,同时启动HTTP代理和Socks5代理,注意先修改权限

1
2
chmod +x clash
./clash -d .

image

5、访问Clash (razord.top)可以切换节点,测试延迟等操作

image

6、打开系统设置,选择网络,点击网络代理右边的设置按钮,选择手动,修改HTTP和HTTPS代理,如下图所示

image

可顺利访问外网

How to give a good research talk

How to give a good research talk(Simon L Peyton Jones)论文细读

extension://bfdogplmndidlpjfhoijckpakkdjkkil/pdf/viewer.html?file=https%3A%2F%2Fwww.microsoft.com%2Fen-us%2Fresearch%2Fwp-content%2Fuploads%2F2016%2F08%2Fgiving-a-talk.pdf

要做一个好的研究演讲,我们需要从论文中找出我们认为有用的东西。

我们演讲的对象大多是研究计算机领域的学者,他们可能不太了解我们所研究的特定领域,我们主要是将我们的经验讲出来,尽力使内容更生动。

在准备演讲的过程中,我们首先要明确两个问题

  • 我的主要听众是哪类人
  • 我希望他们记住我演讲中的哪一部分

明确了这两个问题后,我们可以以它作为标准来决定我们该详细说什么,省略什么。

大多数人做研究是方式是尝试解决一堆相关的问题,找到一些合适的框架来解决它们,然后对我们的解决方案进行归纳和抽象。比如说,问题是找出一个函数是否对其参数求值,那么合适的框架可能是指称语义,而泛化可能是抽象解释。如果在演讲时只展示框架和抽象,而忽略我们用来指导工作的示例,听众很难理解我们所展示的东西。因此我们在表达观点时,需要用例子来证明我们的观点,当我们给出一个属性的定义,一个数学结构或者是一些新的符号,我们需要举例子说明这个定义包含了什么,距离说明它在实践中的含义。在我们写论文时也要注意细节,正确陈述我们的观点,在准备演讲时要一遍遍问自己有没有用例子来说明这个想法/定理/定义/技术/算法。

由于我们的听众中肯定有部分人根本不知道我们分享的领域,因此我们得花一定时间对我们的研究领域进行介绍,但是要避免花太长的时间在介绍研究领域上,否则容易让听众感到厌烦,要直接用一个例子来说明我们要解决的问题,一般用一张PPT列出关于演讲主题的工作,或者对演讲内容进行抽象描述。

在演讲中,我们不能试图隐瞒我们遇到的困难,因为有些观众会发现这些困难,我们可以在演讲中提出这些困难,可能会有观众给我们提出有帮助的建议。

在一张PPT上,人们只能阅读并获取很少的信息,因此一张PPT上有六七个关键点就足够了。在做PPT时,我们要注意PPT不是用来反复强调我们打算说什么,而是应该把我们打算说的东西进行浓缩成关键点,口头进行介绍,而不只是读PPT。

在演讲开始时,要先放一张PPT,给出讲解的大纲,大概讲解一分钟,在演讲进行到三分之一时,要用一张幻灯片说这“这是我到目前为止讨论的内容,现在我将涵盖这些领域”,这样可以帮助我们的听众重新定位,便于他们理解,如果他们有问题可以直接问出来。

我们不要急着做PPT,要先花一两个星期仔细考虑我们要说什么,在演讲的前一天把PPT做好,这样的好处是,当我们在演讲时,PPT的内容在我们脑海中绝对有印象,我们把脑海中的想法讲出来就好。

在演讲前一定要尝试稳定的深呼吸和放松练习,尽量让自己平静下来,如果可以做到和观众进行眼神交流,就这样做,可以提升演讲的效果。

做PPT时我们尽量不要加动画,不同的内容最好放在不同的PPT上,而不是一行行展示要讲的内容。