Како завирити у бинарне датотеке из Линук командне линије

Имате мистериозни фајл? Команда Линук датотеке брзо ће вам рећи о којој врсти датотеке се ради. Међутим, ако је то бинарна датотека, можете сазнати још више о њој. фајл има читав низ колега који ће вам помоћи да га анализирате. Показаћемо вам како да користите неке од ових алата.

Идентификовање типова датотека

Датотеке обично имају карактеристике које омогућавају софтверским пакетима да идентификују који је тип датотеке, као и шта подаци у њој представљају. Не би имало смисла покушавати да отворите ПНГ датотеку у МП3 музичком плејеру, тако да је корисно и прагматично да датотека са собом носи неки облик ИД-а.

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

Неки оперативни системи, као што је Виндовс, у потпуности су вођени екстензијом датотеке. Можете то назвати лаковерним или поверљивим, али Виндовс претпоставља да је било која датотека са екстензијом ДОЦКС заиста ДОЦКС датотека за обраду текста. Линук није такав, као што ћете ускоро видети. Жели доказ и гледа у фајл да га пронађе.

Алати описани овде су већ инсталирани на дистрибуцијама Мањаро 20, Федора 21 и Убунту 20.04 које смо користили за истраживање овог чланка. Започнимо нашу истрагу коришћењем команду датотеке.

Коришћење датотеке Цомманд

Имамо колекцију различитих типова датотека у нашем тренутном директоријуму. Они су мешавина документа, изворног кода, извршних и текстуалних датотека.

Команда лс ће нам показати шта се налази у директоријуму, а опција -хл (људски читљиве величине, дуга листа) ће нам показати величину сваке датотеке:

ls -hl

Хајде да пробамо фајл на неколико од ових и видимо шта добијамо:

file build_instructions.odt
file build_instructions.pdf
file COBOL_Report_Apr60.djvu

Три формата датотека су исправно идентификована. Где је могуће, фајл нам даје мало више информација. Пријављено је да се ПДФ датотека налази у верзија 1.5 формат.

Чак и ако преименујемо ОДТ датотеку тако да има екстензију са произвољном вредношћу КСИЗ, датотека је и даље исправно идентификована, како у претраживачу датотека тако и на командној линији помоћу датотеке.

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

file build_instructions.xyz

Коришћење датотеке на медијима, као што су сликовне и музичке датотеке, обично даје информације о њиховом формату, кодирању, резолуцији и тако даље:

file screenshot.png
file screenshot.jpg
file Pachelbel_Canon_In_D.mp3

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

file function+headers.h
file makefile
file hello.c

датотека исправно идентификује датотеку заглавља (.х”) као део збирке датотека Ц изворног кода и зна да је макефиле скрипта.

  Како поставити Фирејаил на Линук

Коришћење датотеке са бинарним датотекама

Бинарне датотеке су више „црна кутија“ од других. Датотеке слика могу да се прегледају, звучне датотеке могу да се репродукују, а датотеке докумената могу се отворити помоћу одговарајућег софтверског пакета. Бинарне датотеке су, међутим, већи изазов.

На пример, датотеке „хелло“ и „вд“ су бинарне извршне датотеке. Они су програми. Датотека под називом „вд.о“ је објектна датотека. Када компајлер компајлира изворни код, креира се једна или више објектних датотека. Они садрже машински код који ће рачунар на крају извршити када се заврши готов програм, заједно са информацијама за линкер. Линкер проверава сваки објектни фајл за позиве функција библиотекама. Повезује их са свим библиотекама које програм користи. Резултат овог процеса је извршна датотека.

Датотека „ватцх.еке“ је бинарни извршни фајл који је унакрсно компајлиран за покретање на Виндовс-у:

file wd
file wd.o
file hello
file watch.exe

Ако прво узмемо последњи, датотека нам говори да је датотека „ватцх.еке“ ПЕ32+ извршни, конзолни програм за к86 фамилију процесора у Мицрософт Виндовс-у. ПЕ је скраћеница за преносиви извршни формат, који има 32- и 64-битне верзије. ПЕ32 је 32-битна верзија, а ПЕ32+ је 64-битна верзија.

Све остале три датотеке су идентификоване као Извршни формат који се може повезати (ЕЛФ) датотеке. Ово је стандард за извршне датотеке и дељене објектне датотеке, као што су библиотеке. Ускоро ћемо погледати ЕЛФ формат заглавља.

Оно што би вам могло привући око је да су два извршна фајла („вд“ и „хелло“) идентификована као Линук стандардна база (ЛСБ) дељених објеката, а објектна датотека „вд.о” је идентификована као ЛСБ која се може преместити. Реч извршни је очигледна у њеном одсуству.

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

Ово омогућава да Рандомизација распореда адресног простора (АСМР) систем за учитавање извршних фајлова у меморију на адресама које он одабере. Стандардни извршни програми имају адресу за учитавање кодирану у заглавља, која одређују где се учитавају у меморију.

АСМР је безбедносна техника. Учитавање извршних датотека у меморију на предвидљивим адресама чини их подложним нападима. То је зато што ће њихове улазне тачке и локације њихових функција увек бити познате нападачима. Независне извршне датотеке (ПИЕ) позиционирани на насумичној адреси превазилазе ову осетљивост.

  Како инсталирати тему Ант ГТК на Линук-у

Ако смо ми саставити наш програм са гцц компајлером и обезбедимо опцију -но-пие, генерисаћемо конвенционални извршни фајл.

Опција -о (излазна датотека) нам омогућава да дамо име за наш извршни фајл:

gcc -o hello -no-pie hello.c

Користићемо датотеку на новом извршном фајлу и видети шта се променило:

file hello

Величина извршног фајла је иста као и раније (17 КБ):

ls -hl hello

Бинарни фајл је сада идентификован као стандардни извршни фајл. Ово радимо само у сврху демонстрације. Ако саставите апликације на овај начин, изгубићете све предности АСМР-а.

Зашто је извршна датотека тако велика?

Наш пример хелло програма је 17 КБ, тако да се тешко може назвати великим, али онда је све релативно. Изворни код је 120 бајтова:

cat hello.c

Шта је гомилање бинарне датотеке ако све што ради је штампање једног стринга у прозору терминала? Знамо да постоји ЕЛФ заглавље, али то је само 64-бајта за 64-битну бинарну датотеку. Очигледно, мора бити нешто друго:

ls -hl hello

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

strings hello | less

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

Тхе лдд команда показује нам зависности заједничког објекта бинарне датотеке:

ldd hello

Постоје три уноса у излазу, а два од њих укључују путању директоријума (први не):

линук-вдсо.со: Виртуелни динамички дељени објекат (ВДСО) је механизам кернела који омогућава приступ скупу рутина простора језгра бинарним датотекама корисничког простора. Ово избегава трошкове промене контекста из режима корисничког језгра. ВДСО дељени објекти се придржавају формата Екецутабле анд Линкабле Формат (ЕЛФ), омогућавајући им да буду динамички повезани са бинарним датотекама током времена извршавања. ВДСО се динамички додељује и користи предности АСМР-а. ВДСО могућност је обезбеђена стандардом ГНУ Ц библиотека ако кернел подржава АСМР шему.
либц.со.6: Тхе ГНУ Ц библиотека заједнички објекат.
/либ64/лд-линук-к86-64.со.2: Ово је динамички линкер који бинарни програм жели да користи. Динамички линкер испитује бинарни фајл да би открио које зависности има. Покреће те заједничке објекте у меморију. Он припрема бинарни фајл за покретање и може да пронађе и приступи зависностима у меморији. Затим покреће програм.

Тхе ЕЛФ Хеадер

Ми Можемо испитати и декодирати ЕЛФ заглавље користећи услужни програм реаделф и опцију -х (заглавље датотеке):

readelf -h hello

Заглавље нам се тумачи.

  Како приступити Гоогле диску на Линук-у

Први бајт свих ЕЛФ бинарних датотека је постављен на хексадецималну вредност 0к7Ф. Следећа три бајта су подешена на 0к45, 0к4Ц и 0к46. Први бајт је ознака која идентификује датотеку као ЕЛФ бинарну. Да би ово било кристално јасно, у следећа три бајта се наводи „ЕЛФ“. АСЦИИ:

Класа: Означава да ли је бинарни фајл 32- или 64-битни извршни фајл (1=32, 2=64).
Подаци: Указује на ендианнесс у употреби. Ендиан кодирање дефинише начин на који се вишебајтни бројеви чувају. У кодирању са великим ендиан-ом, број се прво чува са својим најзначајнијим битовима. Код малог ендиан кодирања, број се прво чува са најмањим битовима.
Верзија: Верзија ЕЛФ-а (тренутно је 1).
ОС/АБИ: Представља тип бинарни интерфејс апликације у употреби. Ово дефинише интерфејс између два бинарна модула, као што су програм и дељена библиотека.
АБИ верзија: Верзија АБИ-ја.
Тип: Тип ЕЛФ бинарног. Уобичајене вредности су ЕТ_РЕЛ за ресурс који се може премештати (као што је објектна датотека), ЕТ_ЕКСЕЦ за извршни фајл компајлиран са заставицом -но-пие и ЕТ_ДИН за извршни фајл који познаје АСМР.
Машина: Тхе архитектура скупа инструкција. Ово указује на циљну платформу за коју је бинарни фајл креиран.
Верзија: Увек постављено на 1, за ову верзију ЕЛФ-а.
Адреса улазне тачке: меморијска адреса у бинарном систему на којој почиње извршавање.

Други уноси су величине и бројеви региона и секција унутар бинарне датотеке, тако да се њихове локације могу израчунати.

Брзо завирите у првих осам бајтова бинарне датотеке са хекдумпом ће приказати бајт потписа и стринг „ЕЛФ“ у прва четири бајта датотеке. Опција -Ц (канонска) нам даје АСЦИИ приказ бајтова заједно са њиховим хексадецималним вредностима, а опција -н (број) нам омогућава да одредимо колико бајтова желимо да видимо:

hexdump -C -n 8 hello

објдумп и грануларни приказ

Ако желите да видите детаљне детаље, можете да користите наредбу објдумп са опцијом -д (растави):

objdump -d hello | less

Ово раставља извршни машински код и приказује га у хексадецималним бајтовима заједно са еквивалентом асемблерског језика. Локација адресе првог поздрава у сваком реду приказана је крајње лево.

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

Састављање и повезивање

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

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