错误:在可执行段中检测到未对齐的操作码

时间:2015-09-21 04:38:50

标签: android compiler-errors exploit

当通过ndk-build从https://github.com/secmob/PoCForCVE-2015-1528编译CVE-2015-1528的poc时,会出现此错误:

[armeabi] Compile++ thumb: exploitmedia <= shellcode.cpp
/home/android/Desktop/work_space/PoCForCVE-2015-1528/mediaserver/jni/shellcode.cpp:109:38: warning: always_inline function might not be inlinable [-Wattributes]
__attribute__((always_inline)) void *run_code(char *code,dlopen_t dlopen_f){
                                  ^
/tmp/ccd5ZsxF.s: Assembler messages:
/tmp/ccd5ZsxF.s: Error: unaligned opcodes detected in executable segment
make: *** [/home/android/Desktop/work_space/PoCForCVE-2015-1528/mediaserver/obj/local/armeabi/objs/exploitmedia/shellcode.o] Error 1

注意:编写此poc的目标是教育性的。

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。我应该使用像mmm这样的AOSP编译器。 编译AOSP后,出现mmm commnad。 用法:

mmm path/to/PoCForCVE-2015-1528/mediaserver/

答案 1 :(得分:0)

未使用的自动分配变量可能导致--gdwarf-2

出现此问题

我对问题没有很深入的了解,但是这里有一个最小的可运行示例。

考虑以下Linux ARMv8问候世界:

.text
.global _start
_start:
asm_main_after_prologue:
    /* write */
    mov x0, #1
    ldr x1, =msg
    ldr x2, =len
    mov x8, #64
    svc #0

    /* exit */
    mov x0, #0
    mov x8, #93
    svc #0
msg:
    .ascii "hello syscall v8\n"
len = . - msg

可与以下命令很好地组合在一起:

aarch64-linux-gnu-as --gdwarf-2 hello.S

在Ubuntu 16.04 aarch64-linux-gnu-gcc 5.4.0上。

现在,如果您删除对msg变量的引用:

.text
.global _start
_start:
asm_main_after_prologue:
    /* exit */
    mov x0, #0
    mov x8, #93
    svc #0
msg:
    .ascii "hello syscall v8\n"
len = . - msg

它开始失败并显示:

hello.S: Assembler messages:
hello.S: Error: unaligned opcodes detected in executable segment

以某种方式,当删除引用时,必须考虑hello syscall v8字符串是一条指令,而不是数据。