PWNABLE.TW-Printable-WP
相当麻烦的格式化字符串和 .fini 数组利用结合的题目,由于是 pwnable 的题,这里只简单记录一下思路
首先,printf 是很裸的,但是执行完后就会直接 exit,这肯定不行,首要的是要做到能够重复利用。exit 在执行时,会遍历 .fini 数组中的所有函数并执行。程序没有开启 PIE,自然会想到修改 .fini 数组,但是该数组不可写,就需要用别的方法。在调用 .fini 数组中的函数的 _dl_fini 中有这样一段代码
…
_IO_FILE 相关源码阅读(一)——vtable 及其指向的函数:从 __finish 说起
__finish 虚函数主要处理的是对文件结构体的析构操作,同时会根据情况进行对文件进行 close 操作。通过本文的分析,应该可以基本理解 _IO_new_file_finish、_IO_new_file_write、__GI__IO_file_seek、__GI__IO_file_close 等函数的实现。同时可以对面向语言中虚函数的实现有初步的了解,更重要的,可以明白面向对象是一种思维,而不是语法,使用面向过程式语言仍然可以实现面向对象的开发。
PWNABLE.TW-seethefile-WP
首先是前置的小 trick:关于/proc目录
题目提供了读取文件的功能,可以读除了 flag 之外的文件。自然可以想到通过 /proc/self/maps 来 leak 出 libc 的基地址。
然后在退出时

注意到这里有一个 "%s" 可以溢出。一开始也没仔细看,以为 name 是栈上的变量,也没看到后面的 exit(0),准备 rop,结果发现 name 在 .bss 段上,难以 rop,但是注意到 fp 变量在 name 后面,所以可以通过溢出覆写 fp。程序没有开启 PIE,所以我们写入的地址是已知的,我们布置好一个 fake_file,让 fp 指向它,在执行 fclose 的时候 getshell 了。
