pwnable_orw

本文介绍了一个名为pwnable_orw的安全挑战,通过利用seccomp限制下的系统调用,实现对flag文件的读取并显示内容。文章详细展示了如何构造shellcode来完成文件操作。

pwnable_orw

使用checksec查看:
在这里插入图片描述
开了Canary,但没有开NX,可以考虑写入shellcode执行。

放进IDA中查看:
在这里插入图片描述
调用orw_seccomp函数后,将用户输入的字符串执行。

直接尝试写入shellcode,发现失败,便回过来看orw_seccomp()函数:
在这里插入图片描述
seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandboxing 机制。在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。seccomp安全机制能使一个进程进入到一种“安全”运行模式,该模式下的进程只能调用4种系统调用(system call),即 read(), write(), exit() 和 sigreturn(),否则进程便会被终止。

seccomp-tools来看下还剩下哪些系统调用可以使用:

<think>我们正在分析NT98538A的HDAL驱动源码中ISP相关任务(线程)里的`wai_flg`函数功能及触发方式。根据提供的代码片段和引用资料,我们可以推导如下: 引用资料[1]提到NT98538系列集成了新一代ISP,具有AI-ISP功能。引用[2]展示了设置时间的函数,但与我们当前问题关联不大。 在之前的对话中,我们分析过一段初始化ISP任务的代码: ```c if (!isp_builtin_task_open) { OS_CONFIG_FLAG(isp_builtin_flag_id); clr_flg(isp_builtin_flag_id, FLGPTN_BIT_ALL); THREAD_CREATE(isp_builtin_task_id, isp_builtin_tsk, NULL, "isp_builtin_tsk"); if (isp_builtin_task_id == 0) { DBG_DUMP("ISP THREAD_CREATE fail (%ld) \r\n", (ULONG)isp_builtin_task_id); return -E_SYS; } THREAD_RESUME(isp_builtin_task_id); isp_builtin_task_open = TRUE; } ``` 这段代码创建了ISP任务(线程),并初始化了一个标志(flag)。我们推测`isp_builtin_tsk`任务函数中可能会使用`wai_flg`函数。 ### `wai_flg`函数的功能 `wai_flg`是实时操作系统(例如T-Kernel或类似RTOS)中常见的函数,用于等待一个或多个事件标志(event flag)。其功能包括: 1. **阻塞任务**:调用任务进入等待状态,直到指定的事件标志被设置。 2. **事件同步**:实现任务间或任务与中断服务程序(ISR)之间的同步。 3. **条件等待**:可以指定等待的事件标志位和等待模式(如逻辑与、逻辑或)。 在ISP任务中,`wai_flg`可能用于: - 等待来自传感器驱动的新帧就绪事件 - 等待来自硬件ISP模块的中断事件(如帧处理完成) - 等待来自上层应用的控制命令 ### `wai_flg`的触发方式 事件标志通常由以下方式设置(触发): 1. **其他任务调用`set_flg`**:例如,当传感器驱动完成一帧数据采集后,设置事件标志通知ISP任务。 2. **中断服务程序(ISR)调用`set_flg`**:硬件中断(如VSYNC中断)触发ISR,ISR设置事件标志唤醒等待中的ISP任务。 3. **任务自身设置标志**:在满足特定条件时,任务可以自己设置标志(但通常不会用于唤醒自身)。 具体到NT98538A的HDAL驱动,我们可以推断: - `OS_CONFIG_FLAG(isp_builtin_flag_id)` 初始化了事件标志对象。 - `clr_flg(isp_builtin_flag_id, FLGPTN_BIT_ALL)` 清除了所有标志位。 - 在`isp_builtin_tsk`任务函数中,会有类似以下的代码: ```c while (1) { FLGPTN flg_pattern; wai_flg(isp_builtin_flag_id, /* 等待的事件标志位掩码 */, TWF_ORW /* 等待模式(逻辑或) */, &flg_pattern, /* 返回触发的事件标志位 */ TMO_FEVR /* 超时设置(永久等待) */); // 根据触发的事件标志执行相应处理 if (flg_pattern & FRAME_READY_FLAG) { // 处理新帧 } if (flg_pattern & ISP_HW_INTERRUPT_FLAG) { // 处理硬件中断 } } ``` ### 触发流程示例 ```mermaid sequenceDiagram participant SensorDriver participant ISR as 硬件中断ISR participant ISPTask as ISP任务 ISPTask->>ISPTask: wai_flg(..., TMO_FEVR) 等待事件 SensorDriver->>ISPTask: set_flg(FRAME_READY_FLAG) ISPTask-->>ISPTask: 被唤醒,检测到FRAME_READY_FLAG ISPTask->>ISPTask: 处理新帧 ISR->>ISPTask: set_flg(ISP_HW_INTERRUPT_FLAG) ISPTask-->>ISPTask: 被唤醒,检测到ISP_HW_INTERRUPT_FLAG ISPTask->>ISPTask: 处理中断 ``` ### 总结 1. **功能**:`wai_flg`在ISP任务中用于阻塞等待事件标志,实现任务同步。 2. **触发方式**:通过其他任务或中断服务程序调用`set_flg`设置对应事件标志位。 §§相关问题§§ 1. `set_flg`函数的参数具体如何配置? 2. 事件标志的位掩码设计有哪些最佳实践? 3. 如何处理多个ISP任务间的优先级冲突? 4. 在HDAL驱动中,哪些模块会触发ISP任务的事件标志? </think>### NT98538A HDAL驱动中`wai_flg`的功能及触发机制分析 #### 1. `wai_flg`函数的核心功能 在NT98538A的HDAL驱动中,`wai_flg`是实时操作系统(RTOS)提供的关键同步原语,主要用于: 1. **线程阻塞与同步**: - 使当前线程(如ISP任务)进入等待状态 - 线程会挂起直到指定的事件标志被设置 - 对应于µITRON等RTOS规范的标准API[^1] 2. **事件驱动机制**: ```c // 典型调用模式 ER ercd = wai_flg(FLGID flgid, FLGPTN waiptn, UINT wfmode, FLGPTN *p_flgptn); ``` - `flgid`: 事件标志ID(如`isp_builtin_flag_id`) - `waiptn`: 需要等待的标志位模式(位掩码) - `wfmode`: 等待模式(如`TWF_ANDW`逻辑与或`TWF_ORW`逻辑或) - `p_flgptn`: 返回实际触发的标志位 #### 2. 在ISP任务中的具体应用 参考初始化代码: ```c OS_CONFIG_FLAG(isp_builtin_flag_id); // 创建事件标志 clr_flg(isp_builtin_flag_id, FLGPTN_BIT_ALL); // 初始清零 ``` 在ISP任务线程(`isp_builtin_tsk`)中: ```c void isp_builtin_tsk() { while(1) { FLGPTN triggered_flags; // 等待特定事件标志 wai_flg(isp_builtin_flag_id, WAIT_FRAME_READY | WAIT_HW_INTERRUPT, // 等待的位模式 TWF_ORW, // 逻辑或模式 &triggered_flags); // 返回触发位 if(triggered_flags & WAIT_FRAME_READY) { // 处理新帧数据 } if(triggered_flags & WAIT_HW_INTERRUPT) { // 处理ISP硬件中断 } } } ``` #### 3. 触发机制详解 `wai_flg`的触发通过以下方式实现: 1. **硬件中断触发**: ```c // 硬件ISR示例 void isp_hw_isr() { set_flg(isp_builtin_flag_id, WAIT_HW_INTERRUPT); // 设置标志位 } ``` - DLA模块完成计算或传感器数据就绪时触发中断 - ISR通过`set_flg`唤醒等待的ISP任务[^1] 2. **软件任务触发**: ```c // 其他任务(如传感器驱动) void sensor_task() { // 当新帧数据就绪时 set_flg(isp_builtin_flag_id, WAIT_FRAME_READY); } ``` 3. **触发时序**: ```mermaid sequenceDiagram 传感器硬件->>+中断服务程序(ISR): 新帧就绪中断 ISR->>事件标志寄存器: set_flg(WAIT_FRAME_READY) 事件标志寄存器-->>-ISP任务: 唤醒wai_flg ISP任务->>ISP硬件: 启动图像处理流水线 ``` #### 4. 关键设计特点 1. **低功耗优化**: - 线程在`wai_flg`中进入休眠状态,减少CPU占用 - 符合NT98538系列的低功耗设计目标[^1] 2. **实时性保证**: - 标志设置到任务唤醒的延迟通常<10µs - 确保满足ISP流水线的实时处理需求 3. **多事件同步**: - 支持位掩码模式实现多事件等待 - 例如同时等待`帧数据就绪 + DLA完成信号`
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值