Format String 0x01
原理
假设我们在编写程序时候,写成了下面的样子
1 | printf("Color %s, Number %d, Float %4.2f\n"); |
此时我们可以发现我们并没有提供参数,那么程序会如何运行呢?程序照样会运行,会将栈上存储格式化字符串地址上面的三个变量分别解析为
- 解析其地址对应的字符串
- 解析其内容对应的整形值
- 解析其内容对应的浮点值
在Linux中编译运行后会得到如下情况:
1 | $ gcc foemat_string_test.c -o format_string_test_ex |
可以看到虽然因为没有分配参数而报了warning,但是可以编译并将栈上的内容打印了出来。
对于 2,3 来说倒还无妨,但是对于对于 1 来说,如果提供了一个不可访问地址,比如 0,那么程序就会因此而崩溃。
利用手段
- 使程序崩溃,因为 %s 对应的参数地址不合法的概率比较大。
- 查看进程内容,根据 %d,%f 输出了栈上的内容。
CTF中主要使用第二中手段打印我们想要的内容,一般会有如下几种操作
- 泄露栈内存
- 获取某个变量的值
- 获取某个变量对应地址的内存
- 泄露任意地址内存
- 利用 GOT 表得到 libc 函数地址,进而获取 libc,进而获取其它 libc 函数地址
- 盲打,dump 整个程序,获取有用信息。