воскресенье, 27 февраля 2011 г.

читаемые книжки

походу меня проклял кто-то - последние три недели попадалось читать исключительно всякий не первой свежести отстой. Воображение живо рисует некоторых сотрудников kl, проводящих обряд пульса-де-нура в своей бане, хе-хе

Writing Security Tools and Exploits 2005 года
Довольно старая уже книжка (и соотв-но большинство приведенных примеров эксплойтов давно протухли и разложились на плесень и на липовый мёд), но в определенных кругах считается классикой и все такое.
При чтении никак не могу отделаться от ощущения, что читателя держат за полного дебила системный подход авторам не ведом в принципе. Вот например в главе 6 мельком описываются race conditions и следом идет case study - про древнюю уязвимость в man, связанную с неправильным input validation. Дико логично, ага
Или вот в главе 4 довольно подробно излагаются основы использования heap corruption. А вот нет - мало ли, может вы плохо материал усвоили - потому в главе 7 тот же материал излагается по второму кругу с использованием передовой технологии сopy & paste. Но и этого авторам показалось мало - потому сразу после самоповтора в качестве case study предлагается cve-2002-0639, которая к повреждению хипа никакого отношения не имеет
Например если б я был 15 летним прыщавым подростком с горящими глазами и диким желанием научится хакать всякое - после прочтения подобных книжек я думаю желание бы сильно поубавилось. Кто знает - возможно это и было одной из настоящих целей авторов
Кроме того традиционно у авторов проблемы с арифметикой:
The register_tap_listener function is called.It takes five parameters:
extern GString *register_tap_listener(char *tapname, void *tapdata, char *fstring, tap_reset_cb tap_reset, tap_packet_cb tap_packet, tap_draw_cb tap_draw);
Я лично насчитал 6 аргументов. А сколько видите вы например ?

Perl Hacks 2006 года
Я много уже книжек по perl прочел, и по моему нескромному мнению эта - одна из самых неудачных. Просто сборник малосвязанных между собой рецептов, большая часть из которых либо тривиальна, либо описывает один конкретный модуль с cpan, либо применима исключительно для дико чуждых пользователям windows vim & emacs. Пока что из прочитанных 36 hacks более-менее полезными показались ровно полтора. Отвратительно

Parallel and Distributed Programming Using C++
Вольтер однажды заметил что Священная Римская Империя не была ни священной, ни римской, ни империей.
С этой книжкой аналогичный случай - она не про parallel, ни про distributed, ни про programming, ни про using c++
Граждане авторы с подозрительно одинаковыми фамилиями с бухгалтерской скрупулезностью пересказывают man для всех ф-ций libc, связанных с управлением процессами, потоками и т.д. и т.п. Как это поможет научиться писать всякое параллельное - мне неведомо совершенно. Думаю что от таких книжек нужно держаться как можно дальше - man у меня и так под рукой всегда есть

пятница, 25 февраля 2011 г.

размер программ под win 64

а вот например поскольку писать особо не о чем сорцы одной из моих программ превысили сегодня некий психологически важный барьер в 2 Mb, то решил я посмотреть, сколько одна и та же версия программы занимает под 32 и 64 бита.
Прога - ничего особенного, обычный сетевой сервер, сделанный в виде windows service. Принимает всякое, обрабатывает в несколько потоков, отдает дальше. Из системных библиотек кроме обычного набора используются только winsock & rpcrt4. asm вставок нет, потому перенос на 64бита был относительно простым. Собрано на visual studio 2008 со статически слинкованным runtime.
В табличке приведен VirtSize per section и соотношение между размерами 64 и 32битных версий
Имя секциииwin32win64Ratio
.text101550513125861.29
.rdata5704267207181.26
.data3119323554401.14
.reloc79806271020.34
Отсюда можно заметить всякое интересное
Например в 64битной версии релоки (прога слинкована с поддержкой aslr) значительно меньше - подозреваю, что все они для релоцирования данных, ибо адресация относительно RIP минимизирует их использование в коде.
Кроме того под 64бита все обработчики исключений лежат в отдельной секции .pdata - еще + 59124 байт. Забавно что из содержимого .pdata можно точно установить адреса и размеры по крайней мере ф-ций, содержащих exception processing
Общий итог - прога под 64бита весит на 25% больше 32битного аналога. Подозреваю что для любых более-менее больших программ это соотношение должно быть примерно таким всегда.
Интересно также что при работе 64битная версия стабильно использует памяти на 35-40% больше при одинаковых нагрузках и числе клиентов

четверг, 24 февраля 2011 г.

tracking used perl modules

а вот оказывается в perl в переменную @INC можно добавить указатель на ф-цию, которая будет в таком случае вызываться каждый раз при разрешении используемого модуля.
Примерчик использования:
perl -Mpresolve my_cewl_script_do_it_all_now.pl
Результаты:

BEGIN
{
        require( $INC{'constant.pm'} = 'C:/Perl/lib/constant.pm' );
        require( $INC{'warnings/register.pm'} = 'C:/Perl/lib/warnings/register.pm
' );
        require( $INC{'FindBin.pm'} = 'C:/Perl/lib/FindBin.pm
' );
        require( $INC{'Cwd.pm'} = 'C:/Perl/lib/Cwd.pm
' );
        require( $INC{'base.pm'} = 'C:/Perl/lib/base.pm
' );
        require( $INC{'Config.pm'} = 'C:/Perl/lib/Config.pm
' );
        require( $INC{'File/Basename.pm'} = 'C:/Perl/lib/File/Basename.pm
' );
        require( $INC{'re.pm'} = 'C:/Perl/lib/re.pm
' );
        require( $INC{'File/Spec.pm'} = 'C:/Perl/lib/File/Spec.pm
' );
        require( $INC{'vars.pm'} = 'C:/Perl/lib/vars.pm
' );
        require( $INC{'File/Spec/Win32.pm'} = 'C:/Perl/lib/File/Spec/Win32.pm
' );
        require( $INC{'File/Spec/Unix.pm'} = 'C:/Perl/lib/File/Spec/Unix.pm
' );
        require( $INC{'Exporter/Heavy.pm'} = 'C:/Perl/lib/Exporter/Heavy.pm
' );
        require( $INC{'lib.pm'} = 'C:/Perl/lib/lib.pm
' );
        require( $INC{'Getopt/Std.pm'} = 'C:/Perl/lib/Getopt/Std.pm
' );
}
1;

Вычитано в маловразумительном наборе рецептов книжке perl hacks
Исходник лоховского сделанного на коленке модуля presolve.pm под катом

VfOrderDependentThunks & VfPoolThunks

вдогон еще по паре таблиц под каждую версию windows

VfRegularThunks

а вот например списки ф-ций, которые driver verifier перехватывает при загрузке подопытного драйвера (не надо тока учить меня гуглом пользоваться - ничего не находится по теме)

среда, 23 февраля 2011 г.

oids.idc

продолжаем дописывать всякое полезное для IDA Pro
На сей раз мне пришлось озаботиться импортом в idc NDIS OIDs, которые определены в wdk аж в трех файлах:
  • inc\api\ntddndis.h
  • inc\api\wimax.h
  • inc\api\windot11.h
Соотв-но для получения наиболее полного результата все три нужно скормить perl скрипту под катом

вторник, 22 февраля 2011 г.

Hex-Rays Newsletter

пришло давеча - рассказывают всякое про новую версию ida pro
Есть пара угарных моментов:
Disassembler module for Android's Dalvik VM bytecode and loaded for .DEX files (contributed by our user)
Вот этим небось
New processor module for SPU (Cell Broadband Engine Synergistic Processor Unit).
Вот отсюда небось
If time permits, we will introduce basics of source level debugging. It will be possible to 'source debug' the code generated by the decompiler
Долго думал но так и не понял зачем это может быть нужно хотя бы теоретически

Полезных вещей imho ровно две:
Bochs debugger for x64 code
Надеюсь можно будет буткиты 64битные нормально отлаживать трейсить
IDA debugger will become multithreaded itself, to increase the debugging speed
Посмотрим, хотя верится с трудом канешна

воскресенье, 20 февраля 2011 г.

универсальные комменты

в связи с набиганием за последние пару месяцев всяких странных персонажей решил сделать каталог ответов на их нечленораздельное мычание
1. "Причины, доводящие человека с нормальным половым ощущением и психически здорового до педерастии, могут быть крайне разнообразны"
Рихард фон Крафт-Эбинг
2. вам здесь не рады:
3. вы несете хуйню неадекватны
4. Слив защитан
Думаю четырех будет вполне достаточно. Следите за рекламой

суббота, 19 февраля 2011 г.

пятница, 18 февраля 2011 г.

линуксоиды прозрели

спустя 20 лет всего лишь решили завести список поддерживаемого железа
обычный глум оставим, ибо дело полезное тащемта

четверг, 17 февраля 2011 г.

CIFS Browser Protocol Heap Corruption

думаю все уже видели
ms всячески оправдывается
грустно, да, особенно учитывая что их собственный wlk по идее обязан находить подобное

partial structs matcher

У меня довольно часто возникает необходимость отреверсить всякие разные структуры данных. Учитывая что я крайне ленив и например часть структур может быть уже есть в раздаваемых империей добра microsoft pdb файлах - возникла идея написать некую прогу, которой можно было бы дать pdb (ну или выход pdbdump) и всякие разные критерии, по которым она бы сама нашла всех подходящих кандидатов
Немного подумав список критериев можно сократить до:
  1. Размер структуры - равен в точности X, меньше X или больше X
  2. Тип поля по некоторому смещению. Является указателем, имеет длину X, предположительно имеет тип Y etc
Соотв-но был написан простой perl package, точнее даже 3, которые умеют делать следующие вещи:
  • pdbparse.pm - собственно парзить файл, полученный из pdb с помощью pdbdump
  • pdbiter.pm - строить ленивые итераторы с учетом критериев поиска
  • lazylist.pm - просто реализация ленивых списков, потыренная из книжки Higher-Order Perl
Например я хочу найти список структур, у которых первое поле (по смещению 0) предположительно является LIST_ENTRY, поле по смещению 0x38 - указатель (неважно на что), а общий размер структуры не меньше 0x100 байт.
Получается примерно такой адовый кусок кода:
my $iter = off_cond(
     off_cond(
       size_cond(plain_iter($res), sub { return ($_[0] >= 0x100); }),
        0x0, sub { my $aref = shift; return $aref->[2] =~ /LIST_ENTRY/ } ),
        0x38, sub { my $aref = shift; return $aref->[3]; }
)
Пройдясь этим итератором по pdb от vista 64 бита мы получим ровно три структуры, отвечающие всем заданным критериям поиска:
  • _KALPC_MESSAGE
  • _ALPC_PORT
  • _ETW_GUID_ENTRY
Исходный код всех трех запчастей под катом. Слабонервным питонщикам и беременным лучше этого не видеть, бгг

Data::Dumper

давеча потребовалось мне распечатать (в отладочных целях само-собой) связный список на perl - каждый элемент списка является указателем на hash, где поле next указывает на следующий элемент. Список причем был не особо длинный - меньше полутора тысяч элементов

Дык вот subj например сожрал 2 гига памяти и свалился с бодрым сообщением Out of memory!
Отвратительно

среда, 16 февраля 2011 г.

wingdb

а вот например люди сделали человеческий интерфейс к ужасному gdb в виде плагина к лучшей в мире среде разработки - visual studio
Можно наконец отлаживать всякое в гнусном linuxе не вылазя из привычной IDE (поддерживает 2005, 2008 и 2010)
Работает через обычный ssh
Из недостатков замечены ровно два:
  1. стоит 59$
  2. дизассемблер все равно остался в нечитаемом at&t формате
Огромный шаг вперед ящетаю

вторник, 15 февраля 2011 г.

добавил вердикт

сегодня под скромным названием isus
сокращение от InstallShield Update Service
ничего святого, бгг

ntstatus.idc

а вот оказывается даже относительно свежие версии ida pro не содержат в качестве enum много всяких значений NTSTATUS
соотв-но пришлось озаботиться и смастерить на perl парзер файла заголовков ntstatus.h от wdk и конвертор в idc
Исходный код под катом

четверг, 10 февраля 2011 г.

школа злословия

заценил тут subj c одним известным персонажем
очень грустно
обе стороны полные идиоты гордые носители альтернативного мышления

ведущие например уверяют что сроду ни за что в инете не платили (воображение живо рисует чемоданы с чорным налом под кроватью - генетическая память о погромах, понемаем), спрашивают человека, который большую часть года просирает бабло в куршавелях на формуле 1, о каких-то сугубо местечковых жупелах - хороших еврейских мальчиках, подохших в турме (надо же - они не в курсе что люди мрут не только от мигалок например) и прочее в том же духе. Особенно мне понравилось утверждение "человеческая натура не меняетца никогда". Рекомендую отправить их за 101 километр в глухую деревню на полгода без электричества и с сортиром во дворе тащемта - что-то мне подсказывает что через полгода их будет сложно узнать например, бгг

вторая сторона тоже была ацки уныла - давайте заведем еще одних сторожей например меня и будем у всех паспорт спрашивать, а то будет как в иране, ага-ага. Ацкий анальный батхёрт от недавно просранных исходников собственного продукта, понемаем.
Кстати, я был неправ - страшилки у него меняются со временем. Теперь он пугает тем что без продукта имени себя инторнета всякие отсталые племена северной нигерии африки останутся без гуманитарной помощи например, бгг
Еще был несказанно удивлен что обошлось без обычных наездов на eset. Волнуюсь, не заболел ли персонаж, не пожидел ли стул там или импотенция близка как никогда тонус упал например. Ведь как можно было забыть !

Кровожадный дебил В.И. Ленин по крайней мере в одном был прав - "Интеллигенция - это говно нации"

я давно догадывался !

взрослых россиян в онлайн-пространстве примерно в три раза меньше, чем детей
отсюда

среда, 9 февраля 2011 г.

USB autorun attacks against Linux

я надеюсь все уже читали
нет такой сугубо виндовой уязвимости, которую бы тоталитарная секта имени Торнвальдса старательно не воспроизвела в своей поделке

а как сюда математические формулы вставлять

со всякими символами типа пересечения множеств и проч ? Вот например копирую я всякое умное из pdf - и вместо всяких греческих букв, индексов и прочих стандартных математических знаков и операций вижу только совершенно одинаковые знаки вопроса
это все патамушта кровожадный педераст боженька ненавидит меня ялузир, да ?

вторник, 8 февраля 2011 г.

угарная телега

про аутсорсинг в ведомостях
ржал как подорванный
Update: нам тут очевидцы подают знаки что статья про дойче банк например

NtTraceControl

если зрение меня не обманывает прототип выглядит примерно так:

NTSYSAPI
NTSTATUS
NTAPI
NtTraceControl(IN CtrlCode, IN PVOID InputBuffer, IN ULONG InputBufferLength,
OUT PVOID OutputBuffer, ULONG OutputBufferLength, PULONG ReturnLength
);

воскресенье, 6 февраля 2011 г.

Why Programs Fail. A Guide to Systematic Debugging

отличная книжка например - в ней прекрасно все кроме попсового названия (честно говоря из-за названия я едва не решил ее не читать вовсе - думал что это очередной сборник малосвязанных паттернов типа Memory Dump Analysis Anthology)
Автор с переменным успехом скрупулезно описывает инструменты и техники, позволяющие максимально автоматизировать процесс нахождения источников ошибок. Правда многие инструменты либо маргинальны (т.е. далеко не mainstream), либо требуют кучи ресурсов, либо применимы только в ограниченном числе случаев.

Вот например в главе 13.6 описывается fuzzer для планировщика потоков под названием dejavu (Java only). Для отладки весьма небольшого куска кода (733 строки, если выкинуть все не относящееся к делу - 6 строчек) получается 3.8 миллиарда различающихся состояний. Хотя и утверждается что алгоритм O(log) и автоматически нашел комбинацию исполнения потоков, приводящую к ошибке, всего за 50 тестов - у меня есть обоснованные сомнения что это хорошо будет масштабироваться на более-менее реальных примерах. C другой стороны подобный scheduling fuzzer был бы ацки полезен для нахождения race conditions

Глава 7 содержит очень полезные техники для статического анализа кода, а также его фундаментальные ограничения.
Глава 10 посвящена разнообразным динамическим проверкам - от обычного assert до valgrind & purify

Перечислю инструменты, показавшиеся мне особенно полезными:
  • FAUMachine is a virtual machine specifically built for testing purposes. Among others, the FAUMachine allows you to control the entire virtual machine via scripts
  • codesurfer - анализатор исходников, умеющий показывать пути в графе codeflow, где переменная изменяется и где используется
  • ODB - т.н. omniscient debugger. Способен прокрутить сохраненное состояние отлаживаемой программы как вперед, так и назад, с любого момента
  • tarantula - для визуализации исполнившихся кусков кода, отличающихся при нормальном и содержащем дефект запусках

пятница, 4 февраля 2011 г.

как правильно пугать

наслаждайтесь - Javocalypse
а то некоторые уже до седых волос дожили и все повторяют страшилки про смерть инторнета.
Нет шоп чо поновее-пореалистичнее придумать,бгг

четверг, 3 февраля 2011 г.

EtwEventRegister

а вот например как всем давно известно функция EventRegister является просто forwarded to ntdll!EtwEventRegister. Соотв-но после некоторого анализа ее кода в ntdll можно написать инструмент сомнительной полезности, показывающий какие события зарегистрированы в некотором процессе

среда, 2 февраля 2011 г.

неизвестный закон природы

похоже что наиболее эффективный многопоточный код является одновременно и наименее интуитивно понятным. Некоторые заявляют даже что непонятным человеку в принципе
Навеяло чтением всяких книжек про многопоточные алгоритмы