0

リバースエンジニアリングの学習(独学)を始めたばかりです。私は組み立てを理解できるところまで知っています。Cコードを逆アセンブルした後にポップアップする基本的な命令は、私にはほとんど理解できます(各命令の意味など)。それが始まったので、誰かがこれらをばかげた質問のように感じるかもしれません.リバースの基本に関するいくつかの良い電子書籍を提案してください. さて、クエリは次のとおりです。- これは単純な C コードです。

#include<stdio.h>
int main(void)
{
    printf("hello world");
}

次に、main の逆アセンブル コードを示します。

0x004013b0 <+0>:     push   %ebp                         //saves ebp to stack
0x004013b1 <+1>:     mov    %esp,%ebp                    //saves esp onto ebp
0x004013b3 <+3>:     and    $0xfffffff0,%esp             //alignong the stack
0x004013b6 <+6>:     sub    $0x10,%esp                   //creating 16 bytes on stack
0x004013b9 <+9>:     call   0x401980 <__main>            //main call
0x004013be <+14>:    movl   $0x403064,(%esp)             ?? what is it exactly doing??
0x004013c5 <+21>:    call   0x401bf0 <printf>            //print call
0x004013ca <+26>:    leave
0x004013cb <+27>:    ret

ここでは、それが何をしているのか理解できませんでした (0x403064 の内容が esp のスタックにコピーされているようですが)- movl $0x403064,(%esp)

このアセンブリ コードでは、"hello world" がどこに保存されているかを知る必要があります。また、基本からの逆転を学ぶために、誰かが私にいくつかの良い読み物を提案できれば. 前もって感謝します。

4

1 に答える 1

0

printfこの場合、スタック上でパラメータを待機します。文字列がメモリに格納されているアドレスは$0x403064. 指示が見えるように

movl   $0x403064,(%esp)

このアドレスをスタックにコピーします ( の中括弧に注意してくださいesp)。

正直なところ、これは通常の方法ではありません。しかし、あなたのプログラムはとても単純なので、コンパイラーはマイクロ最適化を行います。これは、一部の機械語命令をスキップするのに役立ちます。lea一般に、と命令の何らかの組み合わせを使用pushしてアドレスをスタックにコピーし、呼び出しの後で (ここにある呼び出し規則で)、命令を使用してその後を修正cdeclするのが通常です。addesp

編集:

gdb を使用したデバッグ セッションに続いて、コマンドを使用x/sb 0x403064してメモリ内の文字列を表示します。

GNU gdb (GDB) 7.5
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from d:\temp\C++11\test.exe...(no debugging symbols found)...don
e.
(gdb) start
Temporary breakpoint 1 at 0x4013b3
Starting program: d:\temp\C++11\test.exe
[New Thread 5348.0x16f4]

Temporary breakpoint 1, 0x004013b3 in main ()
(gdb) disassemble $eip
Dump of assembler code for function main:
   0x004013b0 <+0>:     push   %ebp
   0x004013b1 <+1>:     mov    %esp,%ebp
=> 0x004013b3 <+3>:     and    $0xfffffff0,%esp
   0x004013b6 <+6>:     sub    $0x10,%esp
   0x004013b9 <+9>:     call   0x401990 <__main>
   0x004013be <+14>:    movl   $0x403064,(%esp)
   0x004013c5 <+21>:    call   0x401c10 <printf>
   0x004013ca <+26>:    mov    $0x0,%eax
   0x004013cf <+31>:    leave
   0x004013d0 <+32>:    ret
   0x004013d1 <+33>:    nop
   0x004013d2 <+34>:    nop
   0x004013d3 <+35>:    nop
   0x004013d4 <+36>:    add    %al,(%eax)
   0x004013d6 <+38>:    add    %al,(%eax)
   0x004013d8 <+40>:    add    %al,(%eax)
   0x004013da <+42>:    add    %al,(%eax)
   0x004013dc <+44>:    add    %al,(%eax)
   0x004013de <+46>:    add    %al,(%eax)
End of assembler dump.
(gdb) x/sb 0x403064
0x403064 <_Jv_RegisterClasses+4206692>: "hello world"
(gdb) x/12xb 0x403064
0x403064 <_Jv_RegisterClasses+4206692>: 0x68    0x65    0x6c    0x6c    0x6f
0x20    0x77    0x6f
0x40306c <_Jv_RegisterClasses+4206700>: 0x72    0x6c    0x64    0x00
(gdb)
于 2012-11-07T05:57:47.807 に答える