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