【问题标题】:shell code assembly segfaultsshell 代码汇编段错误
【发布时间】:2011-11-08 07:24:20
【问题描述】:

我正在尝试使用以下 asm 代码编写 shellcode,但我总是在 movl %esi, 0x8(%esi) 处遇到段错误,知道为什么吗?实际上只运行 movl %esi, 0x8(%esi) 会导致段错误。

void main() {
    __asm__(
    "mov $0x80, %edx\n\t"
    "jmp l1\n\t"
    "l2:popl %esi\n\t"
    "movl %esi,0x8(%esi)\n\t"
    "movb $0x0,0x7(%esi)\n\t"
    "movl $0x0,0xc(%esi)\n\t"
    "movl $0xb,%eax\n\t"
    "movl %esi,%ebx\n\t"
    "leal 0x8(%esi),%ecx\n\t"
    "leal 0xc(%esi),%edx\n\t"
    "int $0x80\n\t"
    "movl $0x1, %eax\n\t"
    "movl $0x0, %ebx\n\t"
    "int $0x80\n\t"
    "l1:call l2\n\t"
    ".string \"/bin/sh\"\n\t"
   );
  }

【问题讨论】:

  • 您的代码段(您放置字符串的位置)可能不可写。查看mprotect(2)
  • 使用 8[ESI] 检查您尝试访问的地址

标签: assembly segmentation-fault


【解决方案1】:

问题是,正如 user786653 所说,代码段不可写。不过,您可以在堆栈上写入:

subl $0x8, %esp        # make room
movl $0x0, 0x4(%esp)   # null
movl $0x0, (%esp)      # here too
movl $0xb, %eax        # syscall no. 11
movl %esi, %ebx        # pointer to string
leal 0x4(%esp), %ecx   # first null  (argv)
leal (%esp), %edx      # second null (envp)
int $0x80              # go

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多