【问题标题】:Writing to a specific address with printf format string attack使用 printf 格式字符串攻击写入特定地址
【发布时间】:2023-03-09 15:10:01
【问题描述】:

假设这段代码接受用户输入并且容易受到格式字符串攻击:

int main(int argc, char *argv[])
{
    char user_input[100];

    ...

    scanf("%s", user_input);
    printf(user_input); // vulnerable to attack

    return 0
}

假设我想利用printf 行写入特定地址0x41414141

通常,如果地址在堆栈上偏移,您可以覆盖该地址的值。例如,将输入 %5\$n 写入第 5 个参数,在堆栈中偏移。

但是如果这个地址0x41414141没有在栈上偏移,那我怎么写呢?

有多个示例表示传入输入,例如\x41\x41\x41\x41 %x %x %x %n,其中%x %x %xprintf() 的指针移向存储在格式字符串中的指定地址。显然这最终会覆盖地址0x41414141 的值?如果这确实有效,那么我怎么知道格式字符串的地址是什么?我不知道在 gdb 中寻找什么。

(This idea was interpreted from the example in these notes)

【问题讨论】:

    标签: c gdb printf


    【解决方案1】:

    但是如果这个地址 0x41414141 没有在栈上偏移,那我该如何写入呢?

    没有这样的东西,在非分段架构(即大多数当前的操作系统)上,地址不会从其他地址“偏移”。

    使用平面内存模型,每个地址都可以计算为某个其他地址 +(可能非常大)偏移量。

    例如,如果您当前的sp == 0x7fffffffdc20,并且您想写入地址0x41414141,那么您所要做的就是将偏移量0xffff800041416521,或将偏移量0x7fffbebe9adf 减去sp

    也就是说,向scanf 提供足够长的字符串是不切实际的,因此为了覆盖特定地址,您首先破坏一些本地指针以指向所需地址,然后安排写入那个指针。换句话说,您需要将多个攻击链接在一起。

    【讨论】:

    • “您首先破坏了一些本地指针以指向所需的地址,然后安排通过该指针进行写入” - 这是我一直在尝试做的事情,但我不明白如何使用格式字符串输入来完成。
    猜你喜欢
    • 2011-06-18
    • 2013-01-08
    • 2012-11-04
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多