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
_start
Ausrichtung einrichten, Argumente auf Stack schieben, aufrufen__libc_start_main
- in
__libc_start_main
die erste auszuführende Zeile istjmp *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