2013-06-06 4 views
14

Ich versuche wirklich, die Schritte von High-Level-Code zu verstehen -> ausführbare .. aber habe einige Schwierigkeiten.Was passiert in __libc_start_main?

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

  • in _start eingesetzten Ausrichtung, schieben Argumente auf dem Stack, rufen __libc_start_main
  • in __libc_start_main, die erste Zeile auszuführen ist jmp *0x8049658

jedoch bei der Verwendung objdump -R zu Schau dir die Umzugssätze an, der Wert in 0x8049658 ist __libc_start_main selbst!

ich hier etwas fehlt bin ..

edit: hier einige der Quelle;

080482c0 <[email protected]>: 
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 <[email protected]> 
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 
+0

Können Sie auch den vollständigen Assembly Code, den Sie referenzieren, veröffentlichen? Es wird unser Leben viel einfacher machen. –

+1

Was passiert, wenn Sie mit einem Debugger durch die Assembly gehen? Es ist möglich, dass der dynamische Linker den Wert an der Speicherstelle 0x8049658 überschreibt, so dass zu dem Zeitpunkt, zu dem das Programm die Anweisung 'jmp * 0x8049658' erreicht, zu dem Wert springt, der zur Laufzeit dorthin geschrieben wurde. –

+0

@AdamRosenfield Ich bin nicht 100% wie das geht. Ich weiß, wie man gdb setzt, um durch meinen C-Code zu gehen, aber weiß nicht, wie man es für die Versammlung macht: S – gone

Antwort

8

Der erste Block, in "@plt" endet, ist die Prozedur Verknüpfungstabelle (https://stackoverflow.com/a/5469334/994153). Die jmp *0x8049658 ist eine indirekte Verzweigungsinstruktion, so dass sie tatsächlich zu __libc_start_main springt, wo immer sie tatsächlich wird, die zur Laufzeit in RAM geladen wird.

Die reale RAM-Adresse von __libc_start_main befindet sich in der Tabelle DYNAMIC RELOCATION RECORDS, die beim Laden des Programms vom dynamischen Lader im RAM erstellt wird.

+0

Es wird tatsächlich beim ersten Aufruf in diesen Tagen gelöst, dieser Blogbeitrag zeigt, wie man den dynamischen Linker zur Laufzeit beobachten kann http: //dustin.schultz. io/how-is-glibc-loaded-at-run.html.html – falstaff

+0

^Dies wird 'Lazy Loading' genannt für diejenigen, die nach Schlüsselwörtern suchen. – sherrellbc