malware-analyse und reverse engineeringmulticores.org/teaching/files/mare_03-laufzeit.pdf ·...
Post on 14-Oct-2019
3 Views
Preview:
TRANSCRIPT
Malware-AnalyseundReverseEngineering
3:Laufzeit!30.3.2017
Prof.Dr.MichaelEngel
Überblick(heute)
Themen:• LadenundAusführen vonBinärprogrammen• Linkerskripte• Dynamischer Loaderld.so• Statische undDynamische Libraries• Speicherallokation
MARE03– Laufzeit 2
Übersetzungeines(C-)ProgrammsPräprozessor• Expandiert#include undMakrosCompiler• ErzeugtAssembler-Quellcode
ausC-SourcecodeAssembler• ErzeugtObjektcodeausAssembler-
QuellcodeLinker• Fügt(einoder)mehrereObjektdateien
(+evtl.Libraries)zuausführbarerDatei(oderLibrary) zusammen
Loader• LädtausführbareDateizur
Ausführung inHauptspeicherMARE03– Laufzeit 3
Wiederholung:ELF-Struktur
ELF-DateibestehtausSektionen,u.a.:• Programmtext• VerschiedeneDatensegmente• Symbole
MARE03– Laufzeit 4
Sektion Funktion.text Maschinencode (Instruktionen)
undEinsprungadresse
.rodata Vorinitialisierte Konstanten
.data Vorinitialisierte Variable
.bss Uninitialisierte Daten
.symtab Adressen zu symbolischenNamen
VirtuellerSpeicherinUnix/Linux(1)
LinuxsetztVorhandenseineinerMMU*voraus• ÜbersetztvirtuelleAdresseninphysikalischeAdressen
• Illusion: JederProzesshatgesamtenAdressraumfürsichzurVerfügung• Schutzvon(physikalischem)SpeichervorungewünschtemZugriff• Granularität:„Seite“(z.B.4096Bytes)
MARE03– Laufzeit 5
*MMU=MemoryManage-ment Unit
VirtuellerSpeicherinUnix/Linux(2)
ÜbersetzungvonAdressenüberSeitentabellen• Fürjede(abgebildete)Speicherseite (page):Adressedeszugehörigen(gleich
großen)physikalischenSeitenrahmens (page frame)• Sparse mapping:nurimphys.SpeichervorhandeneSeitenabgebildet• Seitentabelleneintrag(page table entry)enthältnebenAdresseauch
InformationüberZugriffsrechte: Lesen/Schreiben*(undvielesmehr)
MARE03– Laufzeit 6
*Bei 32-BitIntel-CPUsfehlt Bit,dasAusführenvonCodeausderSeiteverbietet!
VirtuellerSpeicherinUnix/Linux(3)
StrukturderSeitentabelle• Seitentabelle(page table)istDatenstrukturimRAM• KleineAusschnitteimTranslationLookaside Buffer (TLB) zwischengespeichert
MARE03– Laufzeit 7
VirtuellesSpeicherlayoutvonProzessen(1)AufteilungdesvirtuellenAdressraums (hier:32Bit=4GB)• UserModeSpace=Prozessadressraum,separatfürjedenProzess• JederProzessbesitzteigeneSeitentabelle• KernelimoberemTeil(25/50%)jedes Prozessadressraumseingeblendet(Ausnahme:MacOSX)
MARE03– Laufzeit 8http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
VirtuellesSpeicherlayoutvonProzessen(2)JederProzessbesitzteigeneSeitentabelle• WirdbeiProzessumschaltungvomKernelumgeschaltet• AdressraumfürdenKernel(oberstesGigabytevirtuelleAdressen)bleibtimmereingeblendet
MARE03– Laufzeit 9http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
LayouteinesProzessesimSpeicher(1)
ÜbergangvonProgrammzuProzess• Definition:
„Programm=ProzessinAusführung“• Prozess=Laufzeitkontext einesProgramms• LadendesProgrammsinRAM• Zuteilungvirtueller AdressbereichezuProgrammsektionen• ZusätzlichReservierungvonAdressbereichenfürdynamischwachsendeBereiche• Heap,Stack
• Adressbereichoberhalb3GB(=0xC0000000)fürProgrammnichtles-/schreib-/ausführbar(dortistderKernel!)
MARE03– Laufzeit 10
LayouteinesProzessesimSpeicher(2)
MARE03– Laufzeit 11
InELF-Dateienthalten
Dynamischalloziert
Dynamischalloziert
MetainformationeninELFenthalten
DefinierendesSpeicherlayoutseinesProgramms(1)LinkerberücksichtigtLinkerScript• DefiniertAdressbereichefürELF-Sektionen• ZusätzlichauchEinsprungadressen,Reihenfolgen,Alignment,...
MARE03– Laufzeit 12
Einfaches Linker-Skript:
SECTIONS{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }}
Startbei virtuellerAdresse 0x10000:• Textsektion
Startbei virtuellerAdresse 0x80000000:• Zuerst .data• Direkt danach .bss
DefinierendesSpeicherlayoutseinesProgramms(2)Kontrolle:FunktioniertdasLinker-Skript?• AusgabevonSymbolenmitnm:
MARE03– Laufzeit 13
Linker-Skript foo.ld:SECTIONS{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }}
$ gcc –m32 –c foo.c$ ld –m elf_i386 –T foo.ld –o foo foo.o$ nm foo0001002c R a08000000 D b08000004 B c00010000 T main
Beispielprogramm foo.c:
const int a = 42;int b = 23;int c;
int main(void) {c = a + b;return c;
}
✓✓
✓
DefinierendesSpeicherlayoutseinesProgramms(3)...Sektion.rodata imLinkerskriptnichtangegeben:automatischalloziert!
MARE03– Laufzeit 14
Linker-Skript foo.ld:SECTIONS{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.rodata : { *(.rodata) }
.data : { *(.data) }
.bss : { *(.bss) }}
$ gcc –m32 –c foo.c$ ld –m elf_i386 –T foo.ld –o fox foo.o$ nm fox08000000 R a08000004 D b08000008 B c00010000 T main
Beispielprogramm foo.c:
const int a = 42;int b = 23;int c;
int main(void) {c = a + b;return c;
}
✓✓
✓
✓
…gehtdoch!
Linkerskripte können viel mehr – Anordnen einzelnerObjektdateien,Arithmetik aufAdressen,Alignment,Aufteilen zwischen ROM/RAM-Bereichen,…
DefinierendesSpeicherlayoutseinesProgramms(4)KontrolledesLayoutsmitreadelf:
MARE03– Laufzeit 15
$ readelf -l fox
Elf file type is EXEC (Executable file)Entry point 0x10000There are 3 program headers, starting at offset 52
Program Headers:Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg AlignLOAD 0x001000 0x00010000 0x00010000 0x00030 0x00030 R E 0x1000LOAD 0x002000 0x08000000 0x08000000 0x00004 0x00008 RW 0x1000GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:Segment Sections...00 .text01 .rodata .data .bss02
Linker-Skript foo.ld:SECTIONS{. = 0x10000;.text : { *(.text) }. = 0x8000000;.rodata : { *(.rodata) }.data : { *(.data) }.bss : { *(.bss) }
}
Shared Libraries(1)
Programmesind(meist)nichtstandalone• Gehtauch,istaberaufwendig...• LibrariesenthaltennützlicheFunktionalität,z.B.:• libc – C-Standardfunktionen• libm– Mathematikfunktionen• libX11– FunktionenfürX11WindowSystem
• VieleProgrammeenthaltendieselbenLibraries• BeistatischemLinken:KopievonLibrary-CodeistinjedemausführbarenProgrammenthalten➙ benötigtPlattenplatz
• KopievonLibrary-CodemussfürjedenProzessinHauptspeicheralloziert werden➙ benötigtRAM
MARE03– Laufzeit 16
Shared Libraries(2)
Shared LibrariessindELF-Dateien• Enthaltenüblicherweisekeinmain• NichtinELF-DateieinesProgrammsenthalteneFunktionen/Symbolemüsseninshared library/ies gesuchtwerden
• Namensauflösungistaufwendig• Shared libraries verwendenHashtabellen
• MehrzuNamensauflösungnächsteWoche...
MARE03– Laufzeit 17
DynamischerLinkerld.so
Welcheshared libraries werdenvoneinemELF-Filereferenziert?
MARE03– Laufzeit 18
$ gcc -m32 -o foo foo.o$ ldd foo
linux-gate.so.1 => (0xb7701000)libc.so.6 => /lib32/libc.so.6 (0xb759f000)/lib/ld-linux.so.2 (0xb7702000)
Weit “oben”imProzessadressraum:“kurz vor”0xC0000000
“ldd”(listdynamicdependencies)gibt Listedersharedlibsaus
ld.so (hier:/lib/ld-linux.so.2– für ELF)…• sucht undlädt diesharedlibraries,dieein Programm benötigt• bereitet dasProgramm aufdieAusführung vor• undstartet es
Dateiname dersharedlibrary“libc”Dateiname deszu verwendenden dynamischen Loaders
Besondereshared libraries
Wasistlinux-gate.so.1?
MARE03– Laufzeit 19
$ gcc -m32 -o foo foo.o$ ldd foo
linux-gate.so.1 => (0xb7701000)libc.so.6 => /lib32/libc.so.6 (0xb759f000)/lib/ld-linux.so.2 (0xb7702000)
Zu linux-gate.so.1existiertkeineDatei!• Virtuelle shared library,vomKernelindenProzessadressraumeingeblendet• StelltportableMechanismen fürSystemaufrufezurVerfügung
…nurderVollständigkeithalber...
Detailsunter http://www.trilithium.com/johan/2005/08/linux-gate/
SpeicherlayouteinesProzesseszurLaufzeit(1)VirtuellesDateisystem/proc• EnthältInformationendesKernelsüberSystem- undProzesszustände,z.B.:• Speicherbelegung:/proc/meminfo• Systemlaufzeit:/proc/uptime• VersiondesKernels:/proc/version
• InformationüberlaufendeProzessein/proc/[pid]/,z.B.• /proc/[pid]/cmdline:KommandozeilebeimAufruf• /proc/[pid]/sched:Scheduling-Statistik• /proc/[pid]/stack:AktuellerStackinhalt (Funktionshierarchie)• /proc/[pid]/maps:BelegungdesvirtuellenSpeichers
MARE03– Laufzeit 20
SpeicherlayouteinesProzesseszurLaufzeit(2)/proc/[pid]/maps• Beispiel:SpeicherlayoutfürProzess„foo“herausfinden
MARE03– Laufzeit 21
$ ps ax | grep foo10323
Welche Prozess-IDhatfoohier?10323
$ cat /proc/10323/maps08048000-08049000 r-xp 00000000 90:5a 10520727 /home/me/f/foo08049000-0804a000 rw-p 00000000 90:5a 10520727 /home/me/f/foob75f8000-b75f9000 rw-p 00000000 00:00 0 b75f9000-b7745000 r-xp 00000000 90:5a 8529693 /emul/ia32-linux/lib/libc-2.7.sob7745000-b7746000 r--p 0014c000 90:5a 8529693 /emul/ia32-linux/lib/libc-2.7.sob7746000-b7748000 rw-p 0014d000 90:5a 8529693 /emul/ia32-linux/lib/libc-2.7.sob7748000-b774b000 rw-p 00000000 00:00 0 b7758000-b775b000 rw-p 00000000 00:00 0 b775b000-b775c000 r-xp 00000000 00:00 0 [vdso]b775c000-b7779000 r-xp 00000000 90:5a 8529726 /emul/ia32-linux/lib/ld-2.7.sob7779000-b777b000 rw-p 0001c000 90:5a 8529726 /emul/ia32-linux/lib/ld-2.7.sobf9ee000-bfa03000 rw-p 00000000 00:00 0 [stack]
Wird dynamisch bei StartvonProzess vergeben
linux-gate.so
libc
Dynamischer Loader
DasProgramm selbst
SpeicherlayouteinesProzesseszurLaufzeit(3)
MARE03– Laufzeit 22
...umsortiert und gekürzt...
bf9ee000-bfa03000 [stack]
b7779000-b777b000 ld-2.7.sob775c000-b7779000 ld-2.7.so
b775b000-b775c000 [vdso]
b7746000-b7748000 libc-2.7.sob7745000-b7746000 libc-2.7.sob75f9000-b7745000 libc-2.7.so
08049000-0804a000 /home/me/f/foo08048000-08049000 /home/me/f/foo
Laden:vonELF-DateizuSpeicherinhalt
MARE03– Laufzeit 23
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
SpeicherlayoutvonCausermitteln(1)Voncrt0vordefinierteglobaleVariable(viaLinkerskript):#include <stdio.h>
extern char __executable_start;extern char __etext;
int main(void){
printf("0x%lx\n", (unsigned long)&__executable_start);printf("0x%lx\n", (unsigned long)&__etext);return 0;
}
MARE03– Laufzeit 24
Ausgabe:$ gcc –m32 –o etext etext.c && ./etext0x80480000x80484a8
etext.c
_etext =“endof.textsection”
SpeicherlayoutvonCausermitteln(2)WelcheVariablenstehenzurVerfügung?
MARE03– Laufzeit 25
$ gcc –m32 –o etext -Wl,--verbose etext.c && ./etext
... 250 Zeilen Ausgaben (Demo) ...
-Wl,xxx übergibt Parameter“xxx”andenLinker!
Fazit
LinkenundLaden• VirtuellerSpeicherundSpeicherlayoutvonProzessen• DefinitionüberLinkerskripte
• Shared LibrariesunddynamischerLader• Speicherlayout• ...undzugehörigeLinux-Tools
MARE03– Laufzeit 26
Literatur
ELF• TISCommittee,„ToolInterfaceStandard(TIS)Executable and LinkingFormat
(ELF)Specification“,Version1.2Onlineunterhttps://www.uclibc.org/docs/elf.pdf
Linker• JohnR.Levine, „Linkers and Loaders“,MKP1999,ISBN1-55860-496-0
Online(beta)unterhttps://www.iecc.com/linker/• Workingwithlibrariesandthelinker
http://www.bottomupcs.com/libraries_and_the_linker.xhtmlld.so undShared Libraries• UlrichDrepper,„How to write shared libraries“
https://software.intel.com/sites/default/files/m/a/1/e/dsohowto.pdf• Optimizing linkerload times – https://lwn.net/Articles/192624/ABI-Konventionen• https://sites.google.com/site/x32abi/
MARE03– Laufzeit 27
top related