IO_FILE做题流程

前言

在调试IO_FILE类型的题的时候总结的知识点

关于IO_FILE的libc更换

在调试IO类型的题的时候,在之前我们需要换libc,因为一般题目给的libc都是没有符号表的,于是我们寻找一个与之对应的有符号表的libc即可,最好是一样的

![image-20231208151227955](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208151227955.png)

没有一模一样的带符号的libc的,相同版本号的也可以

IO_FILE结构体查看

有时候我们在分析IO的时候有对应的结构体可以看是最好的,这样我们就能明确知道我们改了哪些数据,这也是我们为什么要换libc的原因

自带的符号表变量

如果是libc里面本身就有的符号,下面的命令可以直接打印出结构

1
p [*_IO_list_all]

可以看到输出结果如下

![image-20231208151953793](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208151953793.png)

根据不同的结构体的属性,前面添加* ,&, 不加,有不同的效果

![image-20231208152113727](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208152113727.png)

![image-20231208152138766](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208152138766.png)

修改后的不会自动识别的地址

有时候我们需要将IO_FILE的结构体或者JUMP表的结构体的地址更改,但是这种时候直接打印地址是不会自动转换为结构体的

于是我们就需要自己去加

例如我要查看我伪造的IO_FILE结构体对不对,用下面这个命令去定义即可

1
p *(struct _IO_FILE_plus *)  addr

![image-20231208152654686](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208152654686.png)

可以看到我们成功将该地址转换为了结构体,也可以看到我们成功修改了vtable的地址,定义也是对的

常用的还有跳表

1
p *(const struct _IO_jump_t *)

![image-20231208153055222](C:\Users\Lenovo\Desktop\学习日志\笔记\CTF笔记\PWN笔记\堆学习\House of\picutre\image-20231208153055222.png)