2013-03-26 397 views
0

我们可以通过gdb中的十六进制值给出输入字符串。例如,一个简单的程序十六进制字符串作为gdb中scanf的输入

#include <stdio.h> 

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

调试它:

[email protected]:~$ 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要输入4 A的输入,但它单独考虑每个字符。

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

有人可以帮我在这里。

谢谢 拉维

回答

0

你似乎在期待GDB有这个功能,它应该理解C风格的输入逸出,使被调试程序得到一个'A'当你输入\x41

不幸的是,这不是它是如何工作的; gdb不在被调试的程序和终端之间。而终端不支持该功能,所以它不会工作。

0

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

,这只是一个例子你如何能注入十六进制到插座:

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

- 端口>印刷存储器地址和NOP指令用Perl和管成NC到本地主机(或远程系统) 1337在这种情况下。

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

相关问题