学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1169

主题
发表于 2020-6-11 00:21:32 | 查看: 6789| 回复: 1

相关题目:


Linux x64 下的万能 Gadget  来源:香依香偎@闻道解惑
一、通用 Gadget  蒸米在《一步一步学ROP之linux_x64篇》中提到,在栈溢出的场景下,只要 x64 程序中调用了 libc.so,就会自带一个很好用的通用Gadget:__libc_csu_init()

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
  如图,先从 0x40061A 开始执行,将 rbx/rbp/r12/r13/r14/r15 这六个寄存器全部布置好,再 ret0x400600 ,继续布置 rdx/rsi/rdi,最后通过 call qword ptr[r12+rbx*8] 执行目标函数。
  这个通用 Gadget 好用的地方在于,不仅可以通过函数地址的指针(通常会用记录库函数真实地址的 got 表项)来控制目标函数,还可以控制目标函数的最多三个入参(rdi/rsi/rdx)的值。此外,只要设置 rbp=rbx+1而且栈空间足够,这个 Gadget 可以一直循环调用下去。
  计算一下一次调用需要的空间。
  可以看出,这个 Gadget 需要布置六个寄存器(rbx/rbp/r12/r13/r14/r15)加一个 ret 返回地址,x64 下至少需要 56 个字节的栈空间。如果再算上将 rip 指令跳转进来(0x40061A)的一个 ret 地址,那就是 64 字节的栈空间。
  栈的布置如下:

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
二、隐藏 Gadget:pop rdi,ret  其实,这个通用 Gadget 里,还隐藏了两个更简单的 Gadget

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
  将地址 0x400622pop r15,ret 的三字节指令(0x41 0x5F 0xC3)拆散看,会发现后两个字节组成了一组新的指令 pop rdi,ret

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
  这已经足够完成单入参的函数调用了。
  通常栈溢出之后,需要进行如下两步:
  •   1、通过类似 puts(puts) 的方式,泄漏libc库函数的地址,从而通过偏移计算出 system 函数和 "/bin/sh" 字符串的地址
  •   2、执行 sytem("bin/sh") 获得系统 shell

  发现没有?大多数情况我们只需要一个入参的函数调用, __libc_csu_init() 函数最后的这个 pop rdi,ret 可以完美实现上述两个步骤。
  空间上,只需要 24 个字节(一个 QWORD 存放 ret 进来的地址,两个 QWORD 作为入参和被调用函数地址)的溢出空间就足够啦。
  栈的空间布置如下:

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
  那,如果需要调用两个入参的函数呢,这个 Gadget 也行么?是的。
三、隐藏 Gadget:pop rsi,...,ret  将地址 0x400620pop r14 的两字节指令(0x41 0x5E)拆散,会发现后一个字节是单字节指令 pop rsi,可以用来控制第二个入参。

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
  和前述的地址 0x400623 上的指令 pop rdi,ret组合起来,就可以完成两个入参的函数调用。

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
  只需要将栈布置如下就可以啦。

Linux x64 下的万能 Gadget

Linux x64 下的万能 Gadget
四、总结
  •   1、只要Linux x64 的程序中调用了 libc.so,程序中就会自带一个很好用的通用Gadget:__libc_csu_init()
  •   2、__libc_csu_init()0x4006000x400624 其中包含了 pop rdipop rsipop rdxret 等指令,通过巧妙的组合可以实现调用任意单参数、双参数、三参数的函数,从而顺利泄漏libc函数地址并且获取系统 shell
  •   3、__libc_csu_init() 不只是一个通用 Gadget,完全就是“万能 Gadget”!

参考阅读:  [1] 蒸米《一步一步学ROP之linux_x86篇》:https://zhuanlan.zhihu.com/p/23487280
  [2] 蒸米《一步一步学ROP之linux_x64篇》:https://zhuanlan.zhihu.com/p/23537552


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
已有 1 人评分学币 理由
钞sir + 2

总评分: 学币 + 2   查看全部评分

论坛交流群:672619046

    发表于 2023-7-17 10:45:54
    用心讨论,共获提升!

    小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

    GMT+8, 2024-12-4 01:35 , Processed in 0.125486 second(s), 48 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表