Was ist Los in __libc_start_main?

Ich versuche es wirklich zu verstehen, die Schritte von der high-level-code -> ausführbare.. aber ich habe einige Schwierigkeiten.

Ich geschrieben habe, eine leere int main() {} C-Datei und versuche, das zu entziffern, Demontage über objdump -d. Hier ist was Los:

  • in _start, einrichten Ausrichtung, drücken Sie die Argumente auf den stack, call __libc_start_main
  • in __libc_start_main die erste Zeile ausgeführt wird jmp *0x8049658

Jedoch bei der Verwendung objdump -R zu überprüfen, die Verlagerung von Datensätzen, wird der Wert in 0x8049658 ist __libc_start_main selbst!

Bin ich hier etwas fehlt..

edit: hier ein Teil des Quellcodes;

 080482c0 <__libc_start_main@plt>:
 80482c0:       ff 25 58 96 04 08       jmp    *0x8049658
 80482c6:       68 08 00 00 00          push   $0x8
 80482cb:       e9 d0 ff ff ff          jmp    80482a0 <_init+0x2c>

Disassembly of section .text:

080482d0 <_start>:
 80482d0:       31 ed                   xor    %ebp,%ebp
 80482d2:       5e                      pop    %esi
 80482d3:       89 e1                   mov    %esp,%ecx
 80482d5:       83 e4 f0                and    $0xfffffff0,%esp
 80482d8:       50                      push   %eax
 80482d9:       54                      push   %esp
 80482da:       52                      push   %edx
 80482db:       68 50 84 04 08          push   $0x8048450
 80482e0:       68 e0 83 04 08          push   $0x80483e0
 80482e5:       51                      push   %ecx
 80482e6:       56                      push   %esi
 80482e7:       68 d0 83 04 08          push   $0x80483d0
 80482ec:       e8 cf ff ff ff          call   80482c0 <__libc_start_main@plt>
 80482f1:       f4                      hlt
 80482f2:       66 90                   xchg   %ax,%ax



 DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049644 R_386_GLOB_DAT    __gmon_start__
08049654 R_386_JUMP_SLOT   __gmon_start__
08049658 R_386_JUMP_SLOT   __libc_start_main
  • Außerdem können Sie die vollständigen Assembler-code, die Sie verweisen? Es macht unser Leben viel einfacher.
  • Was passiert, wenn Sie Schritt für Schritt durch die Montage mit einem debugger? Es ist möglich, dass der dynamische linker überschreibt den Wert an der Speicherstelle 0x8049658, so dass durch die Zeit, die das Programm bekommt, um die jmp *0x8049658 Anweisung, es springt auch immer Wert habe geschrieben, gibt es zur Laufzeit.
  • Ich bin mir nicht 100% wie das zu tun. Ich weiß, wie zu setzen, gdb bis zu Schritt durch mein C-code, aber weiß nicht, wie es für die Montage :S
  • der gdb wird nicht einmal lassen Sie mich führen Sie das Programm. Ich bekomme [Inferior 1 (process 24455) exited with code 01]
  • __libc_start_main@plt ist nicht das gleiche symbol wie __libc_start_main
  • Sie sollten nicht benötigen keine speziellen gdb-setup. Verwenden Sie einfach die gdb-Befehle si und ni führen Sie Ihr Programm eine Anweisung zu einem Zeitpunkt.
  • auch keine nur __libc_start_main - symbol erscheint in meiner objdump

InformationsquelleAutor gone | 2013-06-06
Schreibe einen Kommentar