Asis CTF 2016 b00ks(堆溢出NULL byte off-by-one)

本文详细分析了一个CTF挑战中的堆溢出漏洞,通过地址泄露、结构体伪造,实现任意地址读写。利用程序的null byte off-by-one漏洞,可以修改内存中的指针,最终达到控制程序执行的目的。
摘要由CSDN通过智能技术生成

1.题目获取

题目下载地址:点此下载

2.查保护

在这里插入图片描述

3.分析程序

IDA载入,查看main函数
在这里插入图片描述
这个函数读取一个名字,最长32个字节。
在这里插入图片描述
作者名被读到data段
在这里插入图片描述
sub_A89()打印程序功能,并获取用户输入的序号
在这里插入图片描述
sub_F55()的功能是添加书籍信息,在这个函数中可以分析到存储这些数据的结构体。
在这里插入图片描述
我们可以看到这里的v4是存放在off_202010+v3处,其他的参数又存在v4中。
在这里插入图片描述
从这里我们可以得知v2是description的长度,v6是description,ptr是书名;unk_202024没有找到相关的,需要动态调试,但是现在关键问题是如何定位v4这个结构体,我们可以发现v4是放在off_202010 + v3处,off_202010在我们的作者名存放处off_202018前面。所以可以通过搜索字符串定位。
在这里插入图片描述
定位到作者名在0x555555756040处
在这里插入图片描述
第一个红框框的是作者名,第二个红框中的值应该就是v4那个结构体了。
在这里插入图片描述

*((_DWORD *)v4 + 6) = v2;
*((_QWORD *)off_202010 + v3) = v4;
*((_QWORD *)v4 + 2) = v6;
*((_QWORD *)v4 + 1) = ptr;
*(_DWORD *)v4 = ++unk_202024;

在这里插入图片描述
猜测unk_202024是书的id,unk_202024指向bss段,这个地址应该是被初始化为0,然后这里++,所以第一个书的id为1;
ptr是书名;v6是description;v2是description的长度;
之前我看一位大佬写的wp,他提出了个疑问,我正好遇到,就写下;大佬在文章中写道

这里有一点疑问,为什么存的时候是*((_DWORD *)v4 + 6) = v2;而真正的内存里面却是把0x0000000000000014放到了+3处。

这里需要注意v4前面的_DWORD和_QWORD;_DWORD代表4字节,_QWORD代表8个字节;
*((_DWORD *)v4 + 6) = v2;前面是_DWORD,四个字节
在这里插入图片描述
至此,程序中的结构体分析完毕。

4.地址泄露

在这里插入图片描述
程序编写的获取用户输入函数存在 null byte off-by-one 漏洞,仔细观察这个获取用户输入函数可以发现对于边界的考虑是不当的。
在这里插入图片描述
第一个红框框的是作者名,第二个红框是v4那个结构体;获取用户输入函数对于边界的考虑是不当的,造成越界,会把字符串截断字符\x00越界写入到0x555555756060处,当我们使用程序添加书籍的功能的时候会把book1结构体的指针写到0x555555756060处,会覆盖\x00这个截断符,当我们打印作者名的时候可以泄露出book1结构体位置的指针。也可以二次修改作者名,把0x555555756060处再次覆盖为\x00,这样会修改程序的book1结构体位置的指针的值。

泄露地址

在这里插入图片描述
在这里插入图片描述

修改地址

在这里插入图片描述
第一个字节被覆盖为\x00。

5.伪造结构体

重新调试
在这里插入图片描述
假设二次修改作者名,book1结构体位置的指针的第一个字节覆盖为\x00时0x0000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值