前面两篇文章中已经讲解了protobuf的结构以及生成代码的分析,这篇文章简单的介绍一下protobuf的使用。这里主要跟着libprotobuf-mutator_fuzzing_learning项目进行结构感知模糊测试练习
编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノ
PS:文章末尾有联系方式,交个朋友吧~
本文链接:https://hollk.blog.csdn.net/article/details/124680716
编译protobuf模糊测试系列往期回顾:
【Custom Mutator Fuzz】Protocol Buffer基础(下):C++生成代码介绍 + 配套代码
【Custom Mutator Fuzz】Protocol Buffer基础(上):proto2编写格式
【Custom Mutator Fuzz】libprotobuf-mutator安装
LibFuzzer学习(三):使用小trick
LibFuzzer学习(二):提高代码覆盖率和速度
LibFuzzer学习(一):轻松找到心脏出血漏洞
Fuzz出结果不会看?Address Sanitizer(ASan)各类溢出demo分析
Fuzzing101 Exercise 5 - LibXML2 学习笔记
Fuzzing101 Exercise 4 - LibTIFF 学习笔记
Fuzzing101 Exercise 3 - TCPdump 学习笔记
Fuzzing101 Exercise 2 - Libexif 学习笔记
Fuzzing101 Exercise 1 - Xpdf学习笔记
AFL源码分析之afl-fuzz.c详细注释(二):FUZZ执行流程(五万字警告,慎入)
AFL源码分析之afl-fuzz.c详细注释(一):初始配置(6万字警告,慎入)
AFL源码分析之afl-gcc.c详细注释
AFL源码分析之afl-as.c详细注释
免费资源:AFL-2.57b.zip(AFL源码分析章节版本)
syntax = "proto2";
message Hollk {
required uint32 a = 1;
required string b = 2;
}
这里定义了一个required的无符号整型a,和一个required的字符串类型b。接下来使用前面【Custom Mutator Fuzz】libprotobuf-mutator安装中已经装好了的protoc编译器编一下:
/home/hollk/libprotobuf-mutator/build/external.protobuf/bin/protoc-3.17.3.0 ./test.proto --cpp_out=./
接下来就可以在当前目录下看到hollk.pb.h和hollk.pb.cc两个文件了
编写protobuf测试程序我们希望能在测试程序中对a和b进行赋值并且输出,因此代码如下:
#include "hollk.pb.h" #includeusing std::cin; using std::cout; using std::endl; int main(int argc, char *argv[]) { Hollk hollk; hollk.set_a(101); hollk.set_b("testtest"); cout << hollk.a() << endl; cout << hollk.b() << endl; return 0; }
这个测试程序主要是用来为proto数据进行赋值和输出的,一起看一下这个过程。首先将编译好的hollk.pb.h include进代码中,后面会用到其中的方法。接着构造出一个hollk,利用set_a()函数和set_b()函数进行赋值,对a赋值为整型的101,对b赋值为字符串类型的testtest。接着输出a()函数和b()函数(其中用到的方法函数用法可以在上一篇【Custom Mutator Fuzz】Protocol Buffer基础(下):C++生成代码介绍 + 配套代码文章中看到解释)
编写Makefile文件CXX=clang++ PB_SRC=hollk.pb.cc PROTOBUF_DIR=$(HOME)/libprotobuf-mutator/build/external.protobuf PROTOBUF_LIB=$(PROTOBUF_DIR)/lib/libprotobufd.a INC=-I$(PROTOBUF_DIR)/include test_proto: test_proto.cc $(PB_SRC) $(CXX) -o $@ $^ $(PROTOBUF_LIB) $(INC) .PHONY: clean clean: rm test_proto
- CXX:指定编译器为clang++(如果提示没有,就直接apt装一下clang)
- PB_SRC:protobuf生成的C++源码
- PROTOBUF_DIR:protobuf位置(可参考【Custom Mutator Fuzz】libprotobuf-mutator安装)
- PROTOBUF_LIB:protobuf动态链接库libprotobufd.a
- INC:将protobuf的include目录添加到包含文件的搜索路径
- $@:目标文件
- $^:所有依赖
接下来只要make就可以创建出proto_test程序了:
运行test_proto程序运行test_proto程序就可以看到之前set_a()函数和set_b()函数设置的两个值了:
这就是protobuf的简单利用,后面文章中的几个例子也需要protoc-3.17.3.0编译器创建的hollk.pb.h和hollk.pb.cc两个文件,不然会出现错误
参考链接
https://github.com/bruce30262/libprotobuf-mutator_fuzzing_learning
交个朋友吧~扫描下方微信二维码,一起讨论研究



