Një vështrim në shfrytëzimin e dobësive

Ndërsa prisja të vazhdoja të diskutoja këtë temë, më lejoni t'ju tregoj pak histori, teori dhe praktikë mbi dobësitë. Të gjithë kemi dëgjuar deri më tani se defektet e sigurisë mund të kushtojnë shumë, të gjithë e dimë se duhet ta mbajmë softuerin tonë të azhurnuar, të gjithë e dimë që shumë azhurnime shkaktohen nga gabime të sigurisë. Por sot do t'ju tregoj pak se si gjenden dhe shfrytëzohen këto gabime ... Por para kësaj ne do të sqarojmë disa detaje në mënyrë që të kemi një pasqyrë më të mirë.

Para se të filloni

Së pari dua t'ju them se ne do të përqendrohemi në dobësinë e parë që kam mësuar të shfrytëzoj, e njohur Mbingarkesa e tamponit, në këtë dobësi ne përfitojmë nga mungesa e verifikimit të kujtesës për të bërë gjëra zbavitëse 🙂 Por le të sqarohemi pak më shumë për këtë.

Ky nuk do të jetë një skenar i botës reale

Nuk kam mundësi t’i mësoj të prishin ndonjë program që shikojnë - së pari sepse është i rrezikshëm për kompjuterët e tyre, së dyti sepse kjo do të merrte më shumë se kuota e zakonshme e fjalëve të mia.

Ne shkojmë në një udhëtim në vitet '80

Ajo që unë do t'ju tregoj se mund ta bëj në laptopin tim, por nuk do të thotë që mund të bëhet sot në një mënyrë të thjeshtë ... shumë prej këtyre koncepteve janë shfrytëzuar tashmë kaq shumë herë sa metoda të reja mbrojtjeje dhe metoda të reja për t'iu shmangur ato janë shfaqur 😛 por kjo na kthen në të njëjtin vend, nuk ka hapësirë ​​për të qenë në gjendje të them të gjitha ato

Mund të mos funksionojë në procesorin tuaj

Megjithëse do të përdor një shembull shumë të thjeshtë, dua që të jetë mjaft e qartë që nga fillimi se detajet e kësaj janë kaq të shumta dhe aq të ndryshme sa që mund të dalë njësoj si unë, nëse dëshironi ta provoni , efekti i dëshiruar gjithashtu mund të mos arrihet 🙂 Por ju mund ta imagjinoni që unë nuk mund ta shpjegoj se në këtë hapësirë, veçanërisht pasi me këtë hyrje unë kam marrë tashmë më shumë se 300 fjalë, kështu që ne shkojmë drejt në pikën tonë.

Çfarë është një Mbingarkesa e tamponit

Për t'iu përgjigjur kësaj, së pari duhet të kuptojmë gjysmën e parë të këtij kombinimi.

mbulesë

Meqenëse gjithçka ka të bëjë me kujtesën në një kompjuter, është logjike që duhet të ketë një lloj ene informacioni. Kur flasim për inputeve rezultatet, vijmë drejtpërdrejt te koncepti i mbulesë. Për ta mbajtur të shkurtër, a tampon Shtë një hapësirë ​​kujtese me madhësi të përcaktuar në të cilën do të ruajmë një sasi informacioni, të thjeshtë

Mbingarkesat ndodhin, siç nënkupton vetë emri, kur një buffer mbushet me më shumë informacion sesa mund të trajtojë. Por pse është e rëndësishme kjo?

Rafte

Të njohur gjithashtu si pirgje, ato janë një lloj i të dhënave abstrakte në të cilat mundemi rafte informacioni, karakteristika e tyre kryesore është se ata kanë një renditje LIFO (i fundit në daljen e parë). Le të mendojmë për një sekondë për një pirg pjatash, i vendosim sipër një nga një, dhe pastaj i nxjerrim një nga një nga maja, kjo e bën pllakën e fundit që kemi vendosur (atë që është në majë) ) është pllaka e parë që do të nxjerrim, padyshim nëse mund të nxjerrim vetëm një pjatë në të njëjtën kohë dhe vendosim ta bëjmë në atë mënyrë:

Tani që i njihni këto dy koncepte, duhet t'i vendosim në rregull. Stacket janë të rëndësishme sepse secili program që ekzekutojmë ka të vetin pirg ekzekutimi. Por kjo pirg ka një karakteristikë e veçantërritet poshtë. E vetmja gjë që duhet të dini për këtë është që ndërsa një program po ekzekutohet, kur thirret një funksion, pirgu kalon nga një numër X në memorje në një numër (Xn). Por që të vazhdojmë duhet të kuptojmë edhe një koncept.

Tregues

Ky është një koncept që çmend shumë programues kur fillojnë në botën e C, në fakt fuqia e madhe e programimit C është pjesërisht për shkak të përdorimit të treguesve. Për ta mbajtur atë të thjeshtë, një tregues tregon një adresë të kujtesës. Kjo tingëllon komplekse, por nuk është aq komplekse, të gjithë kemi RAM në makineritë tona, apo jo? Epo, kjo mund të përkufizohet si një rregullimi i njëpasnjëshëm i blloqeve, këto vendndodhje shprehen normalisht në numra heksadecimalë (nga 0 në 9 dhe më pas nga A në F, siç janë 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Këtu si një shënim kurioz, 0x10 NO është e barabartë me 10 😛 nëse e shndërrojmë në rend dhjetor do të ishte njësoj si të thuash 15. Kjo është diçka që gjithashtu ngatërron më shumë se një në fillim, por le të merremi me të.

të dhëna

Përpunuesit punojnë me një numër të të dhëna, të cilat punojnë për të transmetuar vendndodhje nga kujtesa fizike tek procesori, për arkitekturat që përdorin 64 bit, numri i regjistrave është i madh dhe vështirë të përshkruhet këtu, por për të marrë idenë, regjistrat janë si tregues, ato tregojnë ndër të tjera gjëra , një hapësirë ​​e kujtesës (vendndodhja).

Tani praktikë

Unë e di që ka qenë shumë informacion për tu përpunuar deri më tani, por në realitet ato janë çështje disi komplekse që unë përpiqem t’i shpjegoj në një mënyrë shumë të thjeshtë, ne do të shohim një program të vogël që përdor buffer dhe ne do të prisni atë për të kuptuar këtë në lidhje me tejmbushjet, padyshim që ky nuk është. isshtë një program i vërtetë dhe ne do të "shmangim" shumë nga kundërmasat që përdoren sot, vetëm për të treguar se si janë bërë gjërat më parë ... dhe për shkak se disa nga këto parimet janë të nevojshme për të qenë në gjendje të mësojmë gjëra më komplekse

GDB

Një program i shkëlqyeshëm që është padyshim një nga më të përdorurit nga programuesit C. Midis shumë virtyteve të tij kemi faktin se na lejon të shohim të gjithë këtë për të cilin kemi folur deri më tani, regjistrat, pirgun, tamponët, etj. Le të shohim programin që do të përdorim për shembullin tonë.

retinput.c

Vetanake. Christopher Diaz Riveros

Ky është një program mjaft i thjeshtë, ne do të përdorim bibliotekën stdio.h të jenë në gjendje të marrin informacione dhe t'i shfaqin ato në një terminal. Mund të shohim një funksion të quajtur return_input e cila gjeneron a tampon i quajtur grup, e cila ka një gjatësi prej 30 bytes (lloji i të dhënave char është i gjatë 1 bajt).

Funksioni gets(array); të kërkojë informacion nga tastiera dhe funksioni printf() kthen përmbajtjen e grupit dhe e shfaq atë në ekran.

Çdo program i shkruar në C fillon me funksionin main(), kjo do të jetë përgjegjëse vetëm për thirrjen e return_input, tani ne do të përpilojmë programin.

Vetanake. Christopher Diaz Riveros

Le të marrim pak nga ajo që sapo bëra. Opsioni -ggdb i thotë gcc të përpilojë programin me informacione që gdb të jetë në gjendje të korrigjoj siç duhet. -fno-stack-protector Shtë një opsion që padyshim nuk duhet ta përdorim, por që do ta përdorim sepse përndryshe do të ishte e mundur të gjenerojmë tejmbushjen e bufferit në pirg. Në fund e kam testuar rezultatin. ./a.out thjesht ekzekuton atë që sapo përpilova, më kërkon informacion dhe i kthen ato. Vrapimi

Paralajmërimet

Një shënim tjetër këtu. A mund t’i shihni paralajmërimet? qartë është diçka për tu marrë parasysh kur punojmë me kod ose përpilojmë, kjo është paksa e dukshme dhe ka pak programe që sot kanë funksionin gets() Në kod. Një avantazh i Gentoo është se duke përpiluar çdo program, unë mund të shoh se çfarë mund të jetë e gabuar, një program "ideal" nuk duhet t'i ketë ato, por do të habiteni se sa programe të mëdha i kanë këto paralajmërime sepse ato janë shumë SHUM të mëdha dhe është e vështirë për të mbajtur nën kontroll ato.funksione të rrezikshme kur ka shumë paralajmërime në të njëjtën kohë. Tani nëse vazhdojmë

Debuging programin

Vetanake. Christopher Diaz Riveros

Tani kjo pjesë mund të jetë paksa konfuze, por meqenëse tashmë kam shkruar mjaft, nuk kam mundësi të shpjegoj gjithçka, prandaj më vjen keq nëse e shihni që po shkoj shumë shpejt

Çarmatosja e kodit

Le të fillojmë duke parë programin tonë të përpiluar të gjuhës së makinës.

Vetanake. Christopher Diaz Riveros

Ky është kodi i funksionit tonë kryesor në Kuvend, kjo është ajo që procesori ynë e kupton, linja në të majtë është adresa fizike në memorje, <+ n> njihet si ofset, në thelb distanca nga fillimi i funksionit (kryesor) deri në atë pohim (i njohur si opcode) Pastaj shohim llojin e udhëzimit (push / mov / callq) dhe një ose më shumë regjistra. Përmbledhur mund të themi se është treguesi i ndjekur nga burimi / origjina dhe destinacioni. <return_input> i referohet funksionit tonë të dytë, le të hedhim një vështrim.

Kthimi_input

Vetanake. Christopher Diaz Riveros

Kjo është pak më komplekse, por unë vetëm dua që ju të kontrolloni disa gjëra, ekziston një etiketë e quajtur <gets@plt> dhe një kod i fundit i thirrur retq që tregon fundin e funksionit. Ne do të vendosim disa pika pikash, një në funksion gets dhe një tjetër në retq.

Vetanake. Christopher Diaz Riveros

run

Tani do të ekzekutojmë programin për të parë se si fillon veprimi.

Vetanake. Christopher Diaz Riveros

Ne mund të shohim se një shigjetë e vogël shfaqet që tregon kodin ku ndodhemi, unë dua që ata të marrin parasysh drejtimin 0x000055555555469b, kjo është adresa pas thirrjes në return_input në funksion main , kjo është e rëndësishme pasi këtu duhet të kthehet programi kur të mbaroni marrjen e programit të dhëna, le të hyjmë në funksion. Tani do të kontrollojmë kujtesën para se të hyjmë në funksion gets.

Vetanake. Christopher Diaz Riveros

Unë e kam vënë funksionin kryesor përsëri për ju dhe kam theksuar kodin që po ju referohesha, siç mund ta shihni, për shkak të mbarim është ndarë në dy segmente, unë dua që ata të marrin parasysh drejtimin 0x7fffffffdbf0 (i pari nga e majta pas komandos x/20x $rsp) meqenëse ky është vendi ku duhet të përdorim për të kontrolluar rezultatet e fitimeve, le të vazhdojmë:

Prishja e programit

Vetanake. Christopher Diaz Riveros

Unë i kam theksuar ato 0x44444444sepse ato janë përfaqësimi i Ds tona ... tani ne kemi filluar të shtojmë të dhëna te programi dhe siç mund ta shihni, ne jemi vetëm dy rreshta nga adresa jonë e dëshiruar, do ta plotësojmë derisa të jemi pak para adresave që theksuam në hapin e mëparshëm.

Ndryshimi i rrugës së kthimit

Tani që kemi arritur të fusim këtë pjesë të kodit aty ku tregon kthimin e funksionit, le të shohim se çfarë do të ndodhë nëse ndryshojmë adresën në vend që të shkojmë në vendndodhjen e kodit që ndjek atë që kemi pasur një moment më parë, çfarë mendoni nëse kthehemi return_input? Por për këtë, është e nevojshme të shkruajmë adresën që duam në binar, ne do ta bëjmë atë me funksionin printf nga bash

Vetanake. Christopher Diaz Riveros

Tani ne kemi marrë informacionin dy herë 😀 sigurisht që programi nuk është bërë për këtë, por ne kemi arritur ta thyejmë kodin dhe ta bëjmë atë të përsërisë diçka që nuk duhej ta bënte.

Reflektime

Ky ndryshim i thjeshtë mund të konsiderohet a shfrytëzoj shumë themelore ... ai ka arritur të thyejë programin dhe të bëjë diçka që ne duam të bëjë.

Ky është vetëm hapi i parë në një listë pothuajse të pafund të gjërave për të parë dhe shtuar, ka mënyra për të shtuar më shumë gjëra sesa thjesht përsëritja e një porosie, por këtë herë kam shkruar shumë dhe gjithçka që lidhet me kodimi i guaskës është temë për të shkruar më shumë sesa artikuj, libra të plotë do të thosha. Na vjen keq nëse nuk kam qenë në gjendje të thellohem pak më shumë në temat që do të më pëlqente, por me siguri do të ketë një shans et Përshëndetje dhe faleminderit për arritjen këtu


Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   2p2 dijo

    Jini më të drejtpërdrejtë. Shkruaj më pak dhe përqendrohu në ato që kanë rëndësi

    1.    ChrisADR dijo

      Përshëndetje, faleminderit për komentin.

      Të them të drejtën unë kam prerë një pjesë të mirë të ideve, por edhe kështu më dukej se la minimumin në mënyrë që dikush që nuk ka njohuri programimi të mund të marrë një ide.

      të fala

      1.    anonim dijo

        Problemi është se ata që nuk kanë njohuri programimi nuk do të mësojnë asgjë, sepse është shumë komplekse për të filluar, por ata që dinë të programojnë vlerësojnë se janë më të drejtpërdrejtë.

        Unë mendoj se nuk mund t'i arrini të gjithë, duhet të zgjidhni, dhe në këtë rast keni mëkatuar që të doni të mbuloni shumë.

        Nga rruga, unë ju them si një kritikë konstruktive, unë i dua këto tema dhe do të doja që ju të vazhdoni të shkruani artikuj, urime!

    2.    anonim dijo

      Unë mendoj të njëjtën gjë.

      1.    ChrisADR dijo

        Faleminderit shumë për të dy !! Certainlyshtë sigurisht e vështirë të kuptohet se si të arrihet audienca e synuar kur e vërteta është se numri i njerëzve me një nivel të përparuar programimi që lexojnë këto artikuj është i ulët (të paktën kjo mund të nxirret në bazë të komenteve)

        Unë sigurisht kam mëkatuar nga dëshira për të thjeshtuar diçka që kërkon një bazë të gjerë njohurish për t'u kuptuar. Shpresoj ta kuptoni që meqenëse sapo kam filluar në blog, nuk kam zbuluar ende pikën e saktë ku lexuesit e mi dinë dhe kuptojnë atë që po them. Kjo do ta bënte shumë më të lehtë për të thënë të vërtetën

        Do të përpiqem të jem më e shkurtër kur e meriton pa depersonalizuar formatin, pasi që ndarja e mënyrës së shkrimit nga përmbajtja është pak më e komplikuar nga sa mund të imagjinohet, të paktën i kam mjaft të lidhura, por supozoj se në fund të fundit do të jem në gjendje për të shtuar linja në vend të prerjes së përmbajtjes.

        të fala

  2.   Mario dijo

    Ku mund të dini më shumë rreth kësaj teme? Ndonjë libër të rekomanduar?

    1.    ChrisADR dijo

      Shembulli që mora nga Manuali i Shellcoder's nga Chris Anley, John Heasman, Felix Linder dhe Gerardo Richarte, por që të bëja përkthimin 64-bit duhet të mësoja për arkitekturën time, manuali i zhvilluesit intel, vëllimet 2 dhe 3 janë një burim mjaft i besueshëm për këtë. Alsoshtë gjithashtu mirë të lexoni dokumentacionin e GDB, i cili vjen me komandën 'info gdb', Për të mësuar Assembly dhe C ka shumë libra shumë të mirë, përveç që librat e Asamblesë janë pak të vjetër, kështu që ka një boshllëk për t'u mbushur me një tjetër dokumentacionin e tipit.

      Vetë kodi shell nuk është më aq efektiv këto ditë për arsye të ndryshme, por është akoma interesante të mësosh teknika të reja.

      Shpresoj se të ndihmon pak ... Përshëndetje

  3.   Franz dijo

    Artikull i mirë, blog i vjetër desdelinux ka rilindur përsëri =)
    Kur thoni se predha e largët nuk është aq efektive, ju do të keni kundërmasa të krijuara për të zbutur sulmet, ata e quajnë atë siguri fyese.
    Përshëndetje dhe vazhdoni kështu

    1.    ChrisADR dijo

      Faleminderit shumë Franz words fjalë shumë të mira, në të vërtetë unë doja të thoja që Shellcoding sot është shumë më komplekse sesa ajo që shohim këtu. Ne kemi ASLR (gjenerator i vendndodhjes së kujtesës së rastit) mbrojtësin e pirgut, masat dhe kundërmasat e ndryshme që kufizojnë numrin e kodeve që mund të injektohen në një program, dhe është vetëm fillimi.

      Regards,

  4.   Free Software dijo

    Përshëndetje, do të bëni një pjesë tjetër duke zgjeruar temën? Eshte interesante

    1.    ChrisADR dijo

      Përshëndetje, tema është sigurisht mjaft interesante, por niveli i kompleksitetit që ne do të merrnim do të bëhej shumë i lartë, ndoshta duke përfshirë një numër të madh postimesh për të shpjeguar parakushtet e ndryshme për të kuptuar tjetrin. Unë ndoshta do të shkruaj për të, por nuk do të jenë postimet vijuese, unë dua të shkruaj disa tema para se të vazhdoj me këtë.

      Përshëndetje, dhe faleminderit për ndarjen

  5.   kaktus dijo

    Che shumë mirë! Ju po kontribuoni në postime të shkëlqyera! Një pyetje, unë po filloj këtë gjë të Sigurisë IT duke lexuar një libër të quajtur "Sigurimi i sigurisë me anë të provës së stilolapsit". A rekomandohet ky libër? Si më sugjeroni që të filloj të pyes për këto çështje?

    1.    ChrisADR dijo

      Përshëndetje kaktus, është një univers i tërë për dobësitë, dhe të tjerët, për të thënë të vërtetën varet shumë nga ajo që tërheq vëmendjen tuaj, dhe nevojat që keni, një menaxher IT nuk ka nevojë të dijë të njëjtën gjë me një testues të stilolapsit, Ose një studiues i cenueshmërisë, ose një analist mjeko-ligjor, një ekip i rikuperimit të katastrofave ka një grup aftësish shumë të ndryshme. Padyshim që secili prej tyre kërkon një nivel të ndryshëm të njohurive teknike, unë ju rekomandoj që të filloni të zbuloni pikërisht atë që ju pëlqen, dhe të filloni të gllabëroni libra, artikuj dhe të tjerë, dhe më e rëndësishmja, të praktikoni gjithçka që lexoni, edhe nëse është e vjetëruar, kjo do të sjellë një ndryshim në fund të fundit.
      Regards,

  6.   Eizen dijo

    Hey.
    Faleminderit shumë për shpjegimin e kësaj teme, si dhe për të komentuar se për informacione shtesë kemi "Manualin e Shellcoder's". Unë tashmë kam një lexim në pritje