十六进制字符串作为gdb中scanf的输入

时间:2013-03-26 14:47:35

标签: c gdb scanf buffer-overflow

我们可以通过它在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

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

真正的要求是我在基于堆栈的缓冲区溢出中使用Shellcode,我需要在调试时以十六进制输入shellcode。

任何人都可以帮助我。

谢谢 拉维

2 个答案:

答案 0 :(得分:0)

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

不幸的是,这不是它的工作原理; gdb不在调试程序和终端之间。终端不支持该功能,因此它不起作用。

答案 1 :(得分:0)

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

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

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

- &GT;在这种情况下,使用perl打印内存地址和NOP,并将其作为nc连接到端口1337上的localhost(或远程系统)。

这就是我假设解决你的问题! 如果您需要协助通过套接字进行通信我相信您也会在stackoverflow上找到答案!