pwn的最基本的ret2shellcode原理

本文详细介绍了如何利用ret2shellcode漏洞获取shell。首先通过checksec检查程序保护,发现存在RWX段,适合shellcode执行。接着反编译代码,发现gets函数引发溢出,但缺乏直接可用的system函数。通过动态调试,计算出覆盖栈中ESP地址的偏移量,并找到了合适的shellcode。最后,介绍了一个在线shellcode数据库用于查找匹配的shellcode。

题源:ctf-wiki的基础ROP的ret2shellcode

基本 ROP - CTF Wiki (ctf-wiki.org)

 ①:先checksec检查

可以看出基本上没什么保护开启,而且含有RWX段(这个段的意思就是可读可写可执行),很明显是一个shellcode的题目。

②:先反编译看看

有gets函数,绝对考溢出。而且没有system函数和bin/sh,也没有后门函数可以直接使用。再结合他有RWX段就可以很明显的判断这是一个ret2shellcode的题目。 

### 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 ; 执行系统调用中断请求 ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ad_m1n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值