gpt4 book ai didi

c - C中的格式化字符串攻击

转载 作者:行者123 更新时间:2023-12-04 06:17:14 25 4
gpt4 key购买 nike

我正在研究一个安全单元,我正在尝试了解格式字符串攻击。有人可以尝试向我解释这一点吗?

以下代码摘自:http://julianor.tripod.com/bc/tn-usfs.pdf :

/*
* fmtme.c
* Format a value into a fixed-size buffer
*/
#include <stdio.h>
int
main(int argc, char **argv)
{
char buf[100];
int x;
if(argc != 2)
exit(1);
x = 1;
snprintf(buf, sizeof buf, argv[1]);
buf[sizeof buf - 1] = 0;
printf("buffer (%d): %s\n", strlen(buf), buf);
printf("x is %d/%#x (@ %p)\n", x, x, &x);
return 0;
}

据我了解, %n格式说明符用于将指定地址读回内存,然后当 printf从堆栈中弹出值,它应该读取我们的地址。我似乎无法解决这个问题。

在文档中,提供了以下示例:
perl -e 'system "./fmtme", "\x58\x74\x04\x08%d%n"'

哪里去了 \x58\x74\x04\x08%d%n来自?

最佳答案

“\x58\x74\x04\x08%d%n”是“ shell 代码”。

该文件中对漏洞利用进行了非常仔细的解释。我想它希望您对堆栈帧的典型布局有一些了解,这也在表中进行了解释。请记住,堆栈地址通常向下增长,这意味着“弹出”比实际传递给它的参数更多的函数调用将开始从其自身下方的堆栈帧读取局部变量。这就是这个 shell 代码所利用的。

它将地址放在 buf 的前 4 个字节中(因为 snprintf 将它打印到那里)然后它跳过 x变量(从它下面的框架),最后从 buf 的第一部分读取地址(但被解释为一个指针)并通过 %n 格式代码向它写入一个值。

关于c - C中的格式化字符串攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7073151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com