【问题标题】:Hex string as input to scanf in gdb十六进制字符串作为 gdb 中 scanf 的输入
【发布时间】:2013-03-26 14:47:34
【问题描述】:

我们可以通过gdb中的十六进制值给出输入字符串吗?比如一个简单的程序

#include <stdio.h>

int main() {
    char buffer[20];
    fscanf(stdin, "%s", buffer);
    printf("%s", buffer);
}

调试它:

ravi@ravi-desktop:~$ gdb -q ./a.out
Reading symbols from /home/ravi/a.out...done.
(gdb) list 1
1   #include <stdio.h>
2   
3   int main() {
4       char buffer[20];
5       fscanf(stdin, "%s", buffer);
6       printf("%s", buffer);
7   }
(gdb) r
Starting program: /home/ravi/a.out 
\x41\x41\x41\x41
\x41\x41\x41\x41
Program exited with code 014.
(gdb) quit

我想使用十六进制值\x41 输入四个A 作为输入,但它会分别考虑每个字符。

真正的需求是我在Stack-based Buffer Overflow中玩Shellcode,调试时需要输入十六进制的shellcode。

谁能帮帮我。

谢谢 拉维

【问题讨论】:

    标签: c gdb scanf buffer-overflow


    【解决方案1】:

    您可以简单地从套接字读取而不是标准输入,这使得在 gdb 中设置断点并查看一个 shell 中发生的详细信息并在另一个 shell 中注入代码变得非常容易!

    这只是一个如何将十六进制注入套接字的示例:

    echo -e "`perl -e 'print "\x14\xee\xff\xbf"x10 . "\x90"x10'`" | nc 127.0.0.1 1337
    

    --> 在这种情况下,使用 perl 打印内存地址和 NOP,并将其通过管道传送到 nc 到 localhost(或远程系统)的端口 1337。

    我认为这正在解决您的问题! 如果您需要通过套接字进行通信的帮助,我相信您也会在 stackoverflow 上找到答案!

    【讨论】:

    • 这适用于您使用 nc 远程连接到程序时。谢谢@roegi
    【解决方案2】:

    您似乎希望 gdb 具有此功能,它应该解释输入中的 C 样式转义,以便在您键入 \x41 时被调试程序获得 'A'

    不幸的是,它不是这样工作的; gdb 不在被调试程序和终端之间。而且终端不支持该功能,因此无法正常工作。

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2019-02-21
      • 2019-07-27
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多