воскресенье, 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 скрипту под катом