Archief - De topics van lang geleden

Bugje in SIGSEGV

26-02-2007, 11:35 door Anoniem, 8 reacties
Hoi Allemaal,

Er zit een bugje in SIGSEGV volgens mij.
Wanneer je een assembly filtje aanmaakt met alleen erin :
---------------------------

section .data
section .text

global _start
_start:

---------------------------
Deze dan laad in gdb zegt die:
---------------------------

Starting program: /test/a.out

Program recieved signal SIGSEGV, Segmentation fault
in 0x8038080 in ?? ()
(gdb) i r

eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbfffff3b0 0xbffff3b0
ebp 0x0 0
esi 0x0 0
edi 0x0 0
eip 0x8048080 0x8048080
eflags 0x10346 66374

---------------------------
Wanneer je nu er een stukje code bij zou voegen als :
---------------------------

section .data
section .text

global _start
_start:

xor esp,esp
mov esp, 0x12121212

---------------------------
Dit saved de oude verwijderd weer laad in gdb geeft die nu aan met ir
---------------------------
Starting program: /test/a.out

Program recieved signal SIGSEGV, Segmentation fault
in 0x8038080 in ?? ()
(gdb) i r

eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0x12121212 0x12121212
ebp 0x0 0
esi 0x0 0
edi 0x0 0
eip 0x8048080 0x8048080
eflags 0x10346 66374
---------------------------

Het esp address is nu overschreven bij de uitvoering van een segmantion
fault!
Reacties (8)
26-02-2007, 11:47 door SirDice
Nee, esp is overschreven voor de segfault. In je eigen code notabene.
26-02-2007, 12:14 door Anoniem
Hmm,

Nee, esp is overschreven voor de segfault. In je eigen code
notabene

Niet helemaal waar. Daarom had ik eerst een leeg bestand aangemaakt
zodat die een esp adress had omdat die steeds het zelfde bleef. Heb ik
toen een nieuw bestand aangemaakt en em handmatig verwijderd.

Het verbaasde me alleen dat het esp adress zo makkelijk te overschrijven
is. Wanneer je mov eax,1 mov ebx,0 int 0x80 toevoegd en dan vervolgens
het programma uitvoerd. Behoud die wel het overschreven esp adress met
0x12121212.

Zou ik nu opzettelijk het programma laten crashen op het EIP adress
0x8048080 zou die denk ik dus terug springen na 0x12121212.
Theoretisch gezien kan je dus zo denk ik andere andere EIP adressen
aanroepen. Maar dat is weer iets om te testen :D

Thx in iedergeval
27-02-2007, 11:48 door Anoniem
hahaha einstein
27-02-2007, 15:29 door pikah
Hij blijft hetzelfde ten eerste omdat jou stack niet randomizable is. De stack
is dus bij elke uitvoering te vinden op hetzelfde geheugen adres.

Je kan inderdaad 'springen' naar je eigen ingevoerde ESP door je
instruction pointer te overschrijven, maar aangezien je zelf de code invoert
VOORDAT je SIGSEGV'd heb je hier hetzelfde aan als een programma
schrijven en deze uitvoeren :)

Je moet je code maar eens goed disassemblen, dan snap je meteen waarom hij segfault.

Succes ermee.
27-02-2007, 21:14 door Anoniem
Je kan inderdaad 'springen' naar je eigen ingevoerde ESP door je
instruction pointer te overschrijven, maar aangezien je zelf de code invoert
VOORDAT je SIGSEGV'd heb je hier hetzelfde aan als een programma
schrijven en deze uitvoeren :)

En nu dan ?

section .data
section .text

global _start
_start:

xor esp,esp
mov esp, 0x12121212
jmp 0x12121212
-------------------------------------------------
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0x12121212 0x12121212
ebp 0x0 0
esi 0x0 0
edi 0x0 0
eip 0x12121212 0x12121212
eflags 0x10346 66374
-------------------------------------------------

Program recieved signal SIGSEGV, Segmentation fault
in 0x12121212 in ?? ()

Nu blijft die niet meer hangen op 0x8048080.


^_^
28-02-2007, 13:02 door [Account Verwijderd]
[Verwijderd]
28-02-2007, 13:44 door pikah
Inderdaad :)

Je springt naar 0x12121212 en dit valt niet binnen je eigen address space. Dat is dan ook precies de reden waarom hij segfault.

Verder is het logisch dat je EIP is verandert. Je EIP is de Instruction Pointer, ofwel de plek in het geheugen waar op dat moment geprobeert wordt de volgende instructie uit te voeren. Aangezien jij een JMP gebruikt, bedoel je daarmee, ik heb op deze plek de volgende instructie voor je. Dus je EIP wordt met jou geheugenadres veranderd en springt er naartoe. Maar dit kan jij niet aanroepen, dus krijg je een SIGSEGV. Je ESP is de Stack Pointer die verwijst naar het address van je laatste element in je stack dus die heeft hier niets mee te maken en is ook niet de reden van de SIGSEGV
01-03-2007, 09:50 door Anoniem
okie thx ! allemaal ,

Sorry als ik wat later reageerde maar assembly is verslavend ! :D
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.