繁体   English   中英

直接参数访问不起作用,在C中使用printf

[英]Direct Parameter Access not working, using printf in C

我正在做一些计算机安全性研究,并且试图了解有关字符串格式的漏洞。 我正在运行一个包含以下代码的程序:

char buf[1<<5];
strncpy(buf, data, sizeof(buf));
buf[sizeof(buf)-1]='\0';
fprintf(stderr, buf);

当我向程序输入参数“%08x。%08x。%08x。%08x。%08x”(将其读入“数据”变量)时,我得到的输出是:00000020.b7fd7560.08048b09.00000019.78383025

我知道每个十六进制数字都会从堆栈中弹出,并且“ 78383025”来自缓冲区本身。 所以有4个字--16个字节-在到达缓冲区的开头之前,我必须弹出。

当我给参数`perl -e 'print "\\x2a\\xf9\\xff\\xbf%08x.%08x.%08x.%08x_%s_";'` ,%s部分将打印位于内存地址0xbffff92a的字符串。

现在,我想使用直接参数访问来执行此操作。 如果我在程序中输入参数`perl -e 'print "\\x2a\\xf9\\xff\\xbf%16$s";'` ,我应该期望程序执行与上述相同的操作。 但是所有程序打印的内容都是缓冲区开头的四个字符。 那么,什么给了??? 我是否为DPA使用了错误的语法??? 我正在使用32位的Ubuntu 9.04。

这是一些可编译的代码,尽管不能保证产生相同的结果:

#include <stdio.h>

void run(const char* data) {
    char buf[1<<5];
    strncpy(buf, data, sizeof(buf));
    buf[sizeof(buf) - 1] = '\0';
    fprintf(stderr, buf);
}

int main(int argc, char* argv[]) {
    run(argv[1]);
    return 0;
}

%16$s引用格式字符串后的第16个参数,并告诉printf将其解释为char*并将其显示为字符串。

您似乎正在使用它作为在获取字符串之前跳过16个字节的方法,但这并不完全相同。

由于您需要第5个参数,因此请尝试使用类似以下格式的字符串:

"\x2a\xf9\xff\xbf%5$s"

由于您正在使用perl -e 'print "...";' 要传递数据,您必须转义$字符。 IE浏览器。

./a.out `perl -e 'print "\x2a\xf9\xff\xbf%5\\\$s";'`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM