Archief - De topics van lang geleden

memset crash

26-01-2008, 10:33 door lieque, 6 reacties
Hallo!

Ik heb een bugje gevonden in memset die crashed als je de
conditionals overload met een simpele functie :


#include <stdio.h>
#include <string.h>

int overflow(int a) {

for ( a = 0; a < 1024; a++){
a++;
char p1[10];

memset(p1,a,20);
puts(p1);
};
return 0;
}

int main(){

int b;
overflow(b);

return 0;
};

Eerst crashed die op het adress 0xc000005 en geef die een
unhandled exeception access violation. Maar hij geeft wel een
een gewone interupt. Als je dan op ok clickt springt die vervolgens
na FFFFFF ???. Met als resultaat in the compiler.

c:windowssystem32comctl32.dll,
no matching symbolic information found

c:windowssystem32apphelp.dll,
no matching symbolic infomration found

En nu Kom het :

The thread 0x590 has exited with code 0 ( 0x0 ).
Reacties (6)
26-01-2008, 11:52 door Anoniem
Waarom zou er iets fout zijn met memset?

Als je geheugen overschrijft kan dat tamelijk moeilijk voorspelbare
gevolgen hebben (20>10). Het "adres" wat je geeft (0xc...5) is een
exception code die "access violation" betekent.

Als je aan het debuggen bent, wordt de code gewoon uitgevoerd, dus
ook een return 0 als je het programma verder uitvoert. Dat verklaart
waarschijnlijk de exit code.

Welke compiler gebruik je?
26-01-2008, 18:59 door Anoniem
Waar heb je het in Godsnaam over?
26-01-2008, 19:34 door Anoniem
programmeer forum?
26-01-2008, 20:51 door lieque
Welke compiler gebruik je?

Ik gebruik Visual Studio c++ .

Maar dat is het punt het lijkt erop dat die bij return 0; komt omdat dat die dat ook aangeeft in de compiler met een interupt 3 en gewoon de procedure volgt van return 0;. Maar dan zou die in princiepe
gewoon een esp adress moeten aan maken wat die ook gedaan heeft
gezien de "acces violation". De compiler zou hier het programma moeten stoppen met debuggen. Wat die ook doet als je memset op andere manier zou uitvoeren zonder overflow. Inplaats daarvan
springt die na de melding access violation na een andere plek in het geheugen namelijk FFFFFFF ???. En blijft het programma actief wat het niet had gemogen gezien de acces violation.

Ps. Als het goed zou die ook hetzelfde runnen onder linux maar dit heb ik nog niet zelf getest dus nog niet bevestigd.
27-01-2008, 01:19 door Anoniem
Dit is C, hoe de werkelijke machine code eruit ziet is afhankelijk van de
compiler en ook de debugger.

Visual C (ik gebruikte cl v13.10) compileert deze code niet. Ik heb geen
idee wat er op jouw computer gebeurt.

Een programma kan gewoon door draaien na een access violation, dat
hangt van de debugger, compiler en instellingen af.

De code komt op mij warrig over. Probeer je verschillende overflows
tegelijkertijd te testen? Dat levert zelden een helder beeld. Focus op 1
ding en maak de rest van de code correct.

Probeer adressen zonder fouten te schrijven. Ik tel 3 fouten. Voor mij
niet zo erg, maar computers zijn exact en een stuk minder
vergevingsgezind.
28-01-2008, 12:53 door lieque
Dit is C, hoe de werkelijke machine code eruit ziet is afhankelijk
van de compiler en ook de debugger.

Visual C (ik gebruikte cl v13.10) compileert deze code niet. Ik heb geen
idee wat er op jouw computer gebeurt.

Een programma kan gewoon door draaien na een access violation, dat
hangt van de debugger, compiler en instellingen af.

De code komt op mij warrig over. Probeer je verschillende overflows
tegelijkertijd te testen? Dat levert zelden een helder beeld. Focus op 1
ding en maak de rest van de code correct.

Ik heb visual studio c++ 6.0. Nog een vrij oude compiler. Dat van die
settings dat een process nog kon door draaien na een access violation
wist ik niet. Ik dacht het vrij normaal was dat een process dan
automatisch stopte.

Via de website http://www.cplusplus.com/reference/clibrary/cstring/memset.html
Kwam ik een stukje tegen memset (str,'-',6);. Gezien '-' kwam ik op
het idee deze te overflowen gezien het maar een character was. Dus
dacht toen als ik een functie schrisjf en de '-' overflow met memset een
overrun te maken. Wat ook gelukt is. Door de editor lijkt de code wat
rommelig dus hier heb je nog een keer alleen dan zonder fouten :

http://rafb.net/p/drNoHd84.html

Door '-' te overrunnen kwam ik alleen met een probleem als de loop
zich zou herhalen. Dus kwam toen op het idee de buffer in memset te
vergroten zodat memset 'a' niet meer kon kopieren en buiten de buffer
paste.

Dit kon je ook zien omdat het programma crashte en de nieuwe
eip address 61616161. Het lijkt erop dat die het oude eip
overschreef omdat het programma gewoon bleef runnen onder de cmd
shell.
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.