Katingali dina ngamangpaatkeun kerentanan

Nalika kuring ngarepkeun neraskeun ngabahas topik ieu, hayu atuh nyaritakeun sakedik sejarah, tiori sareng praktek ngeunaan kerentanan. Urang sadayana parantos nguping ayeuna yén cacat kaamanan tiasa ngarugikeun seueur, urang sadayana terang yén urang kedah ngajaga perangkat lunak kami tetep anyar, urang sadayana terang yén seueur pembaruan anu disababkeun ku bug kaamanan. Tapi dinten ieu kuring bakal nyaritakeun sakedik tentang kumaha kasalahan-kasalahan ieu dipendakan sareng dieksploitasi 🙂 Tapi sateuacan ieu kami badé netelakeun sababaraha detail supados gaduh tinjauan anu langkung saé.

Sateuacan ngawitan

Mimiti kuring badé ngawartosan anjeun yén kami badé fokus kana kerentanan munggaran anu kuring diajar garapan, anu dipikaterang Buffer Ngabahekeun, dina kerentanan ieu kami ngamanpaatkeun kurangna verifikasi memori pikeun ngalakukeun hal-hal anu pikaresepeun 🙂 Tapi hayu urang netelakeun sakedik perkawis hal éta.

Ieu moal janten skenario dunya nyata

Kuring henteu mampuh ngajarkeun aranjeunna pikeun megatkeun program naon waé anu aranjeunna tingali - mimitina kusabab éta bahaya pikeun komputerna, kadua sabab éta bakal langkung ti kuota kecap kuring anu biasa.

Urang angkat kana perjalanan ka taun 80an

Naon anu kuring badé nunjukkeun ka kuring kuring tiasa lakukeun dina laptop kuring, tapi éta henteu hartosna yén éta tiasa dilakukeun ayeuna ku cara anu 🙂 seueur konsep ieu parantos dieksploitasi sababaraha kali yén metode panyalindungan énggal sareng metode anyar pikeun nyingkahan aranjeunna parantos muncul 😛 tapi éta balikkeun kami ka tempat anu sami, teu aya rohangan pikeun tiasa nyarios sadayana 🙂

Éta panginten henteu tiasa dianggo dina prosésor anjeun

Sanaos kuring badé nganggo conto anu saderhana pisan, kuring hoyong janten jelas ti mimiti yén detil ieu seueur pisan sareng rupa-rupa sapertos anu tiasa kaluar sami sareng kuring, upami anjeun hoyong nyobian. , pangaruh anu dipikahoyong ogé henteu tiasa kahontal 🙂 Tapi anjeun tiasa ngabayangkeun yén kuring henteu tiasa ngajelaskeun yén dina rohangan ieu, utamina kusabab ku bubuka ieu kuring parantos nyandak langkung ti 300 kecap, janten urang langsung kana titik kami.

Naon ari a Buffer Ngabahekeun

Pikeun ngajawab ieu urang mimiti kedah ngartos satengah munggaran tina kombinasi ieu.

Panyangga

Kusabab sadayana ngeunaan memori dina komputer, logis yén kedah aya sababaraha jinis wadah inpormasi. Nalika urang nyarioskeun input outputs, urang langsung kana konsép buffers. Tetep janten pondok, a panyangga Éta mangrupikeun ruang mémori tina ukuran anu parantos ditetepkeun dimana urang badé nyimpen sajumlah inpormasi, saderhana 🙂

Limpahan lumangsung, sakumaha namina, nalika panyangga ngeusi langkung seueur inpormasi tibatan anu tiasa dicekel. Tapi naha ieu penting?

tumpukan

Ogé kawanoh salaku tumpukan, éta mangrupikeun jinis data abstrak anu urang tiasa tumpukan inpormasi, ciri utami na nyaéta aranjeunna gaduh mesen LIFO (Terakhir Di Pertama Kaluar). Hayu urang pikir sakedap ngeunaan tumpukan pelat, urang nempatkeun kana luhur hiji-hiji, teras urang bawa kaluar hiji-hiji ti luhur, ieu ngajantenkeun piring terakhir anu urang atos (anu di luhur) nyaéta piring munggaran yén urang badé nyandak, jelas upami urang ngan ukur tiasa nyandak hiji piring dina hiji waktos sareng kami mutuskeun ngalakukeunana dina urutan éta: P.

Ayeuna anjeun terang dua konsép ieu, urang kedah nempatkeunana dina urutan. Tumpukan penting sabab unggal program anu urang ngajalankeun ngagaduhan program nyalira tumpukan palaksanaan. Tapi tumpukan ieu ngagaduhan ciri anu tangtutumuh turun. Hiji-hijina hal anu anjeun kedah terang ngeunaan ieu nyaéta nalika program dijalankeun, nalika fungsi disebat, tumpukan angkat tina angka X dina mémori kana angka (Xn). Tapi pikeun neraskeun urang kedah ngartos hiji konsep deui.

Nunjuk

Ieu mangrupikeun konsép anu nyababkeun seueur programer gélo nalika ngamimitian di dunya C, nyatana kakuatan hébat program C sabab sabagian tina panggunaan petunjuk. Tetep saderhana, panunjuk nunjuk kana alamat mémori. Ieu hurung rumit, tapi éta henteu rumit, urang sadayana gaduh RAM dina mesin urang, leres? Nya, ieu tiasa dihartikeun a susunan blok padeukeut, lokasi ieu biasana dikedalkeun dina angka héksadesimal (tina 0 dugi ka 9 teras ti A dugi ka F, sapertos 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Di dieu salaku catetan anu panasaran, 0x10 NO sarua jeung 10 😛 lamun urang ngarobah kana urutan decimal bakal sami sareng nyarios 15. Ieu mangrupikeun hal anu ogé matak lieur langkung ti hiji mimitina, tapi hayu urang turun.

Catetan

Prosesorna dianggo kalayan sajumlah rékaman, anu dianggo pikeun ngirimkeun lokasi tina mémori fisik kana prosésor, pikeun arsitéktur anu nganggo 64-bit, jumlah register ageung sareng sesah dijelaskeun di dieu, tapi pikeun kéngingkeun ideu, register sapertos petunjuk, éta nunjukkeun diantarana waé , rohangan mémori (lokasi).

Ayeuna latihan

Kuring terang yén éta parantos seueur inpormasi pikeun diolah dugi ka ayeuna, tapi dina kanyataanana éta mangrupikeun masalah anu rada rumit anu kuring coba terangkeun ku cara anu saderhana, urang bakal ningali program alit anu nganggo panyangga sareng urang badé pegatkeun éta pikeun ngarti ieu ngeunaan overflows, jelas anu ieu sanés Éta mangrupikeun program anu nyata, sareng kami badé "nyingkahan" seueur tindakan anu dianggo ayeuna, ngan ukur nunjukkeun kumaha hal-hal dilakukeun sateuacan 🙂 sareng kusabab sababaraha ieu prinsip perlu pikeun diajar hal-hal anu leuwih rumit 😉

GDB

Program anu hébat anu diragukeun mangrupikeun salah sahiji anu paling seueur dianggo ku programer C. Diantara seueur kautamaan kami ngagaduhan kanyataan yén éta ngamungkinkeun kami ningali sadaya ieu anu parantos kami bicarakan dugi ka ayeuna, register, tumpukan, buffer, jst. Hayu urang tingali program anu bakal urang anggo contona urang.

retinput.c

Milikna. Christopher Diaz Riveros

Ieu mangrupikeun program anu cukup saderhana, urang badé nganggo perpustakaan stdio.h pikeun tiasa kéngingkeun inpormasi sareng nampilkeunana dina terminal. Urang tiasa ningali fungsi anu disebat return_input anu ngahasilkeun a panyangga disebut aturan, anu panjangna 30 bait (jenis data char mangrupikeun 1 bait panjang).

fungsi gets(array); nyuhungkeun inpormasi ku konsol sareng fungsina printf() mulihkeun eusi susunan sareng ningalikeun dina layar.

Unggal program anu ditulis dina C dimimitian ku fungsina main(), ieu ngan ukur bakal tanggung jawab nelepon return_input, ayeuna urang badé nyusun program.

Milikna. Christopher Diaz Riveros

Hayu urang nyandak sakedik naon anu kuring nembe lakukeun. Pilihanna -ggdb ngawartosan gcc pikeun nyusun program sareng inpormasi pikeun gdb pikeun tiasa leres debug. -fno-stack-protector Éta mangrupikeun pilihan anu écés henteu kedah kami anggo, tapi éta kami badé nganggo sabab upami henteu tiasa ngahasilkeun buffer overflow dina tumpukan. Tungtungna kuring parantos diuji hasilna. ./a.out éta ngan ukur ngalirkeun naon anu kuring nembe disusun, éta naroskeun inpormasi sareng mulih deui. Ngajalankeun 🙂

Awas

Catetan anu sanés di dieu. Naha anjeun tiasa ningali peringatan? jelas éta mangrupikeun hal anu kedah diperhatoskeun nalika urang damel nganggo kode atanapi nyusun, ieu rada atra sareng aya sababaraha program anu ayeuna ngagaduhan fungsina gets() Dina kode. Hiji kaunggulan Gentoo nyaéta ku nyusun unggal program, kuring tiasa ningali naon anu lepat, program anu "ideal" henteu kedah ngagaduhan éta, tapi anjeun bakal kaget kumaha seueur program ageung anu gaduh peringatan ieu kusabab éta SANGAT ageung sareng éta hésé pikeun ngalacak éta. fungsi bahaya nalika aya seueur peringatan dina waktos anu sasarengan. Ayeuna upami urang teraskeun

Debugging program

Milikna. Christopher Diaz Riveros

Ayeuna, bagian ieu tiasa sakedik ngabingungkeun, tapi kumargi kuring parantos nyerat sakedik, kuring henteu sanggup ngajelaskeun sadayana, punten upami anjeun ningali yén kuring bakal gancang teuing 🙂

Disarming kode

Hayu urang mimitian ku ningali program bahasa mesin disusun kami.

Milikna. Christopher Diaz Riveros

Ieu kode tina fungsi utama urang di papanggihan, ieu anu dipikaharti ku prosésor urang, garis di kénca nyaéta alamat fisik dina mémori, anu <+ n> katelah salaku offset, dasarna jarak ti mimiti fungsi (utama) kana pernyataan éta (katelah opcode). Teras we ningali jinis instruksi (push / Mov / callq…) sareng hiji atanapi langkung register. Diringkeskeun urang tiasa nyarios yén éta indikasi dituturkeun ku sumber / asal na tujuan. <return_input> ngarujuk kana fungsi kadua urang, hayu urang tingali.

Return_input

Milikna. Christopher Diaz Riveros

Ieu rada rumit, tapi kuring ngan ukur hoyong anjeun mariksa sababaraha hal, aya tag anu disebat <gets@plt> sareng hiji opcode terakhir disebat retq nunjukkeun tungtung fungsina. Kami badé nempatkeun sababaraha titik putus, salah sahiji dina fungsina gets sareng anu sanésna dina retq.

Milikna. Christopher Diaz Riveros

lalumpatan

Ayeuna urang badé ngajalankeun program pikeun ningali kumaha tindakanana dimimitian.

Milikna. Christopher Diaz Riveros

Urang tiasa ningali yén panah leutik némbongan nunjukkeun opcode dimana ayana urang, kuring hoyong éta nyandak arah 0x000055555555469b, ieu alamat saatos nelepon ka return_input dina fungsi main , ieu penting sabab ieu dimana program kedah balik nalika anjeun atos nampi ngasupkeun, hayu urang kana fungsina. Ayeuna urang badé parios mémori sateuacan ngalebetkeun pungsina gets.

Milikna. Christopher Diaz Riveros

Kuring parantos nempatkeun pungsi utama pikeun anjeun, sareng kuring parantos nyorot kode anu kuring tingal, sakumaha anjeun tiasa tingali, kusabab kasabaran parantos dipisahkeun janten dua ruas, abdi hoyong anjeun tumut kana pitunjukna 0x7fffffffdbf0 (anu kahiji ti kénca saatos komando x/20x $rsp) kumargi ieu mangrupikeun lokasi anu kedah kami anggo pikeun ngariksa hasilna, hayu urang teraskeun:

Ngalanggar program

Milikna. Christopher Diaz Riveros

Kuring parantos nyorot jelema 0x44444444sabab éta mangrupikeun gambaran tina Ds kami 🙂 ayeuna kami parantos ngamimitian nambihan ngasupkeun kana program, sareng sapertos anjeun tiasa tingali, kami ngan ukur dua garis tina alamat anu dipikahoyong, kami bakal ngeusianana dugi ka saacan alamat anu kami nyorot dina léngkah sateuacana.

Ngarobih jalur balik

Ayeuna urang parantos tiasa ngalebetkeun bagian ieu kode dimana éta nunjukkeun kembalna fungsina, hayu urang tingali naon anu lumangsung upami urang ngarobih alamat 🙂 tibatan angkat ka lokasi kode opcode anu nuturkeun anu urang gaduh sakedap, kumaha saur anjeun lamun urang balik deui ka return_input? Tapi pikeun ieu, perlu nyerat alamat anu urang pikahoyong dina binér, urang badé ngalaksanakeunnana sareng fungsina printf ti bash 🙂

Milikna. Christopher Diaz Riveros

Ayeuna kami nampi inpormasi dua kali 😀 pastina program éta henteu didamel pikeun éta, tapi kami parantos tiasa ngarusak kodeu sareng ngajantenkeun ngulang hal anu henteu sakuduna dilakukeun.

Réfléksi

Parobihan saderhana ieu tiasa dianggap a mangpaatkeun dasar pisan 🙂 anjeunna parantos tiasa ngabéréskeun program sareng ngalakukeun hal anu urang pikahoyong na.

Ieu mangrupikeun léngkah munggaran dina daptar hal anu ampir teu aya watesna pikeun ningali sareng nambihan, aya cara pikeun nambihan langkung seueur hal tibatan ngan saukur ngulang pesenan, tapi waktos ieu kuring parantos nyerat seueur sareng sadayana anu aya hubunganana sareng cangkang cangkang éta poko pikeun nyerat langkung ti tulisan, buku lengkep anu kuring bakal nyarios. Hapunten upami kuring henteu acan tiasa ngagali deui sababaraha topik anu kuring pikahoyong, tapi pastina bakal aya kasempetan 🙂 Salam sareng hatur nuhun parantos sumping ka dieu.


Eusi tulisan taat kana prinsip urang tina étika éditorial. Pikeun ngalaporkeun kasalahan klik di dieu.

14 koméntar, tinggalkeun anjeun

Ninggalkeun koméntar anjeun

email alamat anjeun moal diterbitkeun. Widang diperlukeun téh ditandaan ku *

*

*

  1. Jawab data: Miguel Ángel Gatón
  2. Tujuan tina data: Kontrol SPAM, manajemén koméntar.
  3. Legitimasi: idin anjeun
  4. Komunikasi data: Data moal dikomunikasikan ka pihak katilu kacuali ku kawajiban hukum.
  5. Panyimpenan data: Basis data anu diayakeun ku Occentus Networks (EU)
  6. Hak: Iraha waé anjeun tiasa ngawatesan, cageur sareng mupus inpormasi anjeun.

  1.   2p2 cenahna

    Janten langkung langsung. Tulis kirang sareng difokuskeun naon anu penting

    1.    ChrisADR cenahna

      Hai, hatur nuhun kana koméntarna.

      Pikeun nyatana anu leres kuring parantos motong bagian anu hadé tina ideu, tapi sanaos sigana kuring yén éta tinggaleun minimum sahingga jalma anu henteu ngagaduhan elmu program tiasa ngagaduhan ideu.

      Wasalam

      1.    henteu aya namina cenahna

        Masalahna nyaéta jalma-jalma anu henteu ngagaduhan elmu pamrograman moal terang ngeunaan naon-naon sabab rumit teuing pikeun dimimitanana, tapi anu terang kumaha program ngahargaan langkung langsung.

        Saur anjeun henteu tiasa ngahontal sadayana, anjeun kedah milih, sareng dina hal ieu anjeun parantos ngalakukeun dosa hoyong pisan ngaliput.

        Ku jalan kitu, kuring nyaritakeun anjeun salaku kritik anu ngawangun, kuring resep kana topik ieu sareng kuring hoyong anjeun neraskeun nyerat tulisan, ucapan salamet!

    2.    henteu aya namina cenahna

      Kuring ngarasa sami.

      1.    ChrisADR cenahna

        Hatur nuhun pisan ka duaan !! Pasti sesah ngartos kumaha pikeun ngahontal target audién nalika anu leres nyaéta jumlah jalma anu gaduh tingkat pemrograman anu langkung maju anu maca tulisan ieu kirang (sahenteuna anu tiasa disimpulkeun dumasar kana koméntar)

        Kuring pastina ngalakukeun dosa tina hoyong nyederhanakeun hal anu meryogikeun basis pangetahuan anu jembar pikeun kahartos. Kuring miharep anjeun ngartos yén ti saprak kuring mimiti ngamimitian dina blogging, kuring henteu acan mendakan titik anu pasti dimana pamiarsa kuring terang sareng ngartos naon anu kuring carioskeun. Éta bakal ngajantenkeun langkung gampang pikeun nyatana truth

        Kuring bakal nyobian langkung pondok nalika éta pantes tanpa diséonalkeun pormatna, kumargi misahkeun cara nyerat tina konténna sakedik langkung rumit tibatan anu tiasa dibayangkeun, sahenteuna mah aranjeunna rada nyambung, tapi sigana mah pamustunganana kuring bakal tiasa nambihan garis dina tibatan motong eusi.

        Wasalam

  2.   mario cenahna

    Dimana anjeun tiasa mendakan langkung seueur perkawis éta? Aya buku anu disarankeun?

    1.    ChrisADR cenahna

      Conto ieu dicandak tina Buku Panduan The Shellcoder's ku Chris Anley, John Heasman, Felix Linder sareng Gerardo Richarte, tapi pikeun ngalakukeun tarjamahan 64-bit kuring kedah diajar ngeunaan arsitéktur kuring, manual pamekar intel, jilid 2 sareng 3 mangrupikeun sumber anu cukup dipercaya pikeun éta. Alus ogé maca dokuméntasi GDB, anu disertakeun ku paréntah 'info gdb', Pikeun diajar Assembly and C aya seueur buku anu saé pisan, kajabi buku Majelisna rada lami janten aya celah pikeun dieusian ku anu sanés dokuméntasi tipe.

      Cangkang kode na ayeuna henteu épék deui ayeuna-ayeuna ku sababaraha alesan, tapi masih pikaresepeun pikeun diajar téknik anyar.

      Mudah-mudahan tiasa ngabantosan 🙂 Salam

  3.   Franz cenahna

    Tulisan anu saé, blog lami desdelinux parantos dilahirkeun deui =)
    Lamun anjeun nyarios cangkang jauh henteu épéktip, anjeun hartosna tindakan balas anu dirancang pikeun ngirangan serangan, aranjeunna nyebatna kaamanan karasa.
    Salam sareng jaga

    1.    ChrisADR cenahna

      Hatur nuhun pisan Franz words kecap anu saé pisan, saleresna mah maksadna yén Shellcoding dinten ayeuna langkung rumit tibatan anu urang tingali di dieu. Kami ngagaduhan ASLR (generator lokasi mémori acak) panyalindungan tumpukan, sababaraha ukuran sareng cara ngukur anu ngawatesan jumlah opkod anu tiasa disuntik kana program, sareng éta ngan ukur mimiti.

      Salam,

  4.   software bébas cenahna

    Halo, anjeun bakal ngalakukeun bagian sanés anu ngagedékeun topik? Éta pikaresepeun

    1.    ChrisADR cenahna

      Halo, topik na pasti rada pikaresepeun, tapi tingkat pajeulitna anu bakal urang candak bakal janten luhur pisan, panginten ngalibetkeun sajumlah ageung tulisan pikeun ngajelaskeun sababaraha prasyarat pikeun ngartos anu sanés. Kuring sigana bakal nyerat perkawis éta, tapi éta sanés tulisan-tulisan ieu, kuring badé nyerat sababaraha topik sateuacan neraskeun ieu.

      Salam, sareng hatur nuhun pikeun ngabagi

  5.   kaktus cenahna

    Che alus pisan! Anjeun nyumbangkeun tulisan anu saé! Hiji patarosan, kuring ngamimitian hal IT IT ieu ku maca buku anu disebut "Ngajamin kaamanan ku uji kalam." Naha buku ieu disarankeun? Kumaha anjeun nyarankeun yén kuring mimiti naroskeun masalah ieu?

    1.    ChrisADR cenahna

      Héi kaktus, éta mangrupikeun jagat raya ngeunaan kerentanan, sareng anu sanésna, pikeun nyatana anu leres éta gumantung pisan kana naon anu narik perhatian anjeun, sareng kabutuhan anu anjeun gaduh, hiji manajer IT henteu kedah terang sami sareng tés-tés, Atanapi panaliti kerentanan, atanapi analis forensik, tim pananggulangan bencana ngagaduhan seueur kamampuan anu béda pisan. Jelas masing-masing diantarana peryogi tingkat élmu téknis anu béda, kuring nyarankeun anjeun mimiti mendakan naon anu anjeun resep, sareng ngamimitian ngala buku, tulisan, sareng anu sanésna, sareng anu paling penting, latihan sagala anu anjeun baca, sanajan éta geus kadaluarsa, éta bakal ngabédakeun tungtungna.
      Salam,

  6.   Eitzen cenahna

    Hello.
    Hatur nuhun pisan pikeun ngajelaskeun topik ieu, ogé ogé mairan éta pikeun inpormasi tambahan kami gaduh "The Shellcoderer's Handbook". Abdi parantos gaduh bacaan anu tertunda 😉