Ieskats ievainojamību izmantošanā

Tā kā es ar nepacietību gaidīju turpināt apspriest šo tēmu, ļaujiet man pastāstīt nedaudz par ievainojamības vēsturi, teoriju un praksi. Mēs visi jau esam dzirdējuši, ka drošības trūkumi var maksāt daudz, mēs visi zinām, ka mums programmatūra ir jāatjaunina, mēs visi zinām, ka daudzus atjauninājumus izraisa drošības kļūdas. Bet šodien es jums pastāstīšu nedaudz par to, kā šīs kļūdas tiek atrastas un izmantotas. Bet pirms tam mēs precizēsim dažas detaļas, lai iegūtu labāku pārskatu.

Pirms sākat

Vispirms es vēlos jums pateikt, ka mēs koncentrēsimies uz pirmo ievainojamību, kuru iemācījos izmantot, uz zināmo Bufera pārpilde, šajā ievainojamībā mēs izmantojam atmiņas verifikācijas trūkumu, lai veiktu jautras lietas 🙂 Bet paskaidrosim nedaudz vairāk par to.

Tas nebūs reāls scenārijs

Es nevaru atļauties iemācīt viņiem izjaukt jebkuru redzamo programmu - pirmkārt tāpēc, ka tā ir bīstama viņu datoriem, otrkārt, jo tas prasītu vairāk nekā man ierastā vārdu kvota.

Dodamies ceļojumā uz 80. gadiem

Ko es jums parādīšu, es to varu izdarīt savā klēpjdatorā, taču tas nenozīmē, ka to šodien var izdarīt vienkārši 😛 bet tas mūs atgriež tajā pašā vietā, nav vietas, kur to visu izstāstīt 🙂

Iespējams, tas nedarbojas jūsu procesorā

Lai gan es izmantoju ļoti vienkāršu piemēru, es vēlos, lai jau no paša sākuma būtu skaidrs, ka detaļas ir tik daudz un tik dažādas, ka, tāpat kā tas var iznākt tāds pats kā es, ja vēlaties izmēģināt, vēlamais efekts var arī netikt sasniegts 🙂 Bet jūs varat iedomāties, ka es nevaru to izskaidrot šajā telpā, it īpaši tāpēc, ka ar šo ievadu es jau esmu uzņēmis vairāk nekā 300 vārdus, tāpēc mēs nonākam tieši pie savas domas.

Kas ir a Bufera pārpilde

Lai atbildētu uz to, mums vispirms ir jāsaprot šīs kombinācijas pirmā puse.

Buferi

Tā kā viss attiecas uz atmiņu datorā, ir loģiski, ka ir jābūt kāda veida informācijas konteineram. Kad mēs runājam par ieejas rezultāti, mēs nonākam tieši pie jēdziena buferi. Lai tas būtu īss, a buferis Tā ir noteikta lieluma atmiņas telpa, kurā mēs glabāsim vienkāršu informācijas daudzumu

Pārslodzes rodas, kā norāda nosaukums, kad buferis aizpilda vairāk informācijas, nekā tas var saturēt. Bet kāpēc tas ir svarīgi?

Kaudze

Pazīstami arī kā kaudzes, tie ir abstrakts datu tips, kurā mēs varam kaudze informācija, to galvenā iezīme ir tā, ka viņiem ir pasūtījums LIFO (pēdējais pirmais iznācējs). Padomāsim kādu brīdi par plākšņu kaudzīti, mēs tos pa vienam uzliekam virsū, un pēc tam pa vienam izvelkam no augšas, tādējādi pēdējā plāksne, ko esam ielikuši (tā, kas atrodas augšpusē), ir pirmā plāksne Ko mēs izņemsim, acīmredzot, ja mēs vienlaikus varam izņemt tikai vienu plāksni un mēs nolemjam to darīt šādā secībā: P.

Tagad, kad jūs zināt šos divus jēdzienus, mums tie ir jāsakārto. Skursteņi ir svarīgi, jo katrai mūsu vadītajai programmai ir savs izpildes kaudze. Bet šai kaudzei ir īpaša īpašībaaug uz leju. Vienīgais, kas jums par to jāzina, ir tas, ka programmas darbības laikā, izsaucot funkciju, kaudze pāriet no atmiņā esošā skaitļa X uz skaitli (Xn). Bet, lai turpinātu, mums ir jāsaprot vēl viens jēdziens.

Norādes

Šis ir jēdziens, kas daudzus programmētājus padara trakus, kad viņi sāk darbu C pasaulē, patiesībā C programmēšanas lielais spēks daļēji ir saistīts ar rādītāju izmantošanu. Lai tas būtu vienkārši, rādītājs norāda uz atmiņas adresi. Tas izklausās sarežģīti, bet tas nav tik sarežģīti, vai mums visiem mašīnās ir RAM? Nu, to var definēt kā secīgs bloku izvietojums, šīs vietas parasti izsaka heksadecimālos skaitļos (no 0 līdz 9 un pēc tam no A līdz F, piemēram, 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Šeit kā ziņkārīga piezīme 0x10 NĒ ir vienāds ar 10 😛, ja to pārvēršam decimāldaļās, tas būtu tas pats, kas teikt 15. Tas ir kaut kas, kas sākumā arī mulsina vairāk nekā vienu, bet ķeramies pie tā.

Ieraksti

Procesori strādā ar vairākiem ieraksti, kas darbojas, lai pārsūtītu atrašanās vietas no fiziskās atmiņas uz procesoru, arhitektūrām, kas izmanto 64 bitus, reģistru skaits ir liels un šeit ir grūti aprakstāms, bet, lai iegūtu ideju, reģistri ir kā rādītāji, tie cita starpā norāda lietas, atmiņas vieta (vieta).

Tagad praktizē

Es zinu, ka līdz šim apstrādei ir bijis daudz informācijas, bet patiesībā tie ir zināmā mērā sarežģīti jautājumi, kurus es cenšos izskaidrot ļoti vienkārši, mēs redzēsim nelielu programmu, kurā tiek izmantoti buferi, un mēs to salauzīsim, lai to saprastu par pārplūdēm, acīmredzot šis nav Tā ir īsta programma, un mēs "izvairīsimies" no daudziem pretpasākumiem, kas tiek izmantoti šodien, lai tikai parādītu, kā lietas tika veiktas iepriekš 🙂 un tāpēc, ka daži no šiem principiem ir nepieciešami, lai varētu uzzināt sarežģītākas lietas 😉

gDB

Lieliska programma, kas neapšaubāmi ir viena no visvairāk izmantotajām C. Programmētāji. Starp daudzajiem tikumiem mums ir fakts, ka tas ļauj mums redzēt visu to, par ko mēs runājām līdz šim, reģistriem, kaudzi, buferiem utt. programmu, kuru izmantosim savam piemēram.

retinput.c

Pašu. Kristofers Diazs Riveross

Šī ir diezgan vienkārša programma, mēs izmantosim bibliotēku stdio.h lai varētu iegūt informāciju un parādīt to terminālā. Mēs varam redzēt funkciju, ko sauc return_input kas ģenerē a buferis sauc masīvs, kura garums ir 30 baiti (char datu tips ir 1 baits garš).

Funkcija gets(array); pieprasīt informāciju, izmantojot konsoli un funkciju printf() atgriež masīva saturu un parāda to ekrānā.

Katra C rakstītā programma sākas ar funkciju main(), tas būs atbildīgs tikai par return_input izsaukšanu, tagad mēs apkoposim programmu.

Pašu. Kristofers Diazs Riveross

Ņemsim mazliet no tā, ko es tikko izdarīju. Opcija -ggdb liek gcc kompilēt programmu ar informāciju, lai gdb varētu pareizi atkļūdot. -fno-stack-protector Tā ir iespēja, kuru acīmredzot mums nevajadzētu izmantot, bet kuru mēs izmantosim, jo ​​pretējā gadījumā būtu iespējams ģenerēt bufera pārpildi kaudzē. Galu galā esmu pārbaudījis rezultātu. ./a.out tas vienkārši izpilda to, ko es tikko sastādīju, tas prasa informāciju un atdod to. Skriešana 🙂

Brīdinājumi

Šeit vēl viena piezīme. Vai jūs varat redzēt brīdinājumus? nepārprotami tas ir kaut kas jāņem vērā, strādājot ar kodu vai kompilējot, tas ir mazliet acīmredzami, un ir maz programmu, kurām šodien ir funkcija gets() Kodā. Viena no Gentoo priekšrocībām ir tā, ka, apkopojot katru programmu, es redzu, kas varētu būt nepareizi, "ideālai" programmai to nevajadzētu būt, taču jūs būtu pārsteigts, cik daudzām lielām programmām ir šie brīdinājumi, jo tie ir vienkārši ĻOTI lieli un tos ir grūti izsekot. bīstamas funkcijas, ja vienlaikus ir daudz brīdinājumu. Tagad, ja mēs turpināsim

Programmas atkļūdošana

Pašu. Kristofers Diazs Riveross

Tagad šī daļa var būt nedaudz mulsinoša, bet, tā kā es jau esmu uzrakstījis diezgan daudz, es nevaru atļauties visu izskaidrot, tāpēc atvainojiet, ja redzat, ka es eju pārāk ātri 🙂

Koda atbruņošana

Sāksim apskatīt mūsu sastādīto mašīnvalodas programmu.

Pašu. Kristofers Diazs Riveross

Šis ir mūsu galvenās funkcijas kods Montāža, to saprot mūsu procesors, kreisajā pusē esošā līnija ir atmiņā esošā fiziskā adrese <+ n> ir pazīstams kā kompensācija, būtībā attālums no funkcijas (galvenā) sākuma līdz šim apgalvojumam (pazīstams kā opcode). Tad mēs redzam instrukcijas veidu (push / mov / callq…) un vienu vai vairākus reģistrus. Apkopojot, mēs varam teikt, ka tā ir norāde, kurai seko avots / izcelsme un galamērķis. <return_input> attiecas uz mūsu otro funkciju, apskatīsim.

return_input

Pašu. Kristofers Diazs Riveross

Tas ir nedaudz sarežģītāk, bet es tikai vēlos, lai jūs pārbaudītu pāris lietas, ir tags, ko sauc <gets@plt> un izsaukts pēdējais opkods retq norādot funkcijas beigas. Mēs ieliksim pāris pārtraukuma punktus, vienu funkcijā gets un vēl viens retq.

Pašu. Kristofers Diazs Riveross

skrējiens

Tagad mēs palaidīsim programmu, lai redzētu, kā darbība sākas.

Pašu. Kristofers Diazs Riveross

Mēs varam redzēt, ka parādās maza bultiņa, kas norāda opkodu, kur mēs atrodamies, es vēlos, lai viņi ņem vērā virzienu 0x000055555555469b, šī ir adrese pēc zvana uz return_input darbībā main , tas ir svarīgi, jo šeit ir jāatgriežas programmai, kad esat pabeidzis saņemt ievade, iedziļināsimies funkcijā. Tagad mēs pārbaudīsim atmiņu, pirms ievadāt funkciju gets.

Pašu. Kristofers Diazs Riveross

Es jums esmu izveidojis galveno funkciju un esmu izcēlis kodu, uz kuru es atsaucos, kā redzat, pateicoties galīgums ir sadalīts divos segmentos, es vēlos, lai tie ņemtu vērā virzienu 0x7fffffffdbf0 (pirmais no kreisās aiz komando x/20x $rsp), tā kā šī ir vieta, kas mums jāizmanto, lai pārbaudītu iegūto rezultātu, turpināsim:

Programmas pārkāpšana

Pašu. Kristofers Diazs Riveross

Es tos esmu izcēlis 0x44444444jo tie ir mūsu D attēlojums 🙂 tagad mēs esam sākuši pievienot ievade uz programmu, un, kā redzat, mēs esam tikai divas rindiņas no vēlamās adreses, mēs to aizpildīsim, līdz būsim tieši pirms adresēm, kuras mēs izcēlām iepriekšējā solī.

Atgriešanās ceļa maiņa

Tagad, kad mums ir izdevies ievadīt šo koda sadaļu, kur tā norāda funkcijas atgriešanos, redzēsim, kas notiks, ja mainīsim adresi of, nevis ejam uz opkodu atrašanās vietu, kas seko tam, kas bija pirms brīža, kā jūs domājat ja mēs atgriezīsimies pie return_input? Bet tam ir nepieciešams ierakstīt vēlamo adresi binārā formā, mēs to darīsim ar funkciju printf no bash 🙂

Pašu. Kristofers Diazs Riveross

Tagad mēs esam saņēmuši informāciju divreiz, protams, programma nav paredzēta tam, taču mums ir izdevies lauzt kodu un likt tam atkārtot kaut ko tādu, ko tam nevajadzēja darīt.

Pārdomas

Šīs vienkāršās izmaiņas var uzskatīt par a izmantot ļoti vienkāršs: viņam ir izdevies izjaukt programmu un izdarīt kaut ko tādu, ko mēs vēlamies.

Šis ir tikai pirmais solis gandrīz bezgalīgajā apskatāmo un pievienojamo lietu sarakstā, ir veidi, kā pievienot vairāk lietu nekā vienkārši atkārtot pasūtījumu, taču šoreiz esmu uzrakstījis daudz un visu, kas saistīts ar čaulas kodēšana tā ir tēma, lai rakstītu vairāk nekā rakstus, pilnīgas grāmatas, ko es teiktu. Atvainojiet, ja neesmu varējis nedaudz vairāk iedziļināties tēmās, kuras man būtu paticis, bet noteikti būs iespēja 🙂 Sveicieni un paldies, ka esat ieradušies šeit.


Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.

  1.   2p2 teica

    Esi tiešāks. Rakstiet mazāk un koncentrējieties uz to, kas ir svarīgi

    1.    KrissADR teica

      Sveiki, paldies par komentāru.

      Patiesību sakot, es esmu izgriezis labu daļu ideju, taču man pat tā šķita, ka tas atstāja minimumu, lai kāds, kam nav programmēšanas zināšanu, varētu gūt ideju.

      Sveicieni

      1.    anonīms teica

        Problēma ir tā, ka tie, kuriem nav programmēšanas zināšanu, par neko neuzzinās, jo sākt ir pārāk sarežģīti, bet tie, kas prot programmēt, novērtē tiešumu.

        Es pieņemu, ka jūs nevarat sasniegt visus, jums ir jāizvēlas, un šajā gadījumā jūs esat grēkojis, ka vēlaties daudz segt.

        Starp citu, es jums saku kā konstruktīvu kritiku, man patīk šīs tēmas un es vēlētos, lai jūs turpinātu rakstīt rakstus, apsveicu!

    2.    anonīms teica

      Es jūtos tāpat.

      1.    KrissADR teica

        Liels paldies abiem !! Noteikti ir grūti saprast, kā sasniegt mērķauditoriju, ja patiesība ir tāda, ka cilvēku ar progresīvu programmēšanas līmeni, kuri lasa šos rakstus, ir maz (vismaz to var secināt, pamatojoties uz komentāriem)

        Es noteikti esmu grēkojis, vēloties vienkāršot kaut ko tādu, kura izpratne prasa plašu zināšanu bāzi. Es ceru, ka jūs saprotat, ka, tā kā es tikai sāku veidot emuārus, es vēl neesmu atklājis precīzu punktu, kur mani lasītāji zina un saprot, ko es saku. Tas padarītu daudz vieglāk pateikt patiesību 🙂

        Es centīšos būt īsāks, kad tas ir pelnījis, nedepersonalizējot formātu, jo rakstīšanas veida nošķiršana no satura ir nedaudz sarežģītāka, nekā varētu iedomāties, man vismaz tie ir diezgan saistīti, bet es domāju, ka galu galā es varēšu pievienot rindiņas tā vietā, lai samazinātu saturu.

        Sveicieni

  2.   Mario teica

    Kur jūs varētu uzzināt vairāk par šo tēmu? Vai ir kāda ieteicamā grāmata?

    1.    KrissADR teica

      Piemērs, ko es ieguvu no Krisa Anlija, Džona Heasmana, Feliksa Lindera un Džerardo Ričartes The Shellcoder rokasgrāmatas, bet, lai veiktu 64 bitu tulkošanu, man vajadzēja uzzināt par manu arhitektūru, intel izstrādātāja rokasgrāmatas 2. un 3. sējums ir diezgan uzticams avots tam. Ir arī labi izlasīt GDB dokumentāciju, kas nāk ar komandu 'info gdb'. Lai uzzinātu asambleju un C, ir ļoti daudz ļoti labu grāmatu, izņemot to, ka asamblejas grāmatas ir mazliet vecas, tāpēc ir plaisa, lai aizpildītu citu veidu dokumentācija.

      Pats čaulas kods dažādu iemeslu dēļ mūsdienās vairs nav tik efektīvs, taču joprojām ir interesanti apgūt jaunas metodes.

      Ceru, ka tas nedaudz palīdz 🙂 Sveiciens

  3.   Franz teica

    Labs raksts, vecs blogs desdelinux ir atdzimis no jauna =)
    Kad jūs sakāt, ka tālvadības čaula nav tik efektīva, jūs domājat pretpasākumus, kas paredzēti uzbrukumu mazināšanai, viņi to sauc par aizskarošu drošību.
    Sveiciens un tā turpināt

    1.    KrissADR teica

      Liels paldies Franz - ļoti laipni vārdi, patiesībā es domāju, ka Shellcoding šodien ir daudz sarežģītāka nekā tas, ko mēs šeit redzam. Mums ir ASLR (izlases atmiņas atrašanās vietas ģenerators) kaudzes aizsargs, dažādi pasākumi un pretpasākumi, kas ierobežo programmā ievadāmo opkodu skaitu, un tas ir tikai sākums.

      Sveicieni,

  4.   Bezmaksas programmatūra teica

    Sveiki, vai jūs veicat vēl vienu daļu, paplašinot tēmu? Tas ir interesanti

    1.    KrissADR teica

      Sveiki, šī tēma noteikti ir diezgan interesanta, taču sarežģītības pakāpe, kas mums būtu nepieciešama, kļūtu ļoti augsta, iespējams, iesaistot lielu skaitu amatu, lai izskaidrotu dažādus priekšnoteikumus, lai saprastu otru. Es, iespējams, rakstīšu par to, bet tie nebūs šādi ieraksti, es vēlos uzrakstīt dažas tēmas, pirms turpināt šo.

      Sveiciens un paldies par dalīšanos

  5.   kaktuss teica

    Ļoti labs che! Jūs pievienojat lieliskas ziņas! Viens jautājums - es sāku šo IT drošības lietu, lasot grāmatu ar nosaukumu "Drošības nodrošināšana ar pildspalvu pārbaudi". Vai šī grāmata ir ieteicama? Kā jūs iesakāt man sākt interesēties par šiem jautājumiem?

    1.    KrissADR teica

      Sveiks, kaktuss, tas ir vesels Visums par ievainojamībām, un citi, lai pateiktu patiesību, tas ir ļoti atkarīgs no tā, kas piesaista Tavu uzmanību un kādas ir jūsu vajadzības, IT vadītājam nav jāzina tas pats, kas pildspalvu testeris. Vai arī ievainojamības pētniekam vai tiesu ekspertam, katastrofu seku novēršanas komandai ir ļoti atšķirīgas prasmes. Acīmredzot katram no tiem ir nepieciešamas atšķirīgas tehniskās zināšanas, es iesaku sākt atklāt tieši to, kas jums patīk, un sākt rīt grāmatas, rakstus un citus, un pats galvenais, praktizēt visu lasīto, pat ja tas ir novecojis , tas galu galā kaut ko mainīs.
      Sveicieni,

  6.   Eicens teica

    Sveiki.
    Liels paldies, ka izskaidrojāt šo tēmu, kā arī komentējāt, ka par papildu informāciju mums ir "The Shellcoder's Handbook". Man jau ir gaidāma lasāmviela 😉