Bufferoverflow

Jedno ptanje vezano za assembler,sta je microprocessor a sta microprocessor simulator?

[quote]

Btw. zasto je system() opasna ?[/quote]
Uh, umorih se pisajuci…:smiley:

Pa zamisli da imas neki string na stacku koji treba da se preda funkciji system();.
Mogao bi kroz bufferOverflov da nesto upises u taj string i time izvrsis neki program koji zelis. Znaci system lično ne prouzrokuje overflow ali moze da sluzi kao “ulaz”.
Posebno treba izbjegavati njeno koristenje kada string smije korisnik da upise.
Pitanje je dali funkcija exec(); predstavlja alternativu. :rolleyes:

Eh sad da objasnim kako funkcionise procesor … :0watdrop

[quote]Pa zamisli da imas neki string na stacku koji treba da se preda funkciji system();.
Mogao bi kroz bufferOverflov da nesto upises u taj string i time izvrsis neki program koji zelis. Znaci system lično ne prouzrokuje overflow ali moze da sluzi kao “ulaz”.
[/quote]

Prateci tu logiku, svaka funkcija koja prima string kao argument je opasna i treba se izbjegavati :). Ja sam procitao u FM-u(FM iz “RTFM”) da je system() opasna zato sto se mogu iskorsiti neke ENV varijable tako se navede na ponasanje koje odgovara 31337 h4xoru. :slight_smile:

Evo “izvadak”, sto bi rekli Hrvati …

Do not use system() from a program with suid or sgid priv-
       ileges, because strange values for some environment  vari-
       ables  might be used to subvert system integrity.  

Prema man stranici exec nema problema sa environment varijablama …

Pa to se u suštini odnosi na generalno pravilo da ne treba imati nepotrebne suid ni sgid executable na sistemu. To se može naći sa find / -perm +6000.

Osim sto netreba imat “visak” suid i sgid fajlova na sistemu, treba takodje pazit i na permissione svih exec fajlova.

takodje najbolje bi bilo da svaki user ima chroot env. naime sad mozete napraviti neki lib fajl i u njemu funkciju printf koja ce izvrsavat nesto lijevo tamo … eh sad taj fajl lijepo ubacite u env

export LD_PRELOAD=/path/file.so

i lijepo nadjete neki suid file koji ima u sebi funkciju “printf” i izvrsite ga , eh taj fajl nece vrsit originalnu funkciju printf vec ovu vasu koju ste napravili u lib fajlu.
ovim hocu da kazem da sa pogresnim premissionima na fajlovima moze se svasta prouzrokovat :slight_smile:

haj prijatno i usput nemojte me “fatak” konkretno za rijec, jer sam ovo konfuzno objasnio al shvatit cete

cya

Moze li neko odgovoriti,moze i link.

Evo odgovora na pitanje:
http://www.ox.compsoc.net/~swhite/history/microprocessor.html

Ili:
Microprocessor: “An integrated circuit containing the arithmetic, logic, and control circuitry required to interpret and execute instructions from a computer program. When combined with other integrated circuits that provide storage for data and programs, often on a single semiconductor base to form a chip, the microprocessor becomes the heart of a small computer, or microcomputer….Developed during the 1970s, the microprocessor became most visible as the central processor of the personal computer…the vast majority of microprocessors are used to control everything from consumer appliances to smart weapons. The microprocessor has made possible the inexpensive hand-held electronic calculator, the digital wristwatch, and the electronic game. Microprocessors are used to control consumer electronic devices, such as the programmable microwave oven and videocassette recorder; to targeting systems in aircraft, tanks, and missiles and to control radar arrays that track and identify aircraft, among other defense applications.”

I malo historije računarstva:
http://www.ox.compsoc.net/~swhite/history/timeline.html

Ne moraš se puno zamarati sa pojmom microprocessor, danas je to uglavnom sinonim za procesor.

