0

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

任何人都可以在这里帮助我。

谢谢拉维

4

2 回答 2

0

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

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

于 2013-03-26T15:03:55.913 回答
0

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

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

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

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

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

于 2013-03-27T17:22:40.463 回答