Дизассемблеры в Linux

Дизассемблирование Linux

В предыдущей статье мы рассматривали использованию отладчика GDB. Продолжим тему отладки и рассмотрим дизассемблирование в Linux.

Еще по теме: Удаленная отладка вредоносных программ

Дизассемблирование в Linux

Штат­ным дизас­сем­бле­ром в Linux явля­ется ути­лита objdump. Ском­пилиру­ем при­мер HelloWorld:

Ис­поль­зуем для это­го коман­ду

И сра­зу дизас­сем­бли­руем исполня­емый файл сле­дующей коман­дой, перенап­равив вывод в файл, потому что он получит­ся длин­ным:

В парамет­ре -M ука­зыва­ется архи­тек­тура, для которой обра­баты­вает­ся файл. Зна­чени­ями могут выс­тупать кон­крет­ные архи­тек­туры (x86-64, i386, i8086) или, как в дан­ном слу­чае, син­таксис ассем­бле­ра — intel,att. Вто­рое зна­чение опре­деля­ет син­таксис AT&T. Параметр -d ука­зыва­ет на то, что надо дизас­сем­бли­ровать весь файл.

По­лучим такой дизас­сем­блер­ный лис­тинг (при­веде­но с сок­ращени­ями):

Ис­полня­емый файл для Linux — ELF-файл — содер­жит отличные от PE-фай­ла сек­ции. Но сек­ция с име­нем .text игра­ет важ­ную роль — содер­жит исполня­емый код. Обра­ти вни­мание: в выведен­ном objdump дизас­сем­блер­ном коде роль сим­вола начала ком­мента­рия игра­ет решет­ка — #. Фун­кция _start под­готав­лива­ет сре­ду выпол­нения перед вызовом main. А в пос­ледней про­исхо­дит под­готов­ка и вывод стро­ки на экран. Меж­ду тем objdump смог опре­делить имя единс­твен­ной фун­кции — main.

Типы дизассемблеров

Что пред­став­ляет собой objdump? Вро­де он неп­лохо спра­вил­ся со сво­ей задачей. Но задача эта была самая эле­мен­тарная! Мы ее при­вели лишь для того, что­бы оце­нить спо­соб­ность дизас­сем­бле­ра прев­ращать нолики и еди­ницы в ассем­блер­ные инс­трук­ции. Тем не менее, если бы у нас была прог­рамма с условны­ми перехо­дами, цик­лами и вызова­ми фун­кций, резуль­тат бы не был нас­толь­ко иде­аль­ным!

А все потому, что objdump — линей­ный дизас­сем­блер. Он прос­то переби­рает все сег­менты кода в дво­ичном фай­ле, декоди­руя и пре­обра­зуя их в коман­ды. Подоб­ным обра­зом ведет себя боль­шинс­тво прос­тых дизас­сем­бле­ров. Проб­лемы могут воз­никнуть в тот момент, ког­да вмес­то кода дизас­сем­блер встре­тит дан­ные. И, находясь в пол­ном неведе­нии, пре­обра­зует их в ассем­блер­ные мне­мони­ки. Хуже того, ког­да блок дан­ных закон­чится, дизас­сем­блер оста­нет­ся в рас­син­хро­низо­ван­ном сос­тоянии отно­ситель­но текуще­го кода. Хорошо хоть, что ско­ро он все рав­но вой­дет в колею бла­года­ря спе­цифи­ке кода на плат­форме x86.

Ина­че ведут себя рекур­сивные дизас­сем­бле­ры. Они учи­тыва­ют поток управле­ния, дру­гими сло­вами, во вре­мя ана­лиза бинар­ника они про­гоня­ют прог­рамму на собс­твен­ном вир­туаль­ном про­цес­соре, дизас­сем­бли­руя код, попада­ющий­ся на пути. Этот под­ход показы­вает в точ­ности такой код, который выпол­няет­ся физичес­ким про­цес­сором. Безус­ловно, этот метод поз­воля­ет избе­жать декоди­рова­ния дан­ных, потому что про­цес­сор в здра­вом уме их не выпол­няет!

К рекур­сивным дизас­сем­бле­рам отно­сит­ся мно­го раз выручав­шая нас IDA Pro. Ког­да она встре­чает дан­ные, она переда­ет управле­ние челове­ку, потому что вос­ста­нов­ление пер­воначаль­ного вида дан­ных оста­ется нерешен­ной тех­ничес­кой задачей. Речь идет о слож­ных типах дан­ных: о мас­сивах, струк­турах и клас­сах. Оди­нокую перемен­ную (или нес­коль­ко перемен­ных) IDA рас­кусит без тру­да и без помощи челове­ка.

Меж­ду тем рекур­сивные дизас­сем­бле­ры тоже могут стра­дать дет­ски­ми болез­нями. Нап­ример, не каж­дый поток управле­ния лег­ко прос­ледить. В силу сво­ей ста­тичес­кой при­роды дизас­сем­бле­рам быва­ет слож­но обна­ружить адре­са кос­венных перехо­дов или вызовов под­прог­рамм. Тог­да в бой всту­пают раз­ные эвристи­чес­кие механиз­мы под кон­крет­ные ком­пилято­ры. Но это тема отдель­ного раз­говора.

В пос­ледние годы в Linux осо­бое мес­то занима­ют дизас­сем­бле­ры Radare2 и Ghidra. Оба пред­став­ляют собой бес­плат­ные про­дук­ты с откры­тым исходным кодом. Пер­вый появил­ся на свет в 2006 году, тог­да еще в качес­тве дис­кового редак­тора. Сей­час это мно­гофун­кци­ональ­ный инс­тру­мент хакера. Ghidra — ори­енти­рован­ный на спе­цов дизас­сем­блер, раз­работан­ный Агентством наци­ональ­ным безопас­ности США и выпущен­ный на прос­торы интерне­та в 2019 году как ответ несок­рушимой IDA Pro. Мы под­робнее погово­рим об этих инс­тру­мен­тах в сле­дующий раз.

ПОЛЕЗНЫЕ ССЫЛКИ:

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *