我正在用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
答案 0 :(得分:1)
那里有一些问题:
exec
保留27个字节,但需要28个字节才能覆盖buffer
的开头。您在gdb
中看到的内容属于exec
块,后跟buffer
。请注意,您剩下3个D
个占位符,但您将再写4个字节。这是主要问题。read
系统调用。这不是一个可怕的问题,但是当你有128个空格时,输入限制为17个字节。read
系统调用返回换行符,但不会终止字符串。根据内存布局,您可能会遇到以下零字节,并且shell会忽略换行符。为安全起见,您应自行将\n
替换为0.