CVE-2015-7036
CVE-2015-7036漏洞简介该漏洞是由于sqlite中fts3_tokenizer函数自身的不安全特性所引起的
这个函数存在以下的问题:
信息泄露
fts3_tokenizer将注册的 tokenizer 的地址作为 BLOB 返回,查询内置标记器可能会泄漏 sqlite 模块的基地址(大端)
对不受信任的指针解引用
fts3_tokenizer 认为第二个参数始终是指向 sqlite3_tokenizer_module 的有效指针,它永远无法知道参数的真实类型
基于此漏洞,我们可以通过sql语句实现任意命令执行
在官网可以找到这样一段:
https://www.sqlite.org/compile.html#enable_fts3_tokenizer
此选项启用 fts3_tokenizer() 接口的两个参数版本。 fts3_tokenizer() 的第二个参数假设是一个指向实现应用程序定义的标记器的函数(编码为 BLOB)的指针。 如果敌对参与者能够使用任意第二个参数运行 fts3_tokenizer() 的双参数版本,他们可以使用崩溃或控制进程。
出于安全考 ...
Diary
2022.04.17,今天开个新坑,记录下每周所学
2022.04.11-2022.04.17
完成了CS143的语义分析部分,写代码5分钟,修bug两小时,代码后面传到GitHub
用inoreader整了下rss订阅,感觉非常棒,手机也可以下inoreader,每天路上或是空闲时间啥的刷一刷倒也不错
2022.04.18-2022.04.24
完成了CS143的代码生成部分,也是最后一个部分,大部分的生产力来源于ctrl+c && ctrl+v
Mark一下这周看到的几篇文章:
A Syscall Journey in the Windows Kernel:之前我博客发过Linux的系统调用,根据源码对Linux的系统调用跟了一遍,这次恰好看到个Windows的文章,平时Windows玩得少但是还是有必要拓展知识面的,这几天之内翻译一下
PWN2OWN MIAMI 2022 RESULTS:pwn2own的赛果,为啥要mark这篇呢,原因就是这里除了比赛结果之外,还附上了这些大佬的推特,可以关注一哈
还有就是这周看的几个fuzz:
driller
T-Fuzz ...
CS143: PA4
前言本章为语义分析的实验,通过编写c++代码来完成对语义的检测
How to start在开始之前,需要先看下PA4里面的一些代码,这些代码在前面的语法分析其实已经用到了
主要为:cool-tree.h cool-tree.handcode.h semant.h semant.cc,再加上symboltabe的使用:
symtab_example.cc include/PA4/symtab.h
其实在学习学校课程的时候,一开始我看目录的时候就在想,语法分析和语义分析的区别是?
其实很简单,例如在自然语言中,“我吃鸡肉”这个句子,从语法和语义上来讲都是正确的,主谓宾
但反过来,“鸡肉吃我”,语法上也是对的,主谓宾正确,但语义上有问题
放在编程语言中,比如重复定义一个类,从语法上来说没毛病,但语义上看,类可能不能重复定义
所以理解起来其实不难,从字面上看就可以,语法分析检查语言的格式但并不关心具体的含义
一些步骤语义分析需要的一些步骤,大致如下:
分析类的语义
创建类表,用于记录各个类
安装基本类Object,Str,Int,Bool,Io
安装各个用户定义的类并检查SELF_T ...
CS143: PA3
前言本章为针对语法分析的第三个实验
语法分析主要就是检测是否符合该语言的语法,比如检查你一个完整的句子是否有主谓宾等
需要的一些前置知识,首先还是flex跟bison的手册(重点看第三章):
flex手册
bison
然后是COOL的手册(重点关注16、17页):
COOL手册
How to start问题来了,语法分析怎么写
首先重点看下COOL手册的第16页,其中有对COOL语法的描述,然后结合bison手册来编写相应的语法即可
重点看下前几个:
program:程序由一个或多个类组成
class:一个类的定义应为class xxx,后面可跟继承某个类,一个类由0个或多个feature构成(feature就是类里面的方法)
feature:feature的定义有两种形式,一个是包含一串formal的(其实formal就是参数)
formal定义:ID: TYPE
由此,我们可以定义一个class_list来表示[class;]+,因此class_list必定不为空
用feature_list来表示[feature;]*,feature_list可能为空
用formal_lis ...
CS143: PA2
前言看了一会儿第二章的理论知识,感觉跟学校之前上课学的差不多,所以看起来顺了很多,幸好曾经选了编译原理
这个PA2的实验就是针对第二章——词法分析的
做实验的难度在于
需要对COOL语言熟悉
需要对flex所熟悉
关于COOL编程语言,查看手册(重点关注10、11章节):
https://web.stanford.edu/class/cs143/materials/cool-manual.pdf
关于flex的话,教程也很多,手册:
http://westes.github.io/flex/manual/
How to start那么本实验该如何下手呢?
词法分析首先得理解词法分析的作用是什么,输入应该是什么,输出应该是什么
总结来说,词法分析的工作过程如下所示:
词法分析器会对输入的字符串进行切割和分类,给子字符串(substring)赋予标记类(class),然后将<class, substring>的序列对传给语法分析器,其中,<class, substring>就称为token(词法单元)
例如,"foo = 42"的处理结果即 ...
CS143: 第二章-词法分析
词法分析小例子1234if (i == j) z = 0;else z = 1;
如上,词法分析需要将其转换成token(词法单元),例如关键字if,else,变量i,j,z,关系运算符==
对于词法分析器来说,这段代码是以下这样一个线性字符串:
1\tif (i == j)\n\tz = 0;\n\telse\n\t\tz = 1;
词法分析器将对此字符串进行切割和划分,根据不同字符串元素作用进行分类
符号在日常语言中,分为动词,名词,形容词……
在编程语言中,分为关键字,数字,标识符……
标识符(Identifier):以字母开头的字母或数字字符串
整数(Integer):非空数字字符串
关键字(Keyword):if,else,begin
空白(Whitespace):空格换行制表符
工作过程总结来说,词法分析的工作过程如下所示:
词法分析器会对输入的字符串进行切割和分类,给子字符串(substring)赋予标记类(class),然后将<class, substring>的序列对传给语法分析器,其中,<class, substring> ...
CS143: 第一章
来自斯坦福大学的编译原理课程,课程已收录到edx,b站有部分中文翻译的视频
课程地址
课程目录
01-01 Introduction实现编程语言的两种方式:Compilers(编译器)和Interpreters(解释器)
解释器和编译器的区别:
在解释器执行程序前,不需要对这个程序做任何处理,解释器是整个程序运行的一部分
编译器的功能:编译是生成机器码的预处理过程
01-02 Compilers编译器的结构:
Lexical Analysis(词法分析)
Parsing(语法分析)
Semantic Analysis(语义分析)
Optimization(优化)
Code Generation(代码生成)
词法分析的目标就是将程序代码文本按照它的方式进行分词,就是编译器说话时对词的区分
02-01 COOL Overview本次学习将以COOL语言为例,实现COOL语言的编译器,将其翻译成mips汇编语言
由于COOL语言被大量用于编译器教学,因此其可能也是少有的编译器数量多于COOL程序数量的语言
首先需要配环境:
12wget https://courses.edx.or ...
Linux内核:保护模式进阶
保护模式进阶本章为之前学习《操作系统真相还原》一书时候的笔记,内容为第五章
获取物理内存容量学习Linux获取内存的方法在Linux 2.6内核中,获取内存是通过detect_memory函数来获取内存容量的,其函数本质上通过BIOS的0x15中断实现,0x15中断的三个子功能:
EAX=0xE820,遍历主机上全部内存
AX=0xE801,分别检测低15MB和16MB~4GB的内存,最大支持4GB
AH=0x88,最多检测出64MB内存,实际内存超过容量也按64MB返回
BIOS中断位实模式下的方法,因此要在进入保护模式前调用,如果一种方法失败会尝试另一种方法,如果都失败了则停止运行
利用BIOS中断0x15子功能0xe820获取内存0xe820子功能返回的内存信息较丰富,使用地址范围描述符来描述:
type字段用来描述这段内存的类型和用途:
同时,该子功能的中断参数说明:
利用BIOS中断0x15子功能0xe801获取内存该子功能最大只能识别4GB内存
说明:
利用BIOS中断0x15子功能0x88获取内存该子功能最简单,最多只能识别64MB大小内存
使用说明:
启用 ...
Linux内核:保护模式初级
保护模式初级前言本章为之前学习《操作系统真象还原》一书所做的笔记
内容为第四章、第五章的保护模式
全局描述符表全局描述符表( Global Descriptor Table, GDT )是保护模式下内存段的登记表,这是不同于实模式的显著特征之一
段描述符首先,对于 IA32 架构的处理器(就是我们大多数人现在所用的处理器),访问内存采用“段基址:段内偏移地址”形式,即使到了保护模式,也是绕不开这个限制的
同时,为了保证内存访问的安全问题,保护模式应运而生
在之前的16位模式下,内存访问的上限收到了寄存器的限制,为此人们甚至需要将16位寄存器左移4位来扩大寻址空间,由此,通过内存寻址的想法就有了,因为其不受寄存器大小限制,而且还可以为段添加上更多的描述信息
段描述符如下:
段描述符的大小为8字节64位
段界限
段界限表示段边界的扩展最值,以限制内存访问的范围
在代码段和数据段,段的扩展方向是向上,在栈段,扩展方向为向下
可以看到段界限由20个比特位共同描述,而最终段的边界为段界限值 * 单位,单位要么为1字节,要么为4kb(2^12次方字节),所以段大小要么为2^20=1MB大小,要 ...
CodeQL U-Boot for C/C++
前言这是一个来自github learning lab的项目:
CodeQL U-Boot Challenge (C/C++)
Step1:Welcome本课程是为了帮助您快速学习 CodeQL,我们的查询语言和代码分析引擎。 目标是使用 CodeQL 及其库分析 C/C++ 代码,在称为 U-Boot 的开源软件中找到几个远程代码执行 (RCE) 漏洞。 要找到真正的漏洞,您需要编写一系列查询,使它们在课程的每一步都更加精确
Writing a basic C++ Code QL query
Introduction to CodeQL
CodeQL Docs
Step2:安装环境CodeQL的安装无需多言,
在此处下载U-Boot的代码数据库:
U-Boot download
然后将其加入工作区即可
Step3:第一条查询语句这里我们要完成第一个查询语句:找到名称为strlen的函数
编辑3_function_definitions.ql,代码如下:
12345import cppfrom Function fwhere f.getName() = "strlen&q ...