相关疑难解决方法(0)

当我没有指定操作数大小时,push指令压入堆栈的字节数是多少?

我可以通过这样做将4个字节压入堆栈:

push DWORD 123
Run Code Online (Sandbox Code Playgroud)

但我发现我可以在push不指定操作数大小的情况下使用:

push 123
Run Code Online (Sandbox Code Playgroud)

在这种情况下,push指令将多少字节压入堆栈?推送的字节数是否取决于操作数大小(因此在我的示例中它将推送1个字节)?

x86 assembly

11
推荐指数
2
解决办法
7188
查看次数

如何将函数或标签的地址加载到寄存器中

我正在尝试将“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 编译不能解决问题,只会给我同样的错误。

assembly gcc x86-64 att addressing-mode

10
推荐指数
1
解决办法
5302
查看次数

我可以将64位常数添加到64位寄存器吗?

在我的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)

assembly x86-64

5
推荐指数
1
解决办法
1045
查看次数

对于 x86-64,imm64 或 m64 哪个更快?

经过大约100亿次测试,如果imm64m64AMD64快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)

optimization x86 assembly x86-64 micro-optimization

2
推荐指数
1
解决办法
863
查看次数

在栈上为execve创建一个arg数组

我想编写一个汇编程序,该程序通过 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提出建议。

assembly x86-64 shellcode

2
推荐指数
1
解决办法
479
查看次数