基本分析
防护措施RELRO,NX,64位程序。有计时函数,因此使用sed -i 's/alarm/isinf/g' battlefield
patch掉这个计时功能。
功能:
创建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中添加如下结构体定义。
然后右键同步到idb中,同步完成后。回到代码中转化struct
完成之后代码会变成这样。
再复习一下各个段的含义:BSS段 (bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。data段,该段用于存储初始化的全局变量,初始化为0的全局变量出于编译优化的策略还是被保存在BSS段。.rodata段也叫常量区,用于存放常量数据,read only data。
使用Edit>Array就可以将变量转化成数组。
c++使用虚表来实现类的多态。每个类会有一个虚表,假如父类的函数被重写,那么虚表中对应的函数地址也会与父类不同。
fastbin是和栈一样的出入方式。因此假如能free掉两个fastbin,再重新分配,那么他们的顺序会倒过来。
然后使用IDA动态调试一下,调试方法可以看这个视频https://www.youtube.com/watch?v=vMr7Zym6hEI
我觉得这个按钮最好用
然后我们将程序运行到这里
然后就要回到虚拟机中进行输入,进行创建castle的操作。
首先在stack里面看到有一个chunk
然后使用hex dump来查看内存,不难发现,这里有残留的libc中的地址,通过这个地址可以泄露出libc的基地址。
查看进程lsof battlefield
,杀死占用进程kill -9 98
,这里的98为pid
reference
IDA结构体 https://thinkycx.me/2019-07-15-how-to-create-structs-in-IDA.html