Da bi shvatio kako funkcionise procesor, trebas imati osnovnog znanja o digitalnoj tehnici i znati sta je AND , NOR, OR EXOR, itd… Treba shvatiti kako se binarni brojevi sabiraju , oduzimaju , mnoze itd.
Osim toga treba znati kako se ponasaju registri.
Svaki procesor sadrzi skupinu elemenata koje vrse ove operacije.
Svakom procesoru mozes grubo dati dva ulaza i jedan izlaz.
Ulaz1- unosenje informacija
Prolazak informacija kroz LOGIKU
Izlaz1 - Izlaz obradjenih informacija

Ulaz2- To je ulaz za nas program sa kojim uticemo na informacije tj. mi odredjujemo sta ce biti sa informacijama.
Informacije su u obliku binarnih brojeva i prenose se BUS- sistemom. Prvi procesori su imali 4-bitnu sirinu busa, dok recimo danasnji vecinom imaju 32, 64, itd… Time vidis da 64 bita nemaju nikakve veze sa brzinom racunara nego je to samo sirina informacije. Za brzinu je odgovoran taktni generator jer sa svakim taktom se izvrsava jedna matematicka operacija.
Procesor sa 500MHz izvrsava znaci 500 000 000 racunskih operacija u sekundi. Ove operacije se izvrsavaju u jednom dijelu procesora koji se zove ALU ( Arithmetic Logic Unit) ili tako slicno :smiley:
Osim toga tu je Kes koji uz pomoc registara “slaze” informacije iz memorije (npr RAM-a ) i time pomaze da procesor bude brzi a ne da stalno preko BUS-a donosi informacije sa (npr. HardDiska )
Jel dosta ili da nastavim ?? :smiley:

Ovo je naravno bilo veoma skraceno objasnjenje. Svaki od ovih dijelova je svijet za sebe. Jos par stvari mi je na um palo koje mozda vrijedi pomenuti:

Postoji recimo jedan bus koji vodi rezultat sa izlaza ponovo na ulaz. Ako si ikada programirao znas sta znaci inkrement. Rezultat se povecava za 1.
Eh, upravo taj bus se koristi u tom slucaju. Ili recimo sve petlje kao for, while itd koriste taj bus.

Sistem za upravljanje pazi da se sve operacije izvrsavaju u skladu sa taktom. Neki procesori imaju vise sistema za upravljanje tako da su u stanju izvrsiti vise matematickih operacija sa jednim taktom. Ako se nevaram RISC ili SPARC. Iako imaju samo 200 MHz mogu da obrade vise informacija od pentiuma npr. 400 MHz. Zato se izgleda i zovu “Workstations”

Postoji i takozvani Adresni-bus kojim se poziva nas program iz memorije. Da bi procesor znao koji program da pozove, gdje se nalazi taj program u memoriji, i u kojem redoslijedu da izvrsi te operacije, postoje adrese za sve komande u memoriji. Ovaj bus salje signale samo u jednom pravcu dok obicni bus za datoteke moze slati informacije u oba pravca.

I tu je jos i registar za komande koji “slaze” informacije iz memorije ,npr. hard diska, i kad se “napuni” posalje taj paket na dekoder koji to raspodijeli po busu.

Eto to je onako na moj nacin objasnjeno i slobodno me ispravite ako sam nesto slagao :slight_smile:
Google je inace pun objasnjenja na ovu temu i tamo mozes sve pronaci sa slikama i semama. Ipak je najbolje razumjeti osnove digitalne tehnike jer procesor je postao vrlo kompleksan i tesko ga je objasniti u detalje ( bar za mene ) Zato se divim ljudima koji rasturaju asembler.
Nadam se da sam mogao malo svjetla da ubacim u ovo.

Da malo dodam RISC = Reduced Instruction Set Computing, SPARC - Sunova implementacija RISC procesora.

Risc procesori, dakle, imaju smanjeni set instrukcija. Razliku izmedju RISC-a i CISC-a je fino objasnio “laickim jezikom” Robert X. Cringley u knjizi “Accidental Empires” Evo citat:

"RISC is an old IBM idea called Reduced Instruction Set Computing. RISC processors were incedibly fast devices that gained their seped from a simple internal architecture that implements only a few computer instructions. Where a Complex Instruction Set Computer (CISC) might have a special “walk accros the room but don’t step on the dog” instruction, RISC proccesors can usually get faster performance by usin several simpler instructions walk-walk-step over-walk-walk.
Risc processors are cheaper to build because they are smaller and more can be fit on one piece of sillicon. And because they have fewer transistors (often under 100,000) (ova informacija je iz 1996. op. S.U.), yields are higher too…
"

“Sun couldn’t interest Inter or Motorola in doing one. … Billy Joy and Dave Patterson designed a processor of their own in 1985, called SPARC. By this time both Intel and Motorola had stopped allowing other semiconductor companies to license their processor designs, thus keeping all the high-margin sales in Santa Clara and Schaumberg, Illinois. This, of course, pissed of the traditional second source manufacturers, so SUn signed up those companies to do SPARC”

:slight_smile: eto

O.K thanx

[quote]takodje najbolje bi bilo da svaki user ima chroot env. naime sad mozete napraviti neki lib fajl i u njemu funkciju printf koja ce izvrsavat nesto lijevo tamo … eh sad taj fajl lijepo ubacite u env

export LD_PRELOAD=/path/file.so

i lijepo nadjete neki suid file koji ima u sebi funkciju “printf” i izvrsite ga , eh taj fajl nece vrsit originalnu funkciju printf vec ovu vasu koju ste napravili u lib fajlu.[/quote]

Kada bi bili u stanju proizvoljno mijenjati funkcije u setuid/setgid fajlovima, onda bi zaista svakom korisniku trebalo chrooted okruzenje :). Zbog toga ld.so(8) u slucaju setuid/setgid fajlova ignorise LD_LIBRARY_PATH promjenjivu, a LD_PRELOAD radi samo za biblioteke koje se nalaze u standardnim direktorijima i same su setuid.

Eh … hvala na objasnjenju. Ja evo jedno dva/tri dana kontam nesto … kad to ne bi bilo tako bilo bi previse jednostavno uraditi sta ti je volja :slight_smile:

Odakle mogu skinuti neki dobar assembler i HEXeditor za windowse.

Pitaj na www.windows.org.ba :slight_smile:

Mozes skinuti (besplatan) MASM32 sa ove stranice:
http://www.movsd.com/

Ovdje ti je tutorial:
http://win32assembly.online.fr/

HEX editora imas mnogo, potrazi po Internetu, probaj, pa vidi koji ti se svidja. Po meni je najbolji HEX Workshop (http://www.hexworkshop.com/), samo je shareware.

Mislish www.wugbih.org?:)Šta znachi two’s complement format?

Brojevi u zagradama označavaju brojnu bazu (decimalnu i binarnu).

7(10) = 0 0 0 0 0 1 1 1 (2)
4(10) = 0 0 0 0 0 1 0 0 (2)

7 - 4 = 7 + (-4)           /* gdje ćemo (-4) dobiti pomožću pravila "komplement dvojke" */ 

-4 možemo dobiti na slijedeći način:
Invertujemo sve bite i dodamo jedicu (jedan bit); Ovo se naziva "komplementom dvojke"

tj.

  1 1 1 1 1 0 1 1 (2~)     /* invertovani biti za 4 */
+ 0 0 0 0 0 0 0 1 (2)
-----------------
  1 1 1 1 1 1 0 0

=>


  7(10) = 0 0 0 0 0 1 1 1 (2)
- 4(10) = 1 1 1 1 1 1 0 0 (2~)
------------------------------
  3(10) = 0 0 0 0 0 0 1 1 (2)       /* "carry" bit zanemarujemo */

Ako (još) ne znaš, evo kako prebacuješ binarni u decimalni broj:

3 (10) = 0 0 0 0 0 0 1 1 (2)

X = A0*2^0 + A1*2^1 + A2*2^2 + ... + An-1*2^(n-1)

A0 ... An-1 su biti binarnog broja ("n" je ukupan broj bita). (Biti se broje s desna na lijevo!)

tako je 3 = 1*2^0 + 1*2^1 + 0 ...+ 0 = 1 + 2 = 3;