Using S2E to generate PoVs
Windows和linux类似,但是dbg
无法执行.exe
,无法验证漏洞,所以用linux演示。
S2E自带演示文本vulnerabilities
,源文件vulnerabilities.
1.创建guest-tools
~/s2e/build/s2e/
目录下有Windows/linux、32/64位工具,使用32位的linux版本
$ cd ~/s2e/build/s2e/guest-tools32
$ make
2.创建项目
$ cd ~/s2e/env
$ s2e new_project -i debian-9.2.1-i386 -n vuln-lin32-32 --enable-pov-generation \
build/s2e/guest-tools32/common/demos/vulnerabilities @@
-n
项目名:默认为分析程序的名字,这里自定义为vuln-lin32-32
-i
指定镜像:这里指定debian-9.2.1-i386
--enable-pov-generation
:生成PoVs@@
:标志,表明该程序已文件作为输入,运行时会替换为包含符号数据的实际文件。
3.启动S2E等待分析完成
$ cd ~/s2e/env/projects/vuln-lin32-32
$ ./launch-s2e.sh
目录~/s2e/projects/vuln-lin32-32/s2e-last
如下,
$ ls ~/s2e/env/projects/vuln-lin32-32/s2e-last
_tmp_input-crash@0x0-pov-unknown-0
_tmp_input-crash@0x0-pov-unknown-3
_tmp_input-recipe-type1_i386_generic_reg_ebp.rcp@0x8048760-pov-type1-0
_tmp_input-recipe-type1_i386_generic_reg_edi.rcp@0x8048760-pov-type1-0
_tmp_input-recipe-type1_i386_generic_shellcode_eax.rcp@0x804883e-pov-type1-3
...
这些具体输入文件可以证实漏洞,用这些文件做输入在GDB下运行该程序,
4.证实漏洞
$ gdb --args ./vulnerabilities s2e-last/_tmp_input-recipe-type1_i386_generic_shellcode_eax.rcp@0x804883e-pov-type1-3
(gdb) r
Starting program: /home/user/s2e/env/projects/vuln-lin32-32/vulnerabilities
s2e-last/_tmp_input-recipe-type1_i386_generic_shellcode_eax.rcp@0x804883e-pov-type1-3
Demoing function pointer overwrite
Program received signal SIGSEGV, Segmentation fault.
0x44556677 in ?? ()
(gdb) info registers
eax 0xccddeeff -857870593
ecx 0x44556677 1146447479
edx 0x40 64
ebx 0x0 0
esp 0xffffcd1c 0xffffcd1c
ebp 0xffffcd68 0xffffcd68
esi 0x804b008 134524936
edi 0xf7fa2000 -134602752
eip 0x44556677 0x44556677
eflags 0x10246 [ PF ZF IF RF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
程序在PC=0x44556677
是崩溃,此时eax=0xccddeeff
-
EAX 是”累加器”(Accumulator), 它是很多加法乘法指令的缺省寄存器。
-
EBX 是”基地址”(Base)寄存器, 在内存寻址时存放基地址。
-
ECX 是计数器(Counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
-
EDX 则总是被用来放整数除法产生的余数。