相关疑难解决方法(0)

为什么ASLR似乎不起作用

我检查了ASLR是否启用如下,我认为它是:

[user@localhost test]$ cat /proc/sys/kernel/randomize_va_space
2
Run Code Online (Sandbox Code Playgroud)

我试过用以下程序测试它:

test.c:

#include <stdio.h>
int main(void)
{
    printf("%p\n", main);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

如果ASLR处于活动状态,我希望每次运行都能使用不同的地址,对吧?但我每次都得到同样的东西.我测试了64位和32位可执行文件.我正在使用64位Arch Linux系统来测试这个:

[user@localhost test]$ gcc test.c -o test
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ gcc -m32 test.c -o test
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
Run Code Online (Sandbox Code Playgroud)

如您所见,每次运行的地址都相同.这不是说ASLR关闭了吗?

c linux aslr

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

在GNU中以.intel_syntax区分内存与常量

我有一条用Intel语法编写的指令(使用gas作为汇编程序),看起来像这样:

mov rdx, msg_size
...
msg: .ascii "Hello, world!\n"
     .set msg_size, . - msg
Run Code Online (Sandbox Code Playgroud)

但是该mov指令正在汇编到mov 0xe,%rdx,而不是mov $0xe,%rdx我期望的那样。我应该如何编写第一条指令(或的定义msg_size)以获得预期的行为?

assembly gnu-assembler intel-syntax

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

MASM x64中的跳转表实现?

我正在尝试使用跳转表在程序集(MASM64,Windows,x64)中实现算法。基本思想是:我需要对数据进行3种不同类型的操作。这些操作取决于一些变量,但是我发现实现许多切换和许多长的实现很乏味。

PUBLIC superFunc@@40 ;__vectorcall decoration
.DATA
ALIGN 16
jumpTable1 qword func_11, func_12, func_13, func_14
jumpTable2 qword func_21, func_22, func_23, func_24
jumpTable3 qword func_31, func_32, func_33, func_34

.CODE
superFunc@@40 PROC
        ;no stack actions, as we should do our stuff as a leaf function
        ;assume the first parameter (rcx) is our jumpTable index, and it's
        ;the same index for all functions
        mov     rax,    qword ptr [rcx*8 + offset jumpTable1]
        mov     r10,    qword ptr [rcx*8 + offset jumpTable2]
        mov     r11,    qword ptr [rcx*8 …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 masm

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

为什么 movw di, [ebp+4] 是非法的?

我正在尝试为 Intel Atom 系统编译基于 6502 的模拟器,但是我收到了此文件的以下类型的错误:https : //github.com/littlefluffytoys/Beebdroid/blob/master/app/src/main/ jni/6502asm_x86.S

jni/6502asm_x86.S:163:5: error: invalid instruction mnemonic 'movb'
movb ch, [ ebp+9] # ch = r10 = S
^~~~
jni/6502asm_x86.S:181:2: error: invalid instruction mnemonic 'pushw'
pushw 0xfffa
^~~~~
Run Code Online (Sandbox Code Playgroud)

这是 32/64 位的问题吗?我熟悉汇编,但不熟悉 x86 或 x86_64,而且我发现很难追踪正在发生的事情。我知道 movq 在 32 位上不可用,但我想不出为什么 byte 根本不可用。

我不得不从文件中删除所有 % 符号 - 似乎我的 cc (4.8.4) 版本不喜欢它们 - 但后来遇到了这个 mov 问题。

特别令人困惑的是 movw 和 movb 的早期实例不会产生错误,例如

    movw  di,  [ ebp+4]     #  di = r6  = PC
    movb  cl,  [ ebp+6]     # …
Run Code Online (Sandbox Code Playgroud)

x86 assembly

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

用c在内存二进制文件中执行

我目前被困在我的 c 项目上,我试图用 C 语言在内存中运行一个程序,但我一直都有分段错误。

首先我有一个简单的hello_worl.c,我编译它,我有输出hello_world

第二,我hello_world像这样转换为 C 标头:

xxd -i hello_world > hello.h

(hello.h 的内容)

unsigned char hello[] = {
...
}
unsigned int hello_len = 16696;
Run Code Online (Sandbox Code Playgroud)

最后,我创建了程序main.c,看起来像这样:

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include "hello.h"

int main ()
{
    int (*my_hello) () = NULL;

    // allocate executable buffer
    my_hello = mmap (0, sizeof(hello), PROT_READ|PROT_WRITE|PROT_EXEC,
                MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

    // copy code to buffer
    memcpy (my_hello, hello, sizeof(hello));
    __builtin___clear_cache (my_hello, my_hello + …
Run Code Online (Sandbox Code Playgroud)

c linux x86-64 dynamic-memory-allocation

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

编译 x86_64 架构时是否应该使用 gcc -fPIC 选项?

gcc 文档指出:“此选项在 AArch64、m68k、PowerPC 和 SPARC 上有所不同。” 我没有看到列出的 x86 或 x64 架构。AArch64 与 ARM 处理器有关,不是吗?如果针对 linux_x86_x64 进行编译,那么此选项会产生任何值吗?

c linux x86 gcc position-independent-code

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

通过将所有寄存器名称从eXX更改为rXX,从32位移植到64位,使因子返回0?

幸运的是,学习计算机编程艺术的所有用途都可以访问Stack Overflow等社区!我决定承担学习如何编程计算机的任务,我正在通过一本名为"从头开始编程"的电子书的知识这样做,该电子书教会读者如何用汇编语言创建程序在GNU/Linux环境中.

我在本书中的进展已经到了创建一个程序,该程序用函数计算整数4的阶乘,我已经完成并完成了没有由GCC的汇编程序引起的或由运行程序引起的任何错误.但是,我的程序中的功能没有返回正确的答案!阶乘4是24,但程序返回值0!说对了,我不知道为什么会这样!

以下是供您考虑的代码:

.section .data

.section .text

.globl _start

.globl factorial

_start:

push $4                    #this is the function argument
call factorial             #the function is called
add $4, %rsp               #the stack is restored to its original 
                           #state before the function was called
mov %rax, %rbx             #this instruction will move the result 
                           #computed by the function into the rbx 
                           #register and will serve as the return 
                           #value 
mov $1, %rax               #1 must be placed inside this register for 
                           #the exit system …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 function 32bit-64bit

0
推荐指数
1
解决办法
138
查看次数