其他pwndbg插件独有指令
cyclic 50
//生成50个用来溢出的字符 , 如:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama$reabse
//开启PIE的情况的地址偏移b *$reabse(0x123456)
// 断住PIE状态下的二进制文件中0x123456的地方codebase
//打印PIE偏移 , 与rebase不同 , 这是打印 , rebase是使用
stack
//查看栈retaddr
//打印包含返回地址的栈地址canary
//直接看canary的值plt
//查看plt表got
//查看got表hexdump
//像IDA那样显示数据 , 带字符串
Performing code-injection attacks on program RTARGET is much more difficult than it is for CTARGET, because it uses two techniques to thwart such attacks:
- It uses randomization so that the stack positions differ from one run to another. This makes it impossible to determine where your injected code will be located. 开启了PIE 保护(栈随机化)
- It marks the section of memory holding the stack as nonexecutable, so even if you could set the program counter to the start of your injected code, the program would fail with a segmentation fault. 开启了
NX
保护(栈中数据不可执行) - 此外 , 还有一种栈保护 , 如果栈中开启Canary found , 金丝雀值 , 在栈返回的地址前面加入一段固定数据 , 栈返回时会检查该数据是否改变 。那么就不能用直接用溢出的方法覆盖栈中返回地址 , 而且要通过改写指针与局部变量、leak canary、overwrite canary的方法来绕过
ROPgadget
ROP是用来绕过NX保护的 , 开启 NX 保护的话 , 栈、堆的内存空间就没有执行权限了 , 直接向栈或者堆上直接注入代码的攻击方式就无效了 。
ROP的主要思想是在栈缓冲区溢出的基础上 , 利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值 , 从而控制程序的执行流程 。所谓 gadgets 就是以 ret 结尾的指令序列 , 通过这些指令序列 , 我们可以修改某些地址的内容 , 方便控制程序的执行流程 。
ROP 攻击一般得满足如下条件
- 程序存在溢出 , 并且可以控制返回地址 。
- 可以找到满足条件的 gadgets 以及相应 gadgets 的地址 。
- 如果 gadgets 每次的地址是不固定的 , 那我们就需要想办法动态获取对应的地址了 。‘
ROP
其实就是利用已存在的代码执行出我们想要的效果 , 如下图所示 , 分为多个gadget
, 每一个gadget
都是一段指令序列 , 最后以ret指令(0xc3
)结尾 , 多个gadget
中的指令形成一条利用链 , 一个gadget
可以利用编译器生成的对应于汇编语言的代码 , 事实上 , 可能会有很多有用的gadgets
, 但是还不足以实现一些重要的操作 , 比如正常的指令序列是不会在ret
指令前出现pop %edi
指令的 。幸运的是 , 在一个面向字节的指令集 , 比如
经验总结扩展阅读
- 四十一 增删查改分页 Java开发学习----MyBatisPlus标准数据层开发
- 中 学习ASP.NET Core Blazor编程系列十——路由
- CC1,3,6回顾
- 图学习【参考资料2】-知识补充与node2vec代码注解
- 二十四 设计模式学习:Spring 中使用到的设计模式
- Java安全之CC3
- TensorFlow深度学习!构建神经网络预测股票价格!?
- JUC学习笔记——共享模型之管程
- Seata Server 1.5.2 源码学习
- 2022极端高温!机器学习如何预测森林火灾?? 万物AI