我的缓冲区溢出分配具有以下代码:
int zerg(char *arg)
{
char buf[12];
static int i, sum;
if (strlen (arg) > 24) /* Argument too long! */
{
printf ("String too long!\n");
return -1;
}
这就是为什么我将其用作输入的原因:
run "$(python -c "print 'RUSHKEKEKEzAS\00\xa9\x87\x04\x08'")"
但是gdb忽略了空字节作为上述错误的输入。我怎么能通过这个?
答案 0 :(得分:1)
不可能将NUL字节放入命令行参数中,因为该参数由第一个NUL字节终止。当execve()
将argv
数组复制到新创建的要运行的进程的内存空间中时,它仅复制到第一个NUL字节。
由于shell基本上是为了将命令行参数提供给命令行实用程序而存在的,因此它们不需要处理嵌入式NUL字节,而大多数则不需要。特别是Bash会丢弃在命令替换期间遇到的所有NUL字节。其他shell可能在第一个NUL字节处终止参数。该行为未由Posix标准指定。
由于gdb基本上是用来模仿bash的,因此它遵循警告消息所指示的相同规则。