ret2syscall(pwn第二课)

xo.01 ret2syscall原理

ret2syscall,即通过ROP控制程序执行系统调用,获取 shell。

xo.02 ROP原理:
随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。攻击者们也提出来相应的方法来绕过保护,目前主要的是 ROP(Return Oriented Programming),其主要思想是
在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。

xo.03 gadgets:
所谓 gadgets 就是以 ret 结尾的指令序列。

例如:pop eax ; ret

这段代码的作用就是将栈顶的数据弹出给eax,然后再将栈顶的数据作为返回地址返回

假如我们通过栈溢出将eip覆盖为pop eax的地址,当程序返回的时候就会执行pop eax,将’aaaa’放到eax中,然后执行ret指令,将’bbbb’放入eip寄存器中,然后会执行地址为’bbbb’处的指令,可以看到,bbbb处的指令为xxxx,当执行完xxxx后,继续执行ret指令,然后会返回到cccc指令处,执行xxxx。system函数的本质也是一条条汇编指令的组合,如果我们能找到多个xxxx,ret结构的指令,将其连接在一起,就可以达到执行system函数的效果。

之所以称之为 ROP,是因为核心在于利用了指令集中的 ret 指令,改变了指令流的执行顺序,我们可以将多个gadget组合到一起,进而可以执行多条汇编指令,从而达到目的。ROP 攻击一般得满足如下条件

程序存在溢出,并且可以控制返回地址。
可以找到满足条件的 gadgets 以及相应 gadgets 的地址。

xo.04 获取gadgets的方式:
指令:

ROPgadget --binary 文件名 --only 'pop|ret' |grep '寄存器名'
ROPgadget --binary 文件名 --only 'int'
ROPgadget --binary 文件名 --string '/bin/sh'

xo.05 步骤

漏洞分析

使用checksec指令查看程序保护措施

checksec rop

可见该程序为32位,仅开启了NX堆栈不可执行,故不可以直接向堆栈中注入shellcode获取权限。

使用IDA32位进行调试

反汇编后可看到main函数如下

可以看到主函数中存在gets危险函数,可以利用gets修改main函数的返回值返回到我们所需的gadgets,从而进行想要执行的系统调用,在这里我们可以进行execve("/bin/sh",NULL,NULL)系统调用

通过在IDA中shift + F12查看字符串,我们可以看到存在/bin/sh字符串,地址为0x080BE408

我们可以直接利用这个字符串作为execve的第一个参数进行调用。

由上述原理可知,这里我们需要eax寄存器来存储系统调用号,利用其它寄存器来存储参数,再通过0x80触发中断

此处我们系统调用函数为execve,对应的系统调用号为0xb,故应给eax赋值0xb
execve函数的三个参数则分别对应着ebx、ecx、edx三个寄存器
ebx——0x080BE408/bin/sh字符串地址
ecx——0
edx
——0

如何给这些寄存器赋值呢?

汇编语言中有一条指令是pop xxx,可将栈顶数据弹出并存入xxx中,这个xxx可以为寄存器
我们就可以使用gets函数修改栈中数据,然后触发pop指令将这些数据存入栈中
那么如何指定pop指令的操作对象呢?
这时我们需要利用一个小工具:ropgadgets,这个工具可以帮助我们获取需要的gadgets

比如这道题我们需要将0xb存入eax中,我们就可以输入以下指令

这条指令可以帮助我们找到rop程序中eax寄存器的pop|ret指令的地址 

可以看到,包含popeaxret指令的所有gadgets都被列出,这里我们只需要第二个即可

然后我们再找’ebx’的相关gadgets

发现这么多相关的gadgets均被列出,这里我们可以发现倒数第六行将ebxecxedx都用到了,我们就可以直接利用这一条gadgets来给这些寄存器赋值

接下来再利用gdb获取return偏移量

随机产生200个字母

可以看到在0x62616164报错,说明这里就是return在栈中的位置,被这四个字母覆盖

通过cyclic -l命令查找刚刚随机产生的字符串中这四个连续字母的位置可以确定偏移量为112

payload其中栈中参数都是pop的参数,用来弹到指定的寄存器中
  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pwn ret2libc是一种攻击技术,其原理是通过利用程序中的栈溢出漏洞,来控制程序的执行流程,以达到执行libc中的函数的目的。 在ret2libc攻击中,程序会调用libc库中的函数,例如system函数,来执行特定的操作。但是在程序中没有自带的/bin/sh字符串,所以需要通过其他方式获取执行shell命令的能力。 具体而言,攻击者会利用程序中的栈溢出漏洞,将栈上的返回地址修改为在libc库中的某个函数的地址,例如puts函数。然后通过执行puts函数,将栈上保存的函数地址打印出来。由于libc库中的函数地址相对位置是不变的,攻击者可以根据已知的函数地址和libc的版本来计算system函数的真实地址。然后再利用system函数执行特定的操作,比如执行shell命令。 总结来说,pwn ret2libc攻击的原理是通过栈溢出漏洞修改返回地址为libc库中的一个函数地址,然后根据已知的函数地址和libc的版本计算出system函数的真实地址,最终实现执行shell命令的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pwn学习——ret2libc2](https://blog.csdn.net/MrTreebook/article/details/121595367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pwn小白入门06--ret2libc](https://blog.csdn.net/weixin_45943522/article/details/120469196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值