【发布时间】:2018-07-28 13:34:28
【问题描述】:
我正在编写一个 Linux shell 代码漏洞利用程序。我的目标 C 代码是:
char code[] = "\xb0\x01\x31\xdb\xcd\x80";
int main(int argc, char **argv)
{
int(*func)();
func = (int (*)()) code;
(Int)(*func)();
}
为什么编译和运行这个 C 程序会引发分段错误错误?该字符串是使用系统调用 Int 0x80/EAX=1 退出程序的 shell 代码。汇编中的原始漏洞利用代码是:
b0 01 mov al,0x1
31 db xor ebx,ebx
cd 80 int 0x80
【问题讨论】:
-
什么是
func?这可能就是发生错误的地方。 -
我是 C 新手。我正在尝试使用 C 运行字符串。@alexquilliam
-
确保您使用的是 32 位 linux 并且您的数据部分是可执行的。
-
Jester 是正确的 你的利用代码是 32 位的,使用
int 0x80。如果您发现自己将基于堆栈的指针传递给 64 位代码中的系统调用,这可能会失败。您真的应该考虑将syscall指令用于 64 位代码。您需要使用-z execstack进行编译以获得可执行堆栈。但同样重要的 EAX / RAX 寄存器可能在高位有垃圾。在将 AL 设置为 1 之前,先执行xor eax, eax将整个寄存器归零。这将被编码为字符串开头的额外\0x31\0xc0。 -
(Int)(*func)();Int 是什么?
标签: linux gcc assembly x86 shellcode