Was passiert in __libc_start_main?

Lesezeit: 3 Minuten

Benutzer-Avatar
Weg

Ich versuche wirklich, die Schritte von High-Level-Code -> ausführbare Datei zu verstehen, habe aber einige Schwierigkeiten.

Ich habe leer geschrieben int main() {} C-Datei und versuche, die Disassemblierung über zu entschlüsseln objdump -d. Hier ist, was los ist:

  • in _startAusrichtung einrichten, Argumente auf Stack schieben, aufrufen __libc_start_main
  • in __libc_start_maindie erste auszuführende Zeile ist jmp *0x8049658

Allerdings bei Verwendung objdump -R um die Umzugsunterlagen auszuchecken, den Wert in 0x8049658 ist __libc_start_main selbst!

mir fehlt hier was..

Bearbeiten: Hier ist ein Teil der Quelle;

 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

  • Können Sie auch den vollständigen Assemblycode posten, auf den Sie sich beziehen? Es wird unser Leben viel einfacher machen.

    – Richard J.Ross III

    6. Juni 2013 um 19:14 Uhr

  • Was passiert, wenn Sie die Assembly mit einem Debugger schrittweise durchlaufen? Es ist möglich, dass der dynamische Linker den Wert am Speicherort 0x8049658 überschreibt, sodass das Programm zu dem Zeitpunkt, an dem das Programm an die jmp *0x8049658 Anweisung, springt es zu dem Wert, der dort zur Laufzeit geschrieben wurde.

    – Adam Rosenfield

    6. Juni 2013 um 19:28 Uhr

  • @AdamRosenfield Ich weiß nicht zu 100%, wie man das macht. Ich weiß, wie man gdb so einrichtet, dass es meinen C-Code durchläuft, aber ich weiß nicht, wie man es für die Assembly macht: S

    – Weg

    6. Juni 2013 um 19:39 Uhr

  • __libc_start_main@plt ist nicht das gleiche Symbol wie __libc_start_main

    – Michael Burr

    6. Juni 2013 um 21:04 Uhr


  • @Zak Sie sollten kein spezielles gdb-Setup benötigen. Verwenden Sie einfach die gdb-Befehle si und ni, um Ihr Programm eine Anweisung nach der anderen auszuführen.

    – Sigissaft

    6. Juni 2013 um 21:35 Uhr

Benutzer-Avatar
Colin D. Bennett

Der erste Block, der auf “@plt” endet, ist die Prozedurverknüpfungstabelle (https://stackoverflow.com/a/5469334/994153). Das jmp *0x8049658 ist eine indirekte Verzweigungsanweisung, es wird also tatsächlich gesprungen __libc_start_main wo immer es eigentlich wird zur Laufzeit in den RAM geladen.

Die echte RAM-Adresse von __libc_start_main wird in der Tabelle DYNAMIC RELOCATION RECORDS gefunden, die im RAM durch den dynamischen Lader erstellt wird, wenn das Programm geladen wird.

  • Heutzutage wird es tatsächlich beim ersten Aufruf gelöst. Dieser Blogbeitrag zeigt, wie man den dynamischen Linker bei der Arbeit zur Laufzeit beobachten kann dustin.schultz.io/how-is-glibc-loaded-at-runtime.html

    – falstaff

    14. Mai 2017 um 1:31 Uhr

  • ^ Dies wird aufgerufen lazy loading für diejenigen, die nach Schlüsselwörtern suchen.

    – sherrelbc

    13. Oktober 2017 um 23:41 Uhr

1373170cookie-checkWas passiert in __libc_start_main?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy