Archief - De topics van lang geleden

Security Analyze

30-10-2006, 12:17 door Anoniem, 10 reacties
Hallo!
Ik had een vraagje kwa linux security.Ik heb een map aangemaakt met
daar in test.txt bestand de rechten weg gehaald met chmod -rwx map en
ben gaan kijken of ik toegang kon krijgen tot test.txt. Nu heb ik een
bestandje aan gemaakt met root voor de map met daarin het volgende
stukje code:


#include <stdio.h>
int main() {
const char *msg ="Access Grantedn";
FILE *file;
file=fopen("/home/map/test.txt","w");
fprintf(file,"%s",msg);
close(file);
}

Wanneer ik het nou uit voer onder root werkt die gewoon maar wanneer ik
switch na guest en em uitvoer geeft een segmentation fault vanwege
chmod -rws.Nu vraag ik me af waarom het systeem niet "bash:
cd: /home/map: Permission denied weer geeft maar een segment fault.

Toen heb ik gdb gestart om erachter te komen waar het probleem nou ligt
en gaf die het volgende weer:

GNU gbd 5.3
Copyright 2002 Free Software Foundation, Inc.
Gdb is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of the under certain
conditions Type "show opying" to see the conditions.
There is absolutely no warranty for GDB.Type "show warrenty" for details.
This GDB was configured as "i586-suse-linux"...
(gdb) r
starting program: /home/test

Program received signal SIGSEGV,Segmentation fault
0x4006b662 in vfprintf () from /lib/libc.so.6
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x35b 859
ebx 0x40154b90 1075137424
esp 0xbfffed50 0xbfffed50
ebp 0xbffff378 0xbffff378
esi 0x40014020 1073823776
edi 0x804844Ce 134513870
eip 0x4006b662 0x4006bb2 <-------- fout melding van vfprintf
eflags 0x10246 66118
cs 0x23 35
ds 0x2b 43
ss 0x2b 43
ds 0x2b 43
fs 0x0 0
gs 0x0 0
fctrl 0x37f 895
fstat 0x0 0
ftag 0xfff 655535
fiseq 0x0 0
fioff 0x0 0
fooff 0x0 0
fop 0x0 0
mxcsr 0x1f80 8064
orig_eax 0xffffffff
-1

Mij lijkt het logisch dat het eip adress 0x4006b662 de instruction pointer
is van fprintf maar word gecanceld vanwege het programma geen toegang
heeft tot de map.Maar kan nergens het stukje beveiliging terug vinden van het systeem die de instruction pointer 0x4006b662 niet wil uitvoeren.
Reacties (10)
30-10-2006, 13:19 door SirDice
a) root kan altijd overal bij.
b) Je programma segfault omdat je een file opent, wat mislukt, en vervolgens ga je met een NULL pointer aan de slag (printf(file....)).

Zie ook m'n opmerkingen mbt veilig programmeren.. Ga er niet vanuit dat het openen van een object ook daadwerkelijk altijd lukt. Een controle op "file=fopen()" vertelt je dat het mislukt is. Dan zijn er andere functies die je aan moet roepen om er achter te komen waarom het mislukte (foutafhandeling).

man fopen:
RETURN VALUES
Upon successful completion fopen(), fdopen() and freopen() return a FILE pointer. Otherwise, NULL is returned and the global variable errno is set to indicate the error.
30-10-2006, 13:47 door Anoniem
Zie ik het trouwens dan goed dat bij (gdb) i r de -1 dus weer gegeven wordt
vanwege de error van file=fopen?

Om nog even terug te komen op het root gedeelte begrijp ik eigenlijk iets
niet want als ik daar linux:gdb test uitvoer en dan in (gdb) i r dan geeft die
weer:

(gdb) r
Starting program :/home/test

Program exited with code 0377
(gdb) i r
The program has no register now

Waarom geeft die dan aan no register now met root als die het programma goed uitvoerd en wel onder guest als die een segment fault weer geeft?
30-10-2006, 13:59 door SirDice
Door Koekie
(gdb) r
Starting program :/home/test

Program exited with code 0377
Dat is de RETURN VALUE van close (-1 octaal)
man close:
RETURN VALUES
The close() function returns the value 0 if successful; otherwise the
value -1 is returned and the global variable errno is set to indicate the
error.

ERRORS
The close() system call will fail if:

[EBADF] The d argument is not an active descriptor.

[EINTR] An interrupt was received.

[ENOSPC] The underlying object did not fit, cached data was
lost.


(gdb) i r
The program has no register now

Waarom geeft die dan aan no register now met root als die
het programma goed uitvoerd en wel onder guest als die een
segment fault weer geeft?
Het programma is helemaal uitgevoerd en het geheugen is weer vrijgegeven.. Er is dus niets meer..
30-10-2006, 15:43 door Anoniem
SirDice
Begrijp ik het dan goed dat waneer je iets wil exploiten of backdoors aan
het zoeken bent juist zorgt dat het programma niet helemaal word
uitgevoerd zodat je toegang hebt tot het geheugen/registers?
30-10-2006, 15:51 door SirDice
Ze hebben breakpoints bedacht om de executie een halt toe te
roepen en jou (als debugger) de mogelijkheid te geven om op
een gewenst moment de status van diverse dingen te bekijken..


NB Niet elke segfault is te "exploiten"..
30-10-2006, 16:37 door Anoniem
Is dat moeilijk breakpoints te zetten in zo programma ? Want heb net
gekeken onder (gdb)help break points (gdb) break 0x80483c4(main) en
zegt die Function "0x80483c4" not defined toen een functie genomen als
fopen en (gdb) break 0x80483e8 en zegt die ook Function "0x80483e8" not
defined.
30-10-2006, 16:55 door SirDice
Probeer break main (break't in main) of break 6 (break't op regel 6 vd sourcecode). Wel compilen met gcc -g -o test test.c (-g voor extra debug info).
30-10-2006, 17:11 door Anoniem
Thx !! Perfectos nu zegt ie:
(gdb)break main
Breakpoint 1 at 0x8043d4:file test.c, line 4.
(gdb)r
Starting program : /home/test

Breakpoint 1, main () test.c:4
4 const char *msg = "Access Granted";
(gdb)

Ook geeft die nu weer met (gdb)x/100 $eip-100 etc etc :DDDD

ps. Blijft die break point nu altijd staan bij main of moet ik die iedere keer weer plaatsen waneer ik gdb start?
30-10-2006, 17:15 door SirDice
Die zul je elke keer weer moeten zetten..

Op de meeste systemen kun je info gdb doen ;)
30-10-2006, 17:28 door Anoniem
Okie bedankt :DD
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.