Assembly 用户输入的execv

Assembly 用户输入的execv,assembly,x86,intel,Assembly,X86,Intel,我正在用x86er汇编英特尔语法编写一个小程序。它应该要求用户输入像“ls”这样的内容,并通过“/bin/sh-c”执行该命令。但是它不起作用。。 问题是“ls”的地址。我无法在参数数组中插入输入的地址。以下是gdb的一些输出: gdb$ x/s 0x8049115 0x8049115: "\034\221\004\bDDDls\n" 如你所见。。我正在复制字符串,而不是字符串的地址。如何解决此问题?:) 这是我的密码: section .bss buffer: resb 128 sect

我正在用x86er汇编英特尔语法编写一个小程序。它应该要求用户输入像“ls”这样的内容,并通过“/bin/sh-c”执行该命令。但是它不起作用。。 问题是“ls”的地址。我无法在参数数组中插入输入的地址。以下是gdb的一些输出:

gdb$ x/s 0x8049115
0x8049115:  "\034\221\004\bDDDls\n"
如你所见。。我正在复制字符串,而不是字符串的地址。如何解决此问题?:)

这是我的密码:

section .bss
buffer: resb 128

section .data
msg: db "Your Input here: "
len: equ $-msg
exec: db "/bin/sh#-c#AAAABBBBCCCCDDDD"

section .text
global _start

_start:

  mov eax, 4
  mov ebx, 1
  mov ecx, msg
  mov edx, len
  int 0x80

  mov eax, 3
  mov ebx, 0
  mov ecx, buffer
  int 0x80

  xor eax, eax
  mov byte [exec + 7], al
  mov byte [exec + 10], al
  mov long [exec + 12], exec
  lea ebx, [exec + 8]
  mov long [exec + 16], ebx
  lea ebx, [buffer]
  mov long [exec + 20], ebx
  mov long [exec + 24], eax
  mov byte al, 0x0b
  mov ebx, exec
  lea ecx, [exec + 12]
  lea edx, [exec + 24]
  int 0x80
这里有几个问题:

  • exec
    中只保留27个字节,但需要保留28个字节,因此覆盖
    缓冲区的开头。您在
    gdb
    中看到的是
    exec
    块的一部分,后面是
    缓冲区。请注意,您还剩下3个
    D
    占位符,但您将再写入4个字节。这是主要问题
  • 将消息长度传递到
    read
    syscall。这不是一个可怕的问题,但当您有128个字节的空间时,将输入限制为17个字节
  • read
    系统调用返回换行符,但不以null结束字符串。根据内存布局的不同,您可能会幸运地得到以下零字节,并且换行被shell忽略。为了安全起见,您应该自己用0替换
    \n

  • 你好,谢谢你的建议。但是为什么我需要28个字节呢?我的意思是指针有4个字节大。我需要4个参数,对吗?你能解释一下吗?:)
    mov long[exec+24],eax将在偏移量24到27写入字节,但27已经是
    缓冲区的一部分。请注意,偏移从0开始。数一数。