execv用户输入

时间:2014-05-10 00:20:30

标签: assembly x86 intel

我正在用x86er汇编intel语法编写一个小程序。它应该要求用户输入像" 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

1 个答案:

答案 0 :(得分:1)

那里有一些问题:

  1. 您只需在exec保留27个字节,但需要28个字节才能覆盖buffer的开头。您在gdb中看到的内容属于exec块,后跟buffer。请注意,您剩下3个D个占位符,但您将再写4个字节。这是主要问题。
  2. 您将消息长度传递给read系统调用。这不是一个可怕的问题,但是当你有128个空格时,输入限制为17个字节。
  3. read系统调用返回换行符,但不会终止字符串。根据内存布局,您可能会遇到以下零字节,并且shell会忽略换行符。为安全起见,您应自行将\n替换为0.