【问题标题】:Executing shellcode segmentation fault [closed]执行 shellcode 分段错误 [关闭]
【发布时间】:2015-07-19 19:18:49
【问题描述】:

我已经编译了一个基本的漏洞利用(基本上,C 中的源代码不会利用任何东西,只需执行执行 Bash 的操作码)。问题是当我执行二进制文件时:“分段错误”。

这是我所做的:

executeBash.asm (NASM)

section .text
global _start
_start:
xor EAX, EAX           ; EAX = 0
push EAX               ; "\0\0\0\0"
push DWORD 0x68732F2F  ; "//sh"
push DWORD 0x6E69622F  ; "/bin"
mov EBX, ESP           ; arg1 = "/bin//sh\0"
push EAX     ; NULL -> args[1]
push EBX     ; "/bin//sh\0" -> args[0]
mov ECX, ESP ; arg2 = args[]
mov AL, 0X0B ; syscall 11
int 0x80     ; excve("/bin//sh", args["/bin//sh", NULL], NULL)

在终端中:

prompt$ nasm -f elf32 executeBash.asm
prompt$ ld -m elf_i386 executeBash.o -o executeBash
prompt$ objdump -M intel,i386 -d executeBash

executeBash:     file format elf32-i386


Disassembly of section .text:

08048060 <_start>:
 8048060:   31 c0                   xor    eax,eax
 8048062:   50                      push   eax
 8048063:   68 2f 2f 73 68          push   0x68732f2f
 8048068:   68 2f 62 69 6e          push   0x6e69622f
 804806d:   89 e3                   mov    ebx,esp
 804806f:   50                      push   eax
 8048070:   53                      push   ebx
 8048071:   89 e1                   mov    ecx,esp
 8048073:   b0 0b                   mov    al,0xb
 8048075:   cd 80                   int    0x80
prompt$ # "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
prompt$ ./executeBash
$ exit
prompt$ 

ASM 中的漏洞利用完美运行。

exploitBash.c

void main()
{
    char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
                       "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
    void(*fp) (void);
    fp = (void *)&shellcode;
    fp();
}


prompt$ gcc -m32 -fno-stack-protector -z execstack exploitBash.c -o exploitBash
prompt$ ./exploitBash
Segmentation fault

【问题讨论】:

  • 那么,您在抱怨 未定义的行为 的行为未定义?
  • @RossRidge amm,这是真的……那么问题出在哪里?
  • @RossRidge 我编辑了该行,因为您说我的代码不在堆栈中。现在使用最新参数对其进行编辑。分段错误。
  • 它对我有用。 (-z execstack;我也通过了 -nostdlib,因为我的 gcc32 设置搞砸了,这不需要 stdlib)。
  • @PSkocik 使用 -nostdlib,漏洞利用工作。有什么问题?

标签: c linux gcc assembly x86


【解决方案1】:

您忘记设置edx,因此它包含C 代码最后使用它的任何内容,这不太可能是有效的环境指针。在独立代码中,由于程序的初始启动状态,edx 恰好为零。如果您使用strace,您可以看到execve 返回-EFAULT,然后继续执行您的代码进入垃圾,然后真正出现段错误。例如,您可以像这样修复 shellcode:

char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
               "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\x31\xd2\xcd\x80";

(我在int 0x80 之前添加了一个xor edx, edx。)

【讨论】:

  • 完美。但是 excve() 的 EDX 是什么?换句话说,为什么 excve() 执行必须为零?
  • edx 是第三个参数,指向环境变量的指针。也可能是NULL。见man execve
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2012-11-26
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多