GNU Debugger, lehen urratsak.

Segurtasun informatikoaren munduan eta batez ere exploit eta ahultasunen ikerketan ezinbestekoa da programa baten exekuzioa ingurune kontrolatu batean egikaritzea. Hortarako ezagunak diren debugger edo araztaileak dira tresna ezagunenak. Windows inguruneetarako ezagunak dira OllyDbg, SoftICE edo IDA Pro bezalakoak.

Halere hauek garatzen dituzten enpresek ez dute linux inguruneetan interes askorik erakutsi(Hex-Rays, IDA Pro-ren egileak salbu). Badira hortarako hainbat arrazoi, hemen azalduko ez ditugunak eta gaurkoarekin lotura ez dutenak. Guk FSF elkartearen eskutik datorren GNU Debugger, edo GDB hemendik aurrera, izango dugu hizpide.

Herraminta ezaguna da oso linux ingurunean araztatze lanak egin dituen inorentzat baina baita exploit eta ahultasun garapen ikerketan diharduenarentzat ere. Horregatik gaurkoan sarrera txiki bat egingo dugu bere konplexutasunari beldurra galdu eta hankak pixkat bustitzeko🙂. Nere lehenengo tutoriala den honek izan dezakeen
gordintasunagatik barkamena eskatzen dizuet aldez aurretik.

* GDB hasieratu:

$ gdb `programa` // ‘programa’ landu nahi dugun programaren izena da.
$ gdb // besterik gabe, landu nahi den programa gerora zehaztu daiteke.

GNU gdb Red Hat Linux (6.6-40.fc8rh)
Copyright (C) 2006 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 it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux-gnu”.
(gdb)

Hau izango da hasieran ikusiko duguna. Gehigarri moduan, loturak ezarri daitezke unean exekutatzen hari den beste prozesu batekin attach komandoaren bitartez:

(gdb) attach `pid`

Behin programa hasieratuta dugularik, programaren mihiztadura lengoai kodea eskatu dezakegu nondik norakoak ikusteko. Hau `dissasemble main` edo `disas main`(laburdura) komandoaren bitartez lortuko dugu. `main`-en ordez programa edozein azpifuntzioren
mihiztadura ikusi dezakegu:

(gdb) disas main
Dump of assembler code for function main:
0x08048592 <main+0>: push %ebp
0x08048593 <main+1>: mov %esp,%ebp
0x08048595 <main+3>: call 0x804850f <validate_serial>
0x0804859a <main+8>: test %eax,%eax
0x0804859c <main+10>: je 0x80485a5 <main+19>
0x0804859e <main+12>: call 0x8048556 <do_valid_stuff>
0x080485a3 <main+17>: jmp 0x80485aa <main+24>
0x080485a5 <main+19>: call 0x8048574 <do_invalid_stuff>
0x080485aa <main+24>: mov $0x0,%eax
0x080485af <main+29>: pop %ebp
0x080485b0 <main+30>: ret
End of assembler dump.
(gdb)

Azpiprogramen kasuan:

(gdb) disas validate_serial
Dump of assembler code for function validate_serial:
0x0804850f <validate_serial+0>: push %ebp
0x08048510 <validate_serial+1>: mov %esp,%ebp
0x08048512 <validate_serial+3>: sub $0x28,%esp
0x08048515 <validate_serial+6>: mov 0x8049848,%edx
0x0804851b <validate_serial+12>: lea 0xffffffe8(%ebp),%eax
/* laburtzearren albo batera utzita */
0x0804854a <validate_serial+59>: movl $0x0,0xffffffe4(%ebp)
0x08048551 <validate_serial+66>: mov 0xffffffe4(%ebp),%eax
0x08048554 <validate_serial+69>: leave
0x08048555 <validate_serial+70>: ret
End of assembler dump.
(gdb)

Behin programa/azpiprogramaren behe mailako ikuspegi bat dugula, geldiuneak zehazte hasi gaitezke. Hortarako `break` edo `b`erabil dezakegu, bai zuzeneko helbideetan baita funtzioei deietan ere:

(gdb) b *0x0804859e
Breakpoint 1 at 0x804859e: file serial.c, line 58.
(gdb) b validate_serial
Breakpoint 2 at 0x8048515: file serial.c, line 34.
(gdb)

Orain geldiuneak zehaztuta ditugularik, programa martxan jarriko dugu gdb ingurunean kapsulatuta. Horretarako ez dugu `run` komandoa besterik exekutatu behar:

(gdb) run

Geldiuneetako batera iristen garenean, exekuzioa geratuko da eta egoera aztertzen hasi gaitezke. Une hontan gauza asko aztertu ditzakegu; erregistroak, pilaren egoera, etab…Hona hemen aukeretako batzuk(ez ditugu emaitzak idatziko testuaren luzeera neurri egokian mantentzearren):
– Erregistroak aztertu:
(gdb) info registers
– Hitz bat bilatu:
(gdb) p `hitza`
– Exekutagarriaren atal ezberdinak (Heap, BSS, Pila…):
(gdb) maintenance info sections

Aztertzen atal hontan bada beste aukera multzo bat, aurrekoetatik kanpo lantzea erabaki dudana euren berezitasuna dela eta. Kasu hontan helbide batetik aurrera memoriako informazioa guk nahi dugun eran pantailaratuko dugu, adib:

(gdb) x/10s `helbidea` // `helbidea` helbidetik aurrera 10 string irakurriko lituzke

Adibide hontan s string-a erabili dugu formatua eskatzerako orduan, baina ez da aukera bakarra. `x`-k balio hamaseitarrak erakutsiko lituzke, `i`-k mihiztadura aginduak, `d`-k hamartarrak eta `b`-k byteak.

Ikusi duzuen moduan GDB programa oso ahaltsua da eta linux/unix sistemetarako exploiten garapen eta ikerketan oso erabilia. Artikulu honen bitartez sarrera txiki bat egitea izan da nere helburua eta espero dut bati baino gehiagori bere kabuz ikertzen hasteko zirrara sortu izana🙂. Informazio gehiago aurki dezakezue GDB-ren webgunean:

http://sourceware.org/gdb/

Explore posts in the same categories: Segurtasuna, Sistema Eragileak

Laburpen hitzak: , , , , ,

You can comment below, or link to this permanent URL from your own site.

Utzi erantzun bat

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Aldatu )

Twitter picture

You are commenting using your Twitter account. Log Out / Aldatu )

Facebook photo

You are commenting using your Facebook account. Log Out / Aldatu )

Google+ photo

You are commenting using your Google+ account. Log Out / Aldatu )

Connecting to %s


%d bloggers like this: