【问题标题】:Unanticipated segmentation fault in CC中的意外分段错误
【发布时间】: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


【解决方案1】:

你不是在设置eax=0x1,你是在设置al=0x1,所以如果你不知道在你的shellcode之前执行了什么指令,你会得到eax=xxxxxx01

正如 cmets 所说,您必须在 shellcode 的开头添加 xor eax, eax

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2018-04-13
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多