【问题标题】:GDB Debugging: Passing arguments using IO redirectionGDB 调试:使用 IO 重定向传递参数
【发布时间】:2017-01-02 18:49:38
【问题描述】:

我正在学习如何利用缓冲区溢出。下面是我正在玩的程序

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) 
{
    char buffer[256];
    printf("%p\n", buffer);
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
    return 0;
}

我编译这个程序:gcc -fno-stack-protector -z execstack program.c -o program 我在 gdb 中加载了这个程序:gdb ./program 如果我发出以下命令:run $(python -c 'print "A" * 3000') 它会根据需要覆盖寄存器:

rbp            0x4141414141414141   0x4141414141414141
rsp            0x7fffffffd938   0x7fffffffd938
r8             0x4141414141414141   0x4141414141414141
r9             0x4141414141414141   0x4141414141414141
r10            0x4141414141414141   0x4141414141414141

..... 但是,如果我使用 IO 重定向寄存器的值向程序提供参数,则不会根据需要覆盖。

fuzz.py

#!/usr/bin/python
print 'A' * 3000

我使用fuzz.py &gt; f将所有'A'输出到文件f

我在 gdb gdb ./program 中运行程序 现在如果我使用 IO 重定向给程序一个参数,我会得到异常输出:

run < f

我收到以下错误:

停止原因:SIGSEGV __strcpy_sse2_unaligned () 在 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296 296 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:没有这样的文件或目录。

为什么我会收到此错误 __strcpy_sse2_unaligned 而如果我使用 run $(python -c 'print "A" * 3000') 传递参数,我只会收到我想要的 SIGSEGV 错误。

信息寄存器:

rbp            0x7fffffffe4f0   0x7fffffffe4f0
rsp            0x7fffffffe3d8   0x7fffffffe3d8
r8             0x0  0x0
r9             0xf  0xf
r10            0x5d 0x5d

为什么寄存器没有被'A'覆盖?

Q1) 为什么在 gdb 中传递参数使用:

run $(python -c 'print "A" * 3000')

run < f

不相等? f 是包含 3000 个“A”的文件。

Q2) 这个错误是什么意思:__strcpy_sse2_unaligned ()

【问题讨论】:

    标签: c gdb


    【解决方案1】:

    您从命令行参数获取输入,而不是标准输入:

    strcpy(buffer, argv[1]);
    

    所以你应该使用:

    run $(python -c 'print "A" * 3000')
    

    如果您从标准输入读取,&lt; 重定向将起作用,例如使用scanf

    __strcpy_sse2_unaligned SIGSEGV 是由于您试图从未初始化的内存中 strcpy 引起的(argv[1],实际上是 NULL,因为在您的情况下它是 argv[argc])。然后 GDB 尝试查找该内部函数的源代码,但失败了。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2017-06-23
      • 2013-06-08
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多