通过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的目标是教育性的。
最佳答案
未使用的自动分配的变量可能会导致--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
字符串是一条指令,而不是数据。