概要

one_gadget是libc中存在的一些执行execve("/bin/sh", NULL, NULL)的片段,当可以泄露libc地址,并且可以知道libc版本的时候,可以使用此方法来快速控制指令寄存器开启shell。

相比于system("/bin/sh"),这种方式更加方便,不用控制RDI、RSI、RDX等参数。运用于不利构造参数的情况。

安装及使用方式

  • 首先需要安装Ruby(Ruby < 2.4 会导致one_gadget无法安装,最好是通过添加仓库的方式安装)

    # 添加仓库
    sudo add-apt-repository ppa:brightbox/ruby-ng
    sudo apt-get update
    # 指定ruby 2.6版本
    sudo apt-get install ruby2.6 ruby2.6-dev # 贴一条删除旧版本ruby的命令
    sudo apt-get purge --auto-remove ruby
  • 然后安装one_gadget

    sudo gem install one_gadget
  • 使用方法很简单

    one_gadget libc.so.6

踩坑记录

  • one_gadget并不总是可以获取shell,它首先要满足一些条件才能执行成功(如果没有满足条件也执行成功了,那纯粹就是靠脸了)

    unravel@unravel:~/Desktop/note$ one_gadget libc-2.23.so
    
    0x45226 execve("/bin/sh", rsp+0x30, environ)
    constraints:
    rax == NULL # 这个提示的意思就是在调用one_gadget前需要满足的条件 0x4527a execve("/bin/sh", rsp+0x30, environ)
    constraints:
    [rsp+0x30] == NULL 0xf03a4 execve("/bin/sh", rsp+0x50, environ)
    constraints:
    [rsp+0x50] == NULL 0xf1247 execve("/bin/sh", rsp+0x70, environ)
    constraints:
    [rsp+0x70] == NULL
  • 这次祥云杯我就是遇到这种情况,one_gadget无法调用,原因是我将one_gadget写入了_malloc_hook中,_malloc_hook会使用jmp rax来执行代码,所以在执行one_gadget时,rax必定不为NULL,只能排除第一个one_gadget。而其他三个one_gadget均无法满足要求,后来是利用realloc 函数来多push几个参数到栈上,而此时恰好满足one_gadget的条件,也就可以获取shell了。

总结

以前从来没注意过one_gadget的调用过程,借这次比赛机会了解了一下,也学到了很多小技巧,在这里记录一下。

  • 如果是使用_malloc_hook来调用one_gadget,那么需要配合realloc来构造所需参数,realloc在libc中的符号是__libc_realloc
  • 如果是使用其他方式调用one_gadget,比如说修改GOT表,那么需要在栈上提前构造好参数,或者将rax寄存器清零
  • 在泄露libc地址的时候,最好是泄露read函数的地址,因为read函数距离one_gadget的偏移是不会变的,只需要将read函数真实地址减去0x6109,就可以使用one_gadget了,具体可以自行调试一下便知。那这么做的好处就是不用去知道libc的版本,省了很大一部分时间和精力,libc版本是个坑,懂的都懂。

最新文章

  1. CTP程序化系统开发(C++ &amp;&amp; PHP)
  2. R for循环之break,next
  3. JS-面向对象
  4. 【leetcode】Find Peak Element
  5. Android系统框架
  6. APICloud云修复再升级 增加热重启APP功能
  7. 堆heap和栈Stack(百科)
  8. SQL疑难杂症【2】解决SQL订阅过程中找不到已经创建的订阅
  9. select2 插件
  10. Codeforces Round #226 (Div. 2 )
  11. width() innerwidth() outerwidth() css(&#39;width&#39;)
  12. XtraForm中OfficeSkins以及BonusSkin皮肤的设置
  13. EL标签和JSTL标签---JSP页面的应用
  14. bzoj-3450 Easy概率DP 【数学期望】
  15. MyBatis使用statementType=&quot;STATEMENT&quot;
  16. Delphi下的WinSock编程
  17. Python:Day46 Javascript DOM
  18. 编写 python 小程序,将LOL官网的皮肤保存下来,上传百度云,记录那些强撸灰飞烟灭的日子
  19. 【转载】Ocelot网关的路由热更新
  20. 全面对比T-SQL与PL/SQL

热门文章

  1. 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 第39级台阶
  2. ARM汇编指令-STM32单片机启动
  3. 测试基础(四)Jmeter基础使用
  4. 章节1-Grafana Dashboard的简单应用(2)
  5. Mongo基于Java基本操作
  6. 传统.NET 4.x应用容器化体验(2)
  7. C语言:GB2312编码和GBK编码,将中文存储到计算机
  8. python twain 扫描
  9. 家庭账本开发day11
  10. [刘阳Java]_TortoiseSVN基础应用_第1讲