我正在阅读有关格式字符串漏洞的教程,以学习如何更安全地编码。到目前为止,我编写的程序如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char text[100];
strcpy(text, argv[1]);
printf(text);
}
我这样运行它:
>>> ./foo $(ruby -e 'print "AAAA" + "%08x."*9 + "%x"')
AAAAffe466f4.00000001.f763b1c9.ffe458df.ffe458de.00000000.ffe459c4.ffe45964.00000000.41414141
我可以在末尾看到“41414141”,这是字符串开头的 AAAA。但是,当我像这样使用“%s”时:
>>> ./foo $(ruby -e 'print "AAAA" + "%08x."*9 + "%s"')
我得到一个段错误。谁能指出我正确的方向?