PWN学习记录(4)BUUCTF-ciscn_2019_n_1

在这里插入图片描述
参考链接:
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框中:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值