所以我有这个功能:
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 被我输入的字符串替换(减去前面的小端内存地址,由于某种原因,两个百分号现在变成了一个百分号)。
无论如何,我在这里有点难过,任何帮助将不胜感激。