Поглед на искоришћавање рањивости

Док сам се радовао наставку дискусије о овој теми, дозволите ми да вам кажем мало историје, теорије и праксе о рањивостима. Сви смо до сада чули да сигурносне мане могу коштати много, сви знамо да морамо редовно ажурирати свој софтвер, сви знамо да су многа ажурирања проузрокована безбедносним грешкама. Али данас ћу вам рећи мало о томе како се ове грешке проналазе и користе 🙂 Али пре овога разјаснићемо неколико детаља како бисмо имали бољи преглед.

Пре него што започнете

Прво желим да вам кажем да ћемо се фокусирати на прву рањивост коју сам научио да користим, на познату Прелив бафера, у овој рањивости користимо недостатак верификације меморије да бисмо радили забавне ствари 🙂 Али хајде да појаснимо мало више о томе.

Ово неће бити стварни светски сценарио

Не могу да приуштим да их научим да разбију било који програм који виде - прво зато што је опасно за њихове рачунаре, друго јер би за то требало више од моје уобичајене квоте речи.

Идемо на путовање у 80-те

Оно што ћу вам показати могу да радим на свом лаптопу, али не значи да се то данас може учинити на једноставан начин 🙂 многи од ових концепата већ су толико пута искоришћени да су нове методе заштите и нове методе за избегавање они су се појавили 😛 али то нас враћа на исто место, нема простора да то све можемо рећи 🙂

Можда неће радити на вашем процесору

Иако ћу се послужити врло једноставним примером, желим да од почетка буде сасвим јасно да су детаљи тога толико различити да баш као што може да изађе исто као и ја, ако желите да испробате , жељени ефекат се такође можда неће постићи 🙂 Али можете замислити да то не могу објаснити на овом простору, поготово што сам овим уводом узео више од 300 речи, па прелазимо право на нашу поенту.

Шта је а Прелив бафера

Да бисмо одговорили на ово прво морамо да разумемо прву половину ове комбинације.

Буфферс

Будући да се све односи на меморију у рачунару, логично је да мора постојати нека врста информационог контејнера. Кад говоримо о улаза излаза, долазимо директно до концепта пуфери. Да буде кратко, а буффер То је меморијски простор дефинисане величине у који ћемо сместити количину информација, једноставних 🙂

Преливања се јављају, као што и само име говори, када се међуспремник напуни са више информација него што може да поднесе. Али зашто је ово важно?

Стацк

Такође познати као стекови, они су апстрактни тип података у којем можемо гомила информације, њихова главна карактеристика је да имају наруџбину ЛИФО (последњи у првом изласку). Помислимо на секунду о гомили тањира, стављамо их једну по једну на врх, а затим вадимо једну по једну од врха, ово чини последњу плочу коју смо ставили (ону која је на врху ) је прва плоча Шта ћемо извадити, очигледно ако можемо извадити само по једну плочу и одлучимо да то радимо тим редоследом: П.

Сад кад знате ова два појма, морамо их довести у ред. Стекови су важни јер сваки програм који покрећемо има свој извршни стек. Али овај стек има одређена карактеристикарасте доле. Једино што о томе треба да знате је да док се програм изводи, када се функција позове, стек прелази са броја Кс у меморији на број (Ксн). Али да бисмо наставили, морамо разумети још један концепт.

Поинтерс

Ово је концепт који излуђује многе програмере кад започињу са радом на свету Ц, заправо велика снага програмирања на Ц делом је последица употребе показивача. Да буде једноставније, показивач упућује на меморијску адресу. Ово звучи сложено, али није тако сложено, сви имамо РАМ у својим машинама, зар не? Па, ово се може дефинисати као узастопни распоред блокова, ове локације су обично изражене у хексадецималним бројевима (од 0 до 9, а затим од А до Ф, као што су 0к0, 0к1, 0к6, 0кА, 0кФ, 0к10). Овде као необична белешка, 0к10 НЕ је једнако 10 😛 ако га претворимо у децимални редослед то би било исто као да кажемо 15. То је нешто што такође збуњује више од једног у почетку, али хајдемо на то.

Рецордс

Процесори раде са више њих плоче, који раде на преношењу локација из физичке меморије у процесор, за архитектуре које користе 64-битне бројеве, број регистара је велик и овде је тешко описати, али да би стекли идеју, регистри су попут показивача, између осталог указују , меморијски простор (локација).

Сада вежбајте

Знам да је до сада било обрађено пуно информација, али у стварности то су донекле сложена питања која покушавам да објасним на врло једноставан начин, видећемо мали програм који користи бафере и идемо на разбијте то да бисте разумели ово о преливањима, очигледно ово није. То је прави програм и ми ћемо „избећи“ многе противмере које се данас користе, само да бисмо показали како су се ствари радиле пре 🙂 и зато што неке принципи су неопходни да би се могле научити сложеније ствари 😉

ГДБ

Сјајан програм који је несумњиво један од најчешће коришћених програмера Ц. Међу многим врлинама имамо и чињеницу да нам омогућава да видимо све ово о чему смо до сада говорили, регистре, стек, бафере итд. Етц. Погледајмо програм који ћемо користити за наш пример.

ретинпут.ц

Сопствени. Цхристопхер Диаз Риверос

Ово је прилично једноставан програм, користићемо библиотеку stdio.h како би могли добити информације и приказати их на терминалу. Можемо видети функцију која се зове return_input који генерише а буффер зове поредак, која има дужину од 30 бајтова (тип података цхар износи 1 бајт).

Функција gets(array); затражите информације путем конзоле и функције printf() враћа садржај низа и приказује га на екрану.

Сваки програм написан на језику Ц започиње функцијом main(), ово ће бити задужено само за позивање ретурн_инпут, сада ћемо компајлирати програм.

Сопствени. Цхристопхер Диаз Риверос

Узмимо мало оно што сам управо учинио. Опција -ggdb говори гцц-у да компајлира програм са информацијама за гдб да би могао правилно да отклони грешке. -fno-stack-protector То је опција коју очигледно не бисмо требали да користимо, али коју ћемо користити, јер би у супротном било могуће генерисати прелив бафера у стеку. На крају сам тестирао резултат. ./a.out само покреће оно што сам управо компајлирао, тражи информације и враћа их. Трчање 🙂

Упозорења

Још једна напомена овде. Можете ли да видите упозорења? јасно је да је то нешто што треба узети у обзир када радимо са кодом или компајлирамо, ово је помало очигледно и мало је програма који данас имају функцију gets() У коду. Једна од предности Гентоо-а је та што компајлирањем сваког програма видим шта може бити погрешно, „идеалан“ програм не би требало да их има, али изненадили бисте се колико великих програма има ова упозорења јер су само ВРЛО велика и велика је тешко их је пратити. опасне функције када истовремено има много упозорења. Сад ако наставимо

Отклањање грешака у програму

Сопствени. Цхристопхер Диаз Риверос

Сада овај део може бити помало збуњујући, али с обзиром на то да сам већ написао прилично мало, не могу си приуштити да све објасним, жао ми је ако видите да идем пребрзо 🙂

Разоружавање кода

Почнимо са гледањем нашег компајлираног програма за машински језик.

Сопствени. Цхристопхер Диаз Риверос

Ово је код наше главне функције у Монтажа, ово је оно што наш процесор разуме, линија лево је физичка адреса у меморији, <+ н> је познат као офсет, у основи удаљеност од почетка функције (главне) до те изјаве (познате као опцоде). Тада видимо врсту инструкције (пусх / мов / цаллк…) и један или више регистара. Сумирано, можемо рећи да је то индикација коју прате извор / порекло и одредиште. <return_input> односи се на нашу другу функцију, погледајмо.

Ретурн_инпут

Сопствени. Цхристопхер Диаз Риверос

Ово је мало сложеније, али само желим да проверите неколико ствари, постоји ознака која се зове <gets@plt> и један последњи опцоде који се зове retq означавајући крај функције. Ставићемо неколико тачака прекида, једну у функцију gets а друга у retq.

Сопствени. Цхристопхер Диаз Риверос

трчање

Сада ћемо покренути програм да видимо како акција почиње.

Сопствени. Цхристопхер Диаз Риверос

Видимо да се појављује мала стрелица која означава оптички код где смо, желим да узму у обзир правац 0x000055555555469b, ово је адреса након позива на return_input у функцији main , ово је важно јер се овде програм треба вратити када завршите са примањем улазни, уђимо у функцију. Сада ћемо проверити меморију пре уласка у функцију gets.

Сопствени. Цхристопхер Диаз Риверос

Вратио сам вам главну функцију и истакао сам код на који сам се позивао, као што видите, због крајност је подељен у два сегмента, желим да узму у обзир правац 0x7fffffffdbf0 (прва с лева после командоса x/20x $rsp) пошто је ово локација коју морамо користити за проверу резултата добијања, наставимо:

Кршење програма

Сопствени. Цхристопхер Диаз Риверос

Ја сам то истакао 0x44444444јер су они представљање наших ДС-а 🙂 сада смо почели да додајемо улазни програму, а као што видите, удаљени смо само два реда од жељене адресе, попуњаваћемо је док не стигнемо непосредно пре адреса које смо истакли у претходном кораку.

Промена повратне путање

Сад кад смо успели да унесемо овај одељак кода где означава повратак функције, хајде да видимо шта ће се догодити ако променимо адресу 🙂 уместо да одемо на локацију оптичког кода која следи ону коју смо имали малопре, шта мислите ако се вратимо return_input? Али за ово је неопходно да адресу коју желимо записујемо у бинарну датотеку, то ћемо урадити са функцијом printf од басх 🙂

Сопствени. Цхристопхер Диаз Риверос

Сад смо информације добили два пута 😀 сигурно програм није направљен за то, али успели смо да разбијемо код и учинимо да понови нешто што није требало.

Рефлецтионс

Ова једноставна промена се може сматрати а експлоатисати врло основно 🙂 успео је да прекине програм и уради нешто што ми желимо од њега.

Ово је само први корак на готово бесконачној листи ствари које треба видети и додати, постоје начини за додавање више ствари од једноставног понављања наруџбе, али овај пут сам написао много и све у вези са схеллцодинг Предмет је писати више од чланака, рекао бих комплетних књига. Жао ми је ако нисам успео да се мало више позабавим темама које бих волео, али сигурно ће бити шансе 🙂 Поздрав и хвала што сте дошли овде.


Оставите свој коментар

Ваша емаил адреса неће бити објављена. Обавезна поља су означена са *

*

*

  1. За податке одговоран: Мигуел Ангел Гатон
  2. Сврха података: Контрола нежељене поште, управљање коментарима.
  3. Легитимација: Ваш пристанак
  4. Комуникација података: Подаци се неће преносити трећим лицима, осим по законској обавези.
  5. Похрана података: База података коју хостује Оццентус Нетворкс (ЕУ)
  6. Права: У било ком тренутку можете ограничити, опоравити и избрисати своје податке.

  1.   КСНУМКСпКСНУМКС дијо

    Будите директнији. Пишите мање и фокусирајте се на оно што је важно

    1.    ЦхрисАДР дијо

      Здраво, хвала на коментару.

      Истину говорећи, пресекао сам добар део идеја, али и поред тога чинило ми се да је оставио минимум, тако да неко ко нема знање програмирања може да добије идеју.

      поздрави

      1.    анониман дијо

        Проблем је у томе што они који немају знање програмирања неће сазнати ни за шта јер је за почетак сувише сложено, али они који знају како да програмирају цене да су директнији.

        Претпостављам да не можете да дођете до свих, морате да изаберете и у овом случају сте згрешили желећи да покријете много тога.

        Иначе, кажем вам као конструктивна критика, волим ове теме и волео бих да наставите да пишете чланке, честитам!

    2.    анониман дијо

      Мислим исто.

      1.    ЦхрисАДР дијо

        Пуно хвала обома !! Свакако је тешко разумети како доћи до циљне публике када је истина да је број људи са напредним нивоом програмирања који читају ове чланке низак (бар се то може закључити на основу коментара)

        Свакако сам згрешио желећи да поједноставим нешто што захтева широку базу знања да би се разумело. Надам се да разумете да, с обзиром да тек почињем са блогањем, још увек нисам открио тачну тачку у којој моји читаоци знају и разумеју шта говорим. Тако би било много лакше рећи истину 🙂

        Покушаћу да будем краћи када то заслужује, без деперсонализације формата, јер је одвајање начина писања од садржаја мало компликованије него што се може замислити, бар сам их прилично повезао, али претпостављам да ћу на крају моћи за додавање линија уместо за резање садржаја.

        поздрави

  2.   марио дијо

    Где бисте могли да сазнате више о тој теми? Било која препоручена књига?

    1.    ЦхрисАДР дијо

      Пример који сам из приручника Схеллцодер добио Цхрис Анлеи, Јохн Хеасман, Фелик Линдер и Герардо Рицхарте, али да бих урадио 64-битни превод морао сам да научим о својој архитектури, приручник за програмере Интел, томови 2 и 3 су прилично поуздан извор за то. Такође је добро прочитати ГДБ документацију која долази са наредбом 'инфо гдб'. Да бисте научили Ассембли и Ц постоји много врло добрих књига, осим што су скупштинске књиге мало старе па постоји празнина коју треба попунити другом типска документација.

      Сам љуски данас из различитих разлога више није толико ефикасан, али је ипак занимљиво научити нове технике.

      Надам се да ће мало помоћи 🙂 Поздрав

  3.   Франз дијо

    Добар чланак, стари блог desdelinux поново се родио =)
    Када кажете да даљинска љуска није толико ефикасна, мислите на противмере дизајниране да ублаже нападе, они то називају увредљивом сигурношћу.
    Поздрав и тако настави

    1.    ЦхрисАДР дијо

      Хвала вам пуно, Франз, врло љубазне речи, заправо мислио сам да је Схеллцодинг данас много сложенији од онога што овде видимо. Имамо АСЛР (генератор случајне меморије) заштитника стека, разне мере и противмере које ограничавају број опкодова који се могу убризгати у програм, и то је само почетак.

      Поздрав,

  4.   Слободни софтвер дијо

    Здраво, хоћете ли урадити још један део ширећи тему? То је занимљиво

    1.    ЦхрисАДР дијо

      Здраво, тема је свакако прилично занимљива, али ниво сложености који бисмо заузели постао би веома висок, вероватно би укључивао велики број постова како би се објаснили разни предуслови за разумевање другог. Вероватно ћу писати о томе, али то неће бити следећи постови, желим да напишем неколико тема пре него што наставим са овим.

      Поздрав, и хвала на подели

  5.   кактус дијо

    Врло добар цхе! Доприносите сјајним постовима! Једно питање, започињем ову ствар о ИТ безбедности читајући књигу под називом „Осигуравање сигурности тестирањем оловке“. Да ли се препоручује ова књига? Како предлажете да почнем да се распитујем о овим питањима?

    1.    ЦхрисАДР дијо

      Поздрав кактусу, то је читав универзум о рањивостима, а други, истини за вољу, много зависе од тога шта вам привлачи пажњу и потреба које имате, ИТ менаџер не мора да зна исто што и тестер оловке, Или истраживач рањивости или форензички аналитичар, тим за опоравак од катастрофе има врло различит скуп вештина. Очигледно је да сваки од њих захтева другачији ниво техничког знања, препоручујем вам да почнете да откривате тачно оно што волите и почнете да прождирете књиге, чланке и друге, и што је најважније, вежбајте све што прочитате, чак и ако је застарело, то ће на крају донети разлику.
      Поздрав,

  6.   Еитзен дијо

    Здраво.
    Пуно вам хвала што сте објаснили ову тему, као и коментарисали да за додатне информације имамо "Тхе Схеллцодер'с Хандбоок". Већ имам читање ндинг