我可以通过这样做将4个字节压入堆栈:
push DWORD 123
Run Code Online (Sandbox Code Playgroud)
但我发现我可以在push不指定操作数大小的情况下使用:
push 123
Run Code Online (Sandbox Code Playgroud)
在这种情况下,push指令将多少字节压入堆栈?推送的字节数是否取决于操作数大小(因此在我的示例中它将推送1个字节)?
我正在尝试将“main”的地址加载到 GNU 汇编器中的寄存器 (R10) 中。我没办法。在这里,我有什么和我收到的错误消息。
main:
lea main, %r10
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下语法(这次使用 mov)
main:
movq $main, %r10
Run Code Online (Sandbox Code Playgroud)
使用以上两种方法,我都会收到以下错误:
/usr/bin/ld: /tmp/ccxZ8pWr.o: relocation R_X86_64_32S against symbol `main' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
使用 -fPIC 编译不能解决问题,只会给我同样的错误。
在我的64位Intel机器下面代码工作:
mov rdi, 1 << 40
add r10, rdi
Run Code Online (Sandbox Code Playgroud)
而这相当于一个产生警告并且不起作用:
add r10, 1 << 40
Run Code Online (Sandbox Code Playgroud)
我应该坚持1号还是我错过了什么?这种行为似乎很尴尬.
代码nr 2产生的警告:
warning: signed dword immediate exceeds bounds
Run Code Online (Sandbox Code Playgroud) 经过大约100亿次测试,如果imm64比m64AMD64快0.1纳秒,m64似乎更快,但我真的不明白。val_ptr以下代码中的地址本身不是立即数吗?
# Text section
.section __TEXT,__text,regular,pure_instructions
# 64-bit code
.code64
# Intel syntax
.intel_syntax noprefix
# Target macOS High Sierra
.macosx_version_min 10,13,0
# Make those two test functions global for the C measurer
.globl _test1
.globl _test2
# Test 1, imm64
_test1:
# Move the immediate value 0xDEADBEEFFEEDFACE to RAX (return value)
movabs rax, 0xDEADBEEFFEEDFACE
ret
# Test 2, m64
_test2:
# Move from the RAM (val_ptr) to RAX (return value)
mov …Run Code Online (Sandbox Code Playgroud) 我想编写一个汇编程序,该程序通过 EXECVE(系统调用 #0x3C)程序 /bin/ls 和开关 -al 执行。
手册页 (man 2 execve) 指出调用需要三个值:
int execve(const char *filename, char *const argv[], char *const envp[]);
我不太明白如何建立三个论点。据我所知,第一个参数进入RDI,第二个进入RSI,第三个进入RDX。我相信设置第一个就足够了
push 0x736c2f2f ;sl//
push 0x6e69622f ;nib/
mov rdi, rsp
Run Code Online (Sandbox Code Playgroud)
对于第三个,事情很简单:
xor r11, r11
mov rdx, r11
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何构建第二个参数,它应该是一个包含 ['/bin//ls', '-aal']
我需要为 x86-64 编写它,所以请不要int 0x80提出建议。