0

/ home /httpdの「grades.txt」のリンクを解除するインラインアセンブリプログラムを作成しました。コードは次のとおりです。

void main()
{
   __asm__(
   "jmp L\n"\
   "sub1:\n"\
   "movl 0x4(%esp), %ebx\n"\
   "movb $0xa, %al\n"\
   "int $0x80\n"\
   "L:\n"\
   "call sub1\n"\
   ".string \"//home//httpd//grades.txt\" "
   );
}

「/home/ httpd」のgrades.txtのリンクを解除するために、コードは私が望むことを実行すると思いますが、実行すると、セグメント障害が発生します。

そして、gdbを使用してこの障害に対処しましたが、「jmp L」行を実行できないことがわかりました。プログラムは、「ctrl + c」と入力して中断するまで、5行目["__asm __("]で停止します。

「exit(0)」のアセンブリを追加してプログラムを正常に終了させ、実行を続けると、プログラムは何もせずに終了します。

それで、これは非常に紛らわしいです、なぜプログラムはjmp命令を実行しないのですか?エラーはありますか?

よろしくお願いします!

4

1 に答える 1

1

いくつかのこと:

  • 最上位 3 バイトを使用できないため、%eax代わりに を使用する必要があります。%al000000
  • movl 0x4(%esp), %ebx行はスタックにプッシュされていないmovl (%esp), %ebxため、%ebpリターンアドレスは%esp+0
  • コードint 80hを実行すると、コードが失敗して何度も呼び出さsub1れるため、追加のジャンプが必要です。

    int80h
    add $4, %esp # pop the return address
    jmp exit     # jump over the call
    call sub1
    ....
    exit:
    
  • 使用する必要はありません\- 文字列は連結されます

  • voidmain()Cの有効な戻り値の型ではありません

上記のヒントをまとめると、次のようになります。

int main()
{
   __asm__(
   "jmp L\n"
   "sub1:\n"
   "movl (%esp), %ebx\n"
   "movl $0xa, %eax\n"
   "int $0x80\n"
   "add $4, %esp\n"
   "jmp exit\n"
   "L:\n"
   "call sub1\n"
   ".string \"//home//httpd//grades.txt\"\n"
   "exit:\n"
   );
}
于 2013-01-10T01:16:22.003 に答える