2013-06-06 23 views
14

Naprawdę staram się zrozumieć kroki z kodu wysokiego poziomu -> wykonywalny .. ale mam pewne trudności.Co się dzieje w __libc_start_main?

Napisałem pusty plik C int main() {} i próbuję rozszyfrować demontaż za pomocą objdump -d. Oto co się dzieje:

  • w _start, skonfigurować ustawienie, naciśnij argumentów na stosie, zadzwoń __libc_start_main
  • w __libc_start_main, pierwsza linia do wykonania jest jmp *0x8049658

Jednak po użyciu objdump -R do sprawdź rekordy przeniesienia, wartość w 0x8049658 sama w sobie to !

ja czegoś brakuje tutaj ..

edit: oto niektóre źródła;

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

Możesz również zamieścić pełny kod montażu, do którego się odwołujesz? Ułatwi nam to życie. –

+1

Co się stanie, jeśli wykonasz krok za pomocą debuggera? Możliwe, że dynamiczny linker nadpisze wartość w lokalizacji pamięci 0x8049658, więc zanim program przejdzie do instrukcji 'jmp * 0x8049658', przeskakuje ona do wartości zapisanej tam w czasie wykonywania. –

+0

@AdamRosenfield Nie jestem w 100% jak to zrobić. Wiem, jak ustawić GDB do kroku mojego kodu C, ale nie wiem jak to zrobić dla zespołu: S – gone

Odpowiedz

8

Pierwszy blok z końcówką „@plt” jest procedura połączenie tabeli (https://stackoverflow.com/a/5469334/994153). jmp *0x8049658 jest pośrednią instrukcją rozgałęzienia, więc w istocie przeskakuje do __libc_start_main, gdzie tylko faktycznie kończy się ładowanie w pamięci RAM w czasie wykonywania.

Prawdziwy adres pamięci RAM __libc_start_main znajduje się w tabeli DYNAMIC RELOCATION RECORDS, która jest tworzona w pamięci RAM przez dynamiczny program ładujący po załadowaniu programu.

+0

To faktycznie zostaje rozwiązane przy pierwszym połączeniu w dzisiejszych czasach, ten wpis na blogu pokazuje, jak można oglądać dynamiczny linker pracujący w czasie wykonywania http: //dustin.schultz. io/how-is-glibc-loaded-at-runtime.html – falstaff

+0

^To się nazywa "Leniwe ładowanie" dla osób szukających słów kluczowych. – sherrellbc

Powiązane problemy