【发布时间】:2021-02-01 08:40:31
【问题描述】:
我正在处理 C 中的格式字符串漏洞,我正在尝试通过终端中给出的 printf 命令打印“argc”整数的值。
我当前的代码是:
int main (int argc, char **argv) {
char buffer[32];
*More variables*
strncpy(buffer, argv[1], sizeof(buffer));
printf(buffer);
*More printf's*
}
我可能需要使用格式说明符将整数 argc 的内容打印到终端中,但我似乎找不到解决方案。我所有的猜测都得到了我所有的 argv 堆栈寄存器(%rsi、%rdx、%rcx、%r8d、%r9d)。
格式字符串应在终端中给出,如下例所示:
./format-string %d_%s
是否可以获取 argc 值?如果是,我该怎么做?
【问题讨论】:
-
我不明白你在做什么。您是否正在尝试编写一个容易受到字符串格式化攻击的程序?你的目标是什么?
-
@Cheatah 不,我想破解这个程序并使用程序执行时给出的格式说明符获取 argc 变量的整数值
-
您确定省略的代码或省略的环境不相关吗?正如给定的那样,在 x86-64 上,我认为没有办法获得
argc,因为rdi(或Windows 上的rcx)被多次覆盖。但是在 SYS V x86-64 ABI 中,argc在调用_start时在堆栈中,所以我认为您可以使用%<k>n访问它,其中<k>是一个合适的整数。 -
我缺少上述格式的
$。例如,这适用于我的环境:./format-string '%40$p' -
别猜了。看汇编代码
标签: c x86-64 exploit format-specifiers format-string