前置知识:汇编代码需要会看能看懂就行,c语言代码要看得懂,因为大部分漏洞都是通过查看c语言代码来寻找的
工具汇总:ida pro、pwntools、pwndbg(dbg-peda)、checksec、ROPgadget、one_gadget、LibcSearch、main_arena_offset
工具部分内容介绍:
ida pro:
要注意二进制文件是64位还是32位,要用不同的ida打开
f5:显示伪c代码,因为他会用一些自己的符号来标记一些东西,这个打开一个叫ders.h的文件就能看见,不过不影响我们大致理解这个程序
x:查看符号的引用,选中一个符号后按x可以显示哪里引用了x
options->General->Disassembly->Line Prefixes:可以在反汇编窗口显示代码的地址,方便使用gdb直接在某个内存地址下断点
shift + f12显示字符串窗口:可以方便地定位关键代码的位置
shift + f7 显示段窗口
n:重命名符号:可以用一个更直观的名字命名符号,方便自己理解代码
x:执行交叉引用,可以查看程序哪个地方调用了该函数
gdb:
下断点:b 函数名、b 地址
运行:run(r)
继续执行:continue
单步执行:n
单步切入:si
跳出函数:finish(函数在内部还是会吧剩下的执行完)、return 返回值(函数后面的代码不会执行而是直接返回并且返回给的值)
查看寄存器信息:info registers
查看内存:x/wx内存地址(以十六进制,4字节显示指定内存的值)、x/gx 内存地址 (以十六进制,8字节显示指定内存的值)、x/wi 内存地址(以指令的形式显示)
context:显示程序当前的上下文包括寄存器、cpu指向的指令、栈
jmpcall:显示text段的call和jmp指令
pattern_create和pattern_offset:用于确认溢出点位置
searchmem:可以在内存中搜索字符串
vmmap:显示内存中的各个段,段地址及读写执行的属性
quit:退出
heap:查看每个堆的结构
bins:查看每个bin的情况
start:执行程序,并停在第一条汇编指令
c:继续执行程序,直到下一个断点
stack:查看栈的内容
pwntools:
context.log_level=‘debug’:可以清楚看到程序和pwntools间交互的数据,在检查
程序泄露数据的时候很方便
p.send:发送消息,消息不存在换行符
p.sendafter:当接收到某个特定的字符后才会发送
p.sendline():发送信息后换行
p.recv:接收消息,直到超时
p.recvline:接收消息,直到换行
p.interactive:进入交互模式,通常在获取shell后使用
p.recvuntil(字符串):可以读取到指定字符串之后停止
p.recvrepeat(timeout):停止一段时间后读入
gdb.attach(p, ’b * 0xfa’):启动gdb,注意需要sudo权限启动脚本
p64、p32、u64、u32:根据设置的context选择小端法或大端法对数字进行编码或者解码,p是编码,u是解码
sleep(0.1):休眠0.1秒,这个是在连续send两个东西后pwntools会给他们合并成一个发送,然后我们要把它们分开就可以用这个延时函数,先发送一个,休眠一会,再发送一个,记得要在开头加个from time import调用time这个库
process:拉起一个本地程序,返回一个进程对象
remote:远程链接到服务器
log.info:打印信息
checksec:
checksec ./二进制文件名:可以查看二进制文件是64位还是32位以及它开的保护措施
LibcSearch:
libc=LibcSearcher('函数名', 函数地址)
这个可以自动搜寻符合条件的libc库,不过因为没有维护所以可能有些库搜不到不过大部分时候都很好用,也可以使用另一个网站,好用的网站
linux指令:
echo 内容 > 文件名:把内容输入到文件里,会覆盖原内容
ls:查看当前目录下的文件
ll:查看文件以及文件权限
pwd:打印当前绝对路径
mkdir:创建目录
whoami:查看当前用户
cd..:返回上一个文件夹
cd /路径:打开文件夹
touch 文件名:新建文件名
vim 文件名:编辑文件
cat 文件名:打印文件
rm -rf 文件名:删除文件
chmod +x ./文件名:让文件获得权限,通常是没法gdb运行的时候用
file 文件名:查看文件名信息,其中LSB表示小端序,LMB表示大端序
小端序:类似于0x87654321,那么问题来了他在内存是怎么存的呢,我们知道内存是从低地址到高地址存的,那么我们小端法就是低位存到低地址,看下表
地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
值 | 21 | 43 | 65 | 87 |
大端序:就是和小端序相反,高位数字存到低地址,看表
地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
值 | 87 | 65 | 43 | 21 |
c语言编译汇编:
gcc -E test.c -o test.i:test.c的代码预处理成test.i
gcc -S test.i -o test.s:test.i的文件编译成test.s
gcc -c test.s -o test.o:test.s的文件汇编成test.o
gcc test.o -o test:test.o链接成test的可执行文件