Pwn学习随笔( 九 )


其他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那样显示数据 , 带字符串
Return Oriented Programming缓冲区溢出攻击的普遍发生给计算机系统造成了许多麻烦 。现代的编译器和操作系统实现了许多机制 , 以避免遭受这样的攻击 , 限制入侵者通过缓冲区溢出攻击获得系统控制的方式 。
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的方法来绕过
The strategy with ROP is to identify byte sequences within an existing program that consist of one or more instructions followed by the instruction ret. Such a segment is referred to as a gadget
ROPgadget
ROP是用来绕过NX保护的 , 开启 NX 保护的话 , 栈、堆的内存空间就没有执行权限了 , 直接向栈或者堆上直接注入代码的攻击方式就无效了 。
ROP的主要思想是在栈缓冲区溢出的基础上 , 利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值 , 从而控制程序的执行流程 。所谓 gadgets 就是以 ret 结尾的指令序列 , 通过这些指令序列 , 我们可以修改某些地址的内容 , 方便控制程序的执行流程 。
ROP 攻击一般得满足如下条件
  • 程序存在溢出 , 并且可以控制返回地址 。
  • 可以找到满足条件的 gadgets 以及相应 gadgets 的地址 。
  • 如果 gadgets 每次的地址是不固定的 , 那我们就需要想办法动态获取对应的地址了 。‘
ROP其实就是利用已存在的代码执行出我们想要的效果 , 如下图所示 , 分为多个gadget , 每一个gadget都是一段指令序列 , 最后以ret指令(0xc3)结尾 , 多个gadget中的指令形成一条利用链 , 一个gadget可以利用编译器生成的对应于汇编语言的代码 , 事实上 , 可能会有很多有用的gadgets , 但是还不足以实现一些重要的操作 , 比如正常的指令序列是不会在ret 指令前出现pop %edi指令的 。幸运的是 , 在一个面向字节的指令集 , 比如

经验总结扩展阅读