为什么我在尝试使用execve sys调用时会出错?

时间:2013-12-29 23:35:55

标签: assembly nasm

我正在使用32位Linux(ubuntu发行版)上的NASM汇编程序,使用Intel语法为IA-32架构编写一些汇编代码。

我正在尝试使用execve sys调用来执行/bin/sh但保持segfaulting。我想我正在遵循sys调用的惯例:

  • eax - 系统电话号码,在我的平台上为11
  • ebx - 以空字符结尾的字符串“/ bin / sh”
  • 的地址
  • ecx - 包含空终止字符串和尾随空值
  • 的结构的地址
  • edx - 指向null
  • 的指针

我不确定为什么这个程序没有按预期工作。使用gdb验证我看到所有地址都按照我的意图加载。我怀疑它与我定义sh变量的方式有关。

global _start

section .text
_start:
  mov eax, 0xb
  lea ebx, [sh]
  lea ecx, [sh]
  lea edx, [sh+8]
  int 0x80

section .data
  sh: db "/bin/sh", 0x00, 0x00,0x00,0x00,0x00

我对使用ecx感到特别困惑。在上面的代码中,我使用指向字符串的指针加载ecx,但我真正想要的是指向数组的指针。一个数组,包含:指向字符串的指针和null。我试图重写这段代码,但仍然没有成功。

global _start

section .text
_start:
  mov eax, 0xb
  mov ebx, sh ; pointer to the string '/bin/sh'

  xor esi, esi
  push esi ; argv[1]
  push ebx ; argv[0]

  lea ecx, [esp] ; a pointer to the array
  lea edx, [esp+4] ; a pointer to a NULL
  int 0x80

section .data
  sh: db "/bin/sh/", 0x00
  • 为什么我会收到段错误?
  • 如何使用execve执行/bin/sh

1 个答案:

答案 0 :(得分:-1)

使用堆栈

global _start

section .text
_start:
xor eax, eax
push eax ; add a null onto the stack

; hs/n : 68732f6e
; ib// : 69622f2f
push 0x68732f6e
push 0x69622f2f ; add the string in reverse order

mov ebx, esp ; pointer the null terminated string

push eax ; argv[1]

mov edx, esp ; a pointer to null

push ebx ; argv[0]

mov ecx, esp ; a pointer to the array with address and null

mov al, 0xb ; the sys call number
int 0x80

或其他方式。我遇到的困难是正确构建数组并处理空值

global _start

section .text
_start:
    xor eax, eax

    mov ebx, filename ; pointer the null terminated string

    push eax ; argv[1]

    mov edx, esp ; a pointer to null

    push filename ; argv[0]

    mov ecx, esp ; a pointer to the array with address and null

    mov al, 0xb ; the sys call number
    int 0x80

section .data
    filename: db "/bin/sh", 0x00, 0x00, 0x00, 0x00