参考链接:
BUUCTF—ciscn_2019_n_1 1_buuctf ciscn_2019_n_1 1_「已注销」的博客-CSDN博客
PWN的一些基础知识 | Savant’s Blog (lxscloud.top)
下载题目得到ciscn_2019_n_1,利用 file 命令查看该文件的类型,再通过checksec ./filename查看文件类型和保护机制
$ file ciscn_2019_n_1
$ checksec ./ciscn_2019_n_1
amd64-64-little,为64位小端存储,开启NX保护
NX enabled如果这个保护开启就是意味着栈中数据没有执行权限
运行ciscn_2019_n_1
将文件放入IDA中查看
打开main,F5反编译发现没有关键信息
打开字符串窗口。没有发现 /bin/sh,但找到了cat /flag
双击cat /flag
来自func
打开func
F5反编译成伪代码
发现gets这一危险函数
程序解释:
程序打印“Let’s guess the number.”
程序读取输入,存到v1变量
程序判断v2的值是否为11.28125,是的话就执行system(“cat /flag”)
剩下的略过
可以发现v2并没有要求输入,但是v1可以输入任意数量的字符,由于v1v2处于同一个栈,将v1输入一定数量的字符导致其溢出v1的位置,溢出值覆盖v2的值,使v2=11.28125即可得到flag
当v2=11.28125时,cat /flag,偏移量=0x30-0x4=十进制44
如下图,v1首地址与v2首地址相差44个字节
db 8 dup(?)
db:定义字节类型变量的伪指令
dup():重复定义圆括号中指定的初值,次数由前面的数值决定
?:只分配存储空间,不指定初值
思路:接受完”Let’s guess the number.”这一字符串,程序就发送44个a,(由于p64()函数中填入浮点数会报错)再发送11.28125的十六进制形式
ucomiss 浮点比较指令
ucomiss进行单精度浮点数比较cs:dword_4007F4和xmm0的值,cs:dword_4007F4就是11.28125的位置
双击dword_4007F4
0x41348000即为11.28125的十六进制值
编写exp,夺flag
打开终端,输入vim 1.py 创建一个python文件(命名随意)
将exp文件输入进1.py中,Esc+:wq保存并退出1.py
运行代码,得到flag,将得到的flag复制到题目的flag框中: