[PWN][基础篇]什么是Canary保护

什么是Canary


在这里插入图片描述
有无Canary呢就是在函数压栈的时候,函数刚开始执行的时候,它会多一个参数,也就是在ebp的上面,会压入一个Canary的值,在子函数验证完之后,对比Canary的值,看看是否相等。不相等,代表程序被修改,产生了异常。

本次实验教学代码如下:
实验目的,对比有无Canary保护的程序有何不同
在这里插入图片描述

gcc -m32 -no-pie -fno-stack-protector -o canary canary.c 

-m32 32位程序
-no-pie 中间没有空格
-fno-stack-protector 关闭canary保护
-o 输出

生成之后图片有锁,输入指令chmod 777 canary 进行提权

下一步我们使用gdb开始调试
在这里插入图片描述补充的知识:
什么是堆栈内存对齐
and esp 0xfffffff0
主流编译器的编译规则规定“程序访问的地址必须向16字节对齐(被16整除)”内存对齐之后可以提高访问效率。

加入保护的gcc指令:

gcc -m32 -no-pie -fstack-protector-all -o canary canary.c

加入保护后如下图:

在这里插入图片描述

gdb指令复习

s step,si步入
 
n 执行下一条指令 ni步入
 
b 在某处下断点,可以用
 
b * adrress
 
b function_name
 
info b 查看断点信息
 
delete 删除所有断点
 
c 继续
 
r 执行
 
finish 执行完当前函数返回到调用它的函数。运行程序,直到当前函数运行完毕返回再停止。例如进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish.  
 
(gdb) until(gdb) u  指定程序直到退出当前循环体这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。
 
(gdb) jump 5 跳转执行程序到第5行:这里,可以简写为"j 5"需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。
 
另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list。
 
(gdb) return 强制返回当前函数: 这样,将会忽略当前函数还没有执行完毕的语句,强制返回。return后面可以接一个表达式,表达式的返回值就是函数的返回值。
 
disas addr 查看addr处前后的反汇编代码
 
disas functions 参看fucntion函数的反汇编代码
 
p 系列
 
p system/main 显示某个函数地址
 
p $esp 显示寄存器
 
p/x p/a p/b p/s。。。
 
p 0xff - 0xea 计算器
 
print &VarName 查看变量地址
 
p * 0xffffebac 查看某个地址处的值
x系列
 
命令格式:x/<n/f/u> <addr>
 
n是一个正整数,表示需要显示的内存单元的个数
 
f 表示显示的格式(可取如下值: x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量。f 按浮点数格式显示变量。)
 
u 表示从当前地址往后请求的字节数 默认4byte,u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节
 
<addr>表示一个内存地址
 
x/xw addr 显示某个地址处开始的16进制内容,如果有符号表会加载符号表
 
x/x $esp 查看esp寄存器中的值
 
x/s addr 查看addr处的字符串
 
x/b addr 查看addr处的字符
 
x/i addr 查看addr处的反汇编结果
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏华李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值