C 无数据段的ARM部件中的Hello World
我有一个ARM汇编语言的“Hello,World!”程序,我想把它转换成shell代码,在内存区域中执行它。在英特尔汇编语言中,我去掉了.data部分,因为转换为shell代码时只使用.text部分。() 现在,我正努力在ARMs汇编语言中做到这一点。其依据是以下代码: 手臂总成Hello WorldC 无数据段的ARM部件中的Hello World,c,assembly,arm,shellcode,C,Assembly,Arm,Shellcode,我有一个ARM汇编语言的“Hello,World!”程序,我想把它转换成shell代码,在内存区域中执行它。在英特尔汇编语言中,我去掉了.data部分,因为转换为shell代码时只使用.text部分。() 现在,我正努力在ARMs汇编语言中做到这一点。其依据是以下代码: 手臂总成Hello World .global _start _start: mov r7, #4 mov r0, #1 ldr r1,=string mov r2, #12 swi 0
.global _start
_start:
mov r7, #4
mov r0, #1
ldr r1,=string
mov r2, #12
swi 0
mov r7, #1
swi 0
.data
string:
.ascii "Hello, World"
修改了ARM Assembly Hello World以省略.data部分
.global _start
.global mymessage
mymessage:
mov r7, #4
mov r0, #1
pop {r1}
mov r2, #12
swi 0
mov r7, #1
swi 0
_start:
bl mymessage
.ascii "Hello, World"
但这不起作用,因为这显然是一个“非法指令”。有什么想法吗?ARM已经有了PC相对寻址,而且在任何情况下,
bl
都不会将返回地址推送到堆栈上
这项工作:
.global _start
_start:
mov r7, #4
mov r0, #1
adr r1, string
mov r2, #12
swi 0
mov r7, #1
swi 0
string:
.ascii "Hello, World"
ARM已经具有PC相对寻址,并且在任何情况下,
bl
都不会将返回地址推送到堆栈上。bl
是等效的,但ARM不会将返回地址推送到堆栈上。但是因为ARM有PC相对寻址,你根本不需要这个技巧。啊,我明白了,谢谢!因为您的字符串在任何情况下都是一个常量只读,所以它可以在中。文本不必在中。数据这里有一个很好的设置来测试这一点:酷,谢谢,这很有效!现在我们只需要弄清楚如何将其转换为外壳代码。有什么想法吗?不知道你想转换什么。。。只需在汇编程序中运行它,就可以得到字节。我们要提取外壳代码,如x04\xe7\x06….,并且“string.ascii”区域的字节与其余字节分开。我只是把它们全部放进一个“组合”外壳代码中执行吗?是的。不知道你说的“分离”是什么意思,它们应该直接跟在代码后面。没关系,我明白了;)谢谢你的帮助,杰斯特!