基本分析

防护措施RELRO,NX,64位程序。有计时函数,因此使用sed -i 's/alarm/isinf/g' battlefieldpatch掉这个计时功能。

功能:

创建castle:需要输入castle的名称,是一个字符串,假如第二次创建会覆盖第一次的内容

添加hero:hero里面有几种可以供你选择,需要输入长度,名称。假如选择handsomeboy还需要输入为什么他帅。也是会覆盖前面的内容。必须要先添加城堡再添加hero

开始battle:创建enemy,和hero一样的类型,获胜后需要leave msg

展示castle的信息:可以直接展示创建的castle信息

ascii码里10是换行符

选择handsome boy:先创建一个0x48的chunk,然后创建hero的结构体。hp=50, attack=10

选择green wolf: 先创建一个0x28的chunk,hp=60,attack=10

选择mirror: 先创建一个0x30的chunk,hp=90, attack=20

选择beta ku: 先创建一个0x28的chunk,hp=70,attack=45

hero的结构体存放在off_402290处。

按y设置函数类型,可以设置传入,返回参数类型与名称。函数名的修改要使用n。

创建结构体可以现在View>Open Subviews>Local Types中进行添加,然后右键选择Synchronize to idb将这个定义完成的结构体添加到Structures窗口中。

首先在Local Types中添加如下结构体定义。

image-20200910204714720

然后右键同步到idb中,同步完成后。回到代码中转化struct

image-20200910204808568

完成之后代码会变成这样。

image-20200910204844238

再复习一下各个段的含义:BSS段 (bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。data段,该段用于存储初始化的全局变量,初始化为0的全局变量出于编译优化的策略还是被保存在BSS段。.rodata段也叫常量区,用于存放常量数据,read only data。

使用Edit>Array就可以将变量转化成数组。

c++使用虚表来实现类的多态。每个类会有一个虚表,假如父类的函数被重写,那么虚表中对应的函数地址也会与父类不同。

fastbin是和栈一样的出入方式。因此假如能free掉两个fastbin,再重新分配,那么他们的顺序会倒过来。

然后使用IDA动态调试一下,调试方法可以看这个视频https://www.youtube.com/watch?v=vMr7Zym6hEI

我觉得这个按钮最好用

image-20200914151454511

然后我们将程序运行到这里image-20200914151608048

然后就要回到虚拟机中进行输入,进行创建castle的操作。

image-20200914151658923

首先在stack里面看到有一个chunk

image-20200914152515174

然后使用hex dump来查看内存,不难发现,这里有残留的libc中的地址,通过这个地址可以泄露出libc的基地址。

image-20200914152604387

查看进程lsof battlefield,杀死占用进程kill -9 98,这里的98为pid

reference

IDA结构体 https://thinkycx.me/2019-07-15-how-to-create-structs-in-IDA.html