2017-05-10 7 views
2

"Hello、World!"プログラムをARMアセンブリ言語で記述し、それをシェルコードに変換してメモリ領域で実行したいと考えています。インテルのアセンブリ言語では、シェルコードに変換するときに.textセクションのみが使用されているので、.dataセクションは取り除かれました。 (See hereHello World with ARMアセンブリのデータセクションなし

私はARMアセンブリ言語で同じことをするのに苦労しています。

ARMアセンブリのHello World

.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" 

.dataセクションを省略するしかし、これは動作しませんARMアセンブリのHello Worldを修正

.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" 

:基礎は、以下のコードでありますこれは明らかに「違法命令」であるためです。何か案は?

+0

をARMは、既にPC相対アドレッシングがあり、どのような場合には、 'bl'は、スタック上のリターンアドレスをプッシュしていません。 – Jester

+1

'bl'は同等ですが、ARMは戻りアドレスをスタックに入れません。しかし、ARMにはPCの相対アドレスがあるので、あなたは全くのトリックを必要としません。 – Jester

+0

ああ、ありがとう! – Marvin

答えて

1

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" 

この仕事ができる:

+0

でなければなりません。これをシェルコードに変換する方法を理解する必要があります。何か案は? – Marvin

+1

あなたは何を変換したいのか分かりません...それをアセンブラで実行するだけで、バイトが得られます。 – Jester

+0

x04 \ xe7 \ x06 ....のようなシェルコードを抽出し、 "文字列.ascii"領域のバイトを残りのバイトから分離します。私はそれらをすべて "結合された"シェルコードに入れて実行しますか? – Marvin