我正在使用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
?答案 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