Запуск Windows-приложений под Linux c помощью CrossOver Office Часть 2 Андрей Бешков [AINF0008\\0.map] 1069188705 "008cc782b199a527"=",33,HKCR,Interface\\{56a868b5-0ad4-11ce-b03a-0020af0ba770}\\Distributor,,"i "140e1cba790e4932"=",33,HKLM,Software\\Microsoft\\Multimedia\\DirectXMedia,.Prog," # Имя виртуального диска. В данном случае это диск A: [Drive A] # Путь к директории, которая хранит в себе файлы. По умолчанию # скрипт инсталляции вписывает сюда директорию /mnt/floppy/, # но для меня это не подходит в связи с тем, что в моей # системе работает демон autofs, который монтирует устройство # дисковода /dev/floppy в директорию /mnt/floppy/auto/. # Поэтому пришлось поправить путь вручную. "Path" = "/mnt/floppy/auto" # Тип устройства. Думаю, всем понятно, что для Windows оно # будет выглядеть как гибкий диск. Эта переменная может # принимать значения hd, cdrom, network, floppy соответственно # обозначающие жесткий диск, CD-ROM, сетевая папка, # гибкий диск. "Type" = "floppy" # Метка тома. Обычно нужна только для программ, которые # пытаются защищаться от копирования с помощью чтения этой # метки. "Label" = "Floppy A" # Имя физического устройства обычно используется для # низкоуровневого чтения и записи. Эту опцию можно применять # только к гибким дискам и CD-ROM. # Если попытаться применить такую опцию к любому другому # устройству, то результаты будут очень неприятные. # Низкоуровневая запись скорее всего повредит родную UNIX # файловую систему. "Device" = "auto" # Описание диска С: [Drive C] "Path" = "fake_windows" # Судя по типу устройства, Windows будет считать, что это # жесткий диск. "Type" = "hd" "Label" = "fake_windows" # Тип файловой системы, поведению которой Wine будет # подражать. Может принимать значения: win95, msdos, unix. # Соответственно в случае опции win95 эмулируемая система будет # думать, что это FAT32 с поддержкой длинных имен. Регистр # символов в именах файлов не различается. Если использовать # тип msdos, то на имена файлов накладывается ограничение, # соответствующее файловой системе MS-DOS. Опция unix # отображает файловую систему точно так же, как она выглядит # для UNIX. Эта опция практически не применятся, так как # Windows не умеет работать с такими файловыми системами. "Filesystem" = "win95" # Опция, отвечающая за перекодирование имен файлов # и директорий в родную кодировку. "Codepage" = "0" # Описание диска M: [Drive M] # Это первый CD-ROM в системе. Как обычно, из-за демона # autofs пришлось поменять путь с /mnt/cdrom на /mnt/cdrom/auto "Path" = "/mnt/cdrom/auto" "Type" = "cdrom" "Label" = "CD-ROM M" "Filesystem" = "win95" "Device" = "auto" # Описание диска N: [Drive N] # Второй CD-ROM. Все установки сделаны аналогично диску M. "Path" = "/mnt/cdrom1/auto" "Type" = "cdrom" "Label" = "CD-ROM N" "Filesystem" = "win95" "Device" = "auto" # Описание диска Y: [Drive Y] # Здесь в качестве диска Y монтируется домашняя директория # пользователя. "Path" = "%HOME%" # А вот такой тип устройств в стандартном Wine не встречается, # он характерен только для CrossOver Office. Впрочем, для Windows # это устройство все равно выглядит, как обычный жесткий диск. "Type" = "%CXOFFICE_DRIVE_TYPE_HACK%" "Label" = "Home" "Filesystem" = "win95" "Codepage" = "0" # Описание диска Z: [Drive Z] # А тут монтируется корень всей файловой системы. "Path" = "/" "Type" = "%CXOFFICE_DRIVE_TYPE_HACK%" "Label" = "Root" "Filesystem" = "win95" "Codepage" = "0" [wine] # Имена системных директорий "Windows" = "c:\\Windows" "System" = "c:\\Windows\\system" "Temp" = "c:\\Windows\\Temp" # Системная переменная PATH указывает, где и в каком порядке # загружаемые программы должны искать необходимые для работы # библиотеки и утилиты. "Path" = "c:\\Windows;c:\\Windows\\system;y:\\" # Данная опция указывает, где должны храниться пользовательские # профили, но в связи с тем, что у нас всего один пользователь, # она никогда не используется и поэтому закомментирована. ;;"Profile" = "c:\\Windows\\Profiles\\Administrator" # Какую графическую подсистему нужно использовать для рисования # экранных объектов. "GraphicsDriver" = "x11drv" # Должны ли Windows-программы видеть файлы, у которых первым # символом имени является точка. Обычно такие файлы считаются # скрытыми. ;;"ShowDotFiles" = "1" # Можно ли показывать символические ссылки на директории? # Обычно это приводит к зависанию Windows-программ, # пытающихся делать рекурсивный обход директорий. Чаще всего # в эту ловушку попадаются разнообразные автоматические # инсталляторы. ;;"ShowDirSymlinks" = "1" # Указание на скрипт, отвечающий за создание и установку # правильных иконок для Windows-программ внутри вашего оконного # менеджера. В качестве менеджеров, к примеру, могут выступать # GNOME, KDE или CDE. "ShellLinker" = "wineshelllink" # Программа, отвечающая за создание и обслуживание меню # программ оконного менеджера "LinkProcessor" = "winemenubuilder.exe" # Тут находятся иконки. Кстати, стоит отметить, что # для удобства обращения они автоматически конвертируются # из формата ico в xpm. "IconsDir" = "c:\\Windows\\Icons" # Ну а здесь лежит библиотека, отвечающая за работу # с FreeType-шрифтами. "FreeTypeLib" = "libcxfreetype.so" [Restart] # Программа по идее должна отвечать за перезагрузку Windows. # Интересно, что такого файла на диске не существует. # А его функции выполняет скрипт /opt/cxoffice/bin/cxreboot. # Видимо, кто-то из разработчиков допустил тут ошибку. "Boot" = "c:\\Windows\\System\\reboot.exe" # [wineconf] [Version] # Какую версию Windows должен имитрировать эмулятор? # Опция может принимать значения: win95, win98, winme, nt351, # nt40, win2k, winxp, win2k3, win20, win30, win31. Некоторые # программы будут работать только под определенной версией. "Windows" = "win98" # Версия MS-DOS. Нужна для некоторых старых программ. ;;"DOS" = "6.22" [DllOverrides] "ole2" = "native, builtin" "ole2nls" = "native, builtin" "*comctl32" = "builtin" "*ICWCONN1.EXE" = "builtin" "*IEINFO5.OCX" = "builtin" [x11drv] # Количество цветов, выделяемых из системной палитры для нужд # Windows-программ. Действует только в том случае, когда # графическая подсистема работает в режиме глубины цвета # 8 бит на один пиксель или 256 цветов. "AllocSystemColors" = "100" "PrivateColorMap" = "N" # Пытаться ли использовать более медленные операции вместо # быстрых для улучшения качества отрисовки. Лично мне # показалось, что в большинстве случаев разница не будет заметна. "PerfectGraphics" = "N" # Указывает, какую глубину цвета необходимо использовать. # Имеет смысл только для дисплеев, умеющих работать в режиме # multi-depth. По умолчанию отключено, так как используется # крайне редко. ;;"ScreenDepth" = "16" # Имя дисплея, на который нужно выводить графику. ;;"Display" = ":0.0" # Данная опция показывает, разрешено ли оконному менеджеру # управлять окнами Wine "Managed" = "Y" # В случае если предыдущая опция активирована, можно ли # позволить менеджеру рисовать рамки окон и прочие элементы. # Эти две опции улучшают интеграцию эмулируемого приложения # с остальными программами, но не все задачи могут нормально # работать в таком режиме. ; WMFrames = "Y" # Данный режим выступает конкурентом для двух предыдущих опций # и позволяет работать Wine так, словно это не просто окно, # а виртуальный десктоп. Соответственно все Windows-приложения # будут рисовать свои окна только внутри этого десктопа, так как # им это больше всего подходит. За управление окнами внутри # виртуального десктопа отвечает Wine. Такой режим позволяет # избежать взаимодействия Windows-приложений с системным # оконным менеджером, поэтому он наиболее совместим c моделью # рисования, используемой настоящей Windows. ;;"Desktop" = "640x480" # Нужно ли, чтобы приложения, работающие с DirectDraw, могли # воспользоваться преимуществами работы с графической подсистемой # в режиме DGA (XFree86 Direct Graphic Architecture). Обязательно # убедитесь, что у вас есть доступ к устройству /dev/mem "UseDGA" = "Y" # Если с DGA поработать не получилось, то можно попробовать # заставить DirectX использовать разделяемую память для обмена # данными с видеоподсистемой. Конечно, это будет работать # медленнее, чем DGA, но все же быстрее, чем применяемый # стандартно обмен данными с X11 через сокет. "UseXShm" = "Y" # Разрешение использовать для отрисовки режим XVideo "UseXVidMode" = "Y" # Улучшенное управление окном, получившим фокус ввода. "UseTakeFocus" = "Y" # Опция для включения продвинутого способа контроля за мышью. # Очень полезна для приложений, использующих DirectX "DXGrab" = "N" # Включает двойную буферизацию окна, в котором отрисовывается # десктоп. Применяется только вместе с опцией Desktop, описанной # выше. Очень помогает при работе с приложениями, интенсивно # использующими OpenGL . "DesktopDoubleBuffered" = "N" # Номер порта для режима XVideo. Нужно использовать только в # случае, если у нас несколько портов. ;; "XVideoPort" = "43" # Опция, указывающая, нужно ли работать в синхронном режиме. # Обычно используется для отладки проблем с X11. ;;"Synchronous" = "Y" [serialports] "Com1" = "/dev/ttyS0" "Com2" = "/dev/ttyS1" "Com3" = "/dev/ttyS2" "Com4" = "/dev/modem" [parallelports] "Lpt1" = "/dev/lp0" [spooler] "FILE:" = "tmp.ps" "LPT1:" = "|lpr" "LPT2:" = "|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q -" "LPT3:" = "/dev/lp3 [Tweak.Layout] "WineLook" = "Win95" $ iconv -f cp-1251 -t utf-8 $HOME/.menu/cxoffice > $HOME/.menu/cxoffice $ update-menus –n –u #cabextract IE_S1.CAB IE_S2.CAB IE_S3.CAB А ты что видишь? Удаленное управление посредством rdesktop, RAdmin, VNC Антон Борисов bash-2.05b# nmap -v -sS compaq bash-2.05b# nmap -v -sS fuji bash-2.05b$ cat /usr/share/nmap/nmap-services | grep Remote\ Display netstat -na | more (или netstat -na > netstat.txt) bash-2.05b$ ./configure --prefix=/usr/local/rdesktop bash-2.05b$ make bash-2.05b# make install rdesktop rubin rdesktop –4 rubin --prefix=/usr/local/wine [AppDefaults\\radmin.exe\\x11drv] "Desktop" = "700x500" "Managed" = "N" /usr/local/wine/bin/wine ~/RAdmin/radmin.exe /usr/local/wine/bin/wine ~/RAdmin/r_server.exe #!/bin/sh # Start the Virtual Networking Communication (VNC) server BINDIR=/usr/local/vnc DAEMON=vncserver case "$1" in 'start') su - anthony -c "export PATH=$PATH:/usr/X11R6/bin:/usr/local/bin; $BINDIR/$DAEMON :10 -geometry 800x600" ;; 'stop') $BINDIR/$DAEMON -kill :10 ;; 'restart') $0 stop; $0 start ;; *) echo "usage $0 start|stop|restart" ;; esac echo "***** Starting RealVNC server *****" /etc/rc.d/rc.vnc start bash-2.05b# nmap -v -sS fuji -p 1-10000 vncviewer fuji:10 -passwd ~/.vnc/passwd -geometry 600x400 modprobe rshaper.o rshaperctl HOST SPEED TIME iptables -N MyRDP_IN iptables -I INPUT -j MyRDP_IN -s HOST iptables -I MyRDP_IN -j INPUT iptables -N MyRDP_OUT iptables -I OUTPUT -j MyRDP_OUT -d HOST iptables -I MyRDP_OUT -j OUTPUT iptables -L MyRDP_IN -v MyRDPTest.sh #!/bin/sh IPTL=/usr/sbin/iptables SHAPER=/usr/local/sbin/rshaperctl MODE=9600 HOST=rubin TIME=10 if [ "$1" = "zero" ]; then echo "Zeroing IN & OUT counters for $HOST"; $IPTL -L MyRDP -Z 2>/dev/null 1>/dev/null $IPTL -L MyRDPOut -Z 2>/dev/null 1>/dev/null fi echo "Setting Shaping MODE as $MODE bytes to host $HOST" $SHAPER $HOST $MODE $TIME $SHAPER echo "Incoming traffic from host" IN=`$IPTL -L MyRDP -v -n | grep ACCEPT` INpkts=`echo $IN | awk '{ print $1 }'` INbytes=`echo $IN | awk '{ print $2 }'` echo "pkts = $INpkts, bytes = $INbytes"; echo "Outcoming traffic to host" OUT=`$IPTL -L MyRDPOut -v -n | grep ACCEPT` OUTpkts=`echo $OUT | awk '{ print $1 }'` OUTbytes=`echo $OUT | awk '{ print $2 }'` echo "pkts = $OUTpkts, bytes = $OUTbytes"; RDP протокол Incoming traffic from host pkts = 2604, bytes = 1039K Outcoming traffic to host pkts = 3563, bytes = 474K VNC протокол Incoming traffic from host pkts = 6277, bytes = 804K Outcoming traffic to host pkts = 5413, bytes = 321K RADMIN протокол Incoming traffic from host pkts = 2739, bytes = 472K Outcoming traffic to host pkts = 3610, bytes = 267K С Юниксом на vi Сергей Супрунов # ipfw show > buffer # cat article buffer > temp # mv temp article # ipfw show > buffer # mcedit article !lipfw show # vi [filename] # {vi –e | ex} [filename] # {vi –R | view} [filename] # vi test.txt $ exit You have stopped jobs. $ jobs [1] 34336 Suspended vi test $ fg 34336 # vi –e # ex set showmode set verbose Свободный антивирус Сергей Яремчук #tar xzvf clamav-0.65.tar.gz # cd clamav-0.65 #./configure ... /dev/(u)random detected. Checking /etc/passwd... ERROR: User "clamav" (and/or group "clamav") doesn't exist. Please create it. You can omit this check with the --disable-clamav option. # groupadd clamav # useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav # make # su -c "make install" # /usr/local/bin/clamscan -r -i /home/sergej/work/clamav-0.65/ #clamscan -r --mbox /var/spool/mail #cat testfile | clamscan - # clamscan –unzip /mnt/test/test.zip #clamscan -d /tmp/newclamdb –tgz –deb –unrar --max-space=50m -r /home # /usr/local/sbin/clamd #Example # Путь к лог-файлу LogFile /var/log/clamav/clamd.log # Блокировка записи в лог-файл (необходима при запуске # нескольких демонов одновременно)в том числе и во избежание # работы с одинаковой конфигурацией #LogFileUnlock # максимальный размер лог-файла (0 – без ограничений) LogFileMaxSize 0 # Использование syslog LogSyslog # Подробный отчет #LogVerbose # Файл для сохранения идентификатора процесса PidFile /var/run/clamav/clamd.pid # Путь к антивирусным базам (по умолчанию /usr/local/share/clamav) DataDirectory /var/lib/clamav # Демон может работать в сетевом или локальном режиме, # в целях безопасности рекомендуется пока последний, но вот # посылать сигналы мне показалось более удобным именно # в сетевом. Несколько следующих строк необходимы для # настройки сетевого режима. #LocalSocket /var/run/clamav/clamd.sock #FixStaleSocket #TCPSocket 3310 #TCPAddr 127.0.0.1 #MaxConnectionQueueLength 30 # Предварительная запись потока StreamSaveToDisk # Предел для потока, после которого соединение закрывается #StreamMaxLength 10M # Максимальное количество одновременно выполняемых задач MaxThreads 10 # Максимальная рекурсия каталога MaxDirectoryRecursion 15 # Следование символическим ссылкам для каталогов и файлов #FollowDirectorySymlinks #FollowFileSymlinks # Проверка целостности баз (по умолчанию 1 час) #SelfCheck 600 # Команда, которая должна выполниться при обнаружении вируса. # При этом используются подстановки %f – имя инфицированного # файла, %v – название вируса. Должен использоваться полный # путь к команде #VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %f: %v" # Имя пользователя, от которого запускается демон, он должен # иметь права на изменение всех перечисленных файлов и каталогов. User clamav # Работа с почтой и архивами, для RAR нужна отдельная строка ScanMail ScanArchive ScanRAR # Установка максимальных значений для архивов для защиты # от mail-бомб (0 – без ограничений). ArchiveMaxFileSize 10M ArchiveMaxRecursion 5 ArchiveMaxFiles 1000 ArchiveLimitMemoryUsage # telnet localhost 3310 #clamdscan /home #ln -s /etc/init.d/clamd.sh /etc/rc.d/rc5.d/S50clamd INPUT_MAIL_FILTER(`clmilter',`S=local:/var/run/clmilter.sock, F=, T=S:4m;R:4m')dnl define(`confINPUT_MAIL_FILTERS', `clmilter') А в clamav.conf проверяем наличие таких строк. LocalSocket /var/run/clamd.sock ScanMail StreamSaveToDisk #/usr/local/sbin/clamav-milter -blo /var/run/clmilter.sock # touch /var/log/clam-update.log # chmod 600 /var/log/clam-update.log # chown clamav /var/log/clam-update.log # freshclam -d -c 3 -l /var/log/clam-update.log #export http_proxy="proxy.server:8080" 0 00 * * 07 /usr/local/bin/freshclam --quiet -l /var/log/clam-update.log #drweb /mnt/dos.ext.1/virus_test/ # sigtool -c "clamscan --stdout" -f /home/sergej/virus_test/test.exe -s # sigtool -c "drweb" -f -f /home/sergej/virus_test/test.exe -s "Win32.HLLP.Underscore.36864" # strings test.exe | less #cat test.exe | sigtool --hex-dump > virus.sig # sigtool -c "drweb" -f -f /home/sergej/work/xaf -s "Win32.HLLP.Underscore.36864" Win32.HLLP.Underscore.36864 (Clam)= #sigtool --unpack-current daily.cvd #cat xaf.sig >> viruses.db2 #md5sum viruses.db2 > viruses.md5 Три поросёнка Snort: «Ниф-Ниф», «Нуф-Нуф» и «Наф-Наф». Настройка нескольких сенсоров Snort с помощью SnortCenter Павел Закляков # wget http://www.snort.org/dl/snort-2.1.1.tar.gz # wget http://www.snort.org/dl/snort-2.1.1.tar.gz.md5 # cat snort-2.1.1.tar.gz.md5 # md5sum snort-2.1.1-RC1.tar.gz # tar -zxvf snort-2.1.1.tar.gz -C /progi # cd /progi/snort-2.1.1 # ./configure --with-mysql # find / -name pcre.h /usr/include/pcre/pcre.h /progi/snort/snort-2.1.1/src/win32/WIN32-Includes/pcre.h # rpm -qf /usr/include/pcre/pcre.h # rpm -ihv pcre-devel-3.9-2.i386.rpm # makev # make install # wget http://symlabs.com/Net_SSLeay/Net_SSLeay.pm-1.21.tar.gz # tar -zxvf Net_SSLeay.pm-1.21.tar.gz -C /progi # cd /progi/Net_SSLeay.pm-1.21 # perl Makefile.PL # ./Makefile.PL # rpm -ihv openssl-devel-0.9.6b-35.7.i386.rpm # make # make install # perl -e 'use Net::SSLeay' # wget http://users.pandora.be/larc/download/snortcenter-agent-v1.0-RC1.tar.gz # tar -zxvf snortcenter-agent-v1.0-RC1.tar.gz -C /progi # cd /progi/sensor # ./setup.sh # ./setup.sh # /etc/rc.d/init.d/sensor status # iptables -I INPUT -p tcp -s $REMOTE_IP --sport 1024:65535 -d $SENSOR_IP --dport 2525 -j ACCEPT # iptables -I OUTPUT -p tcp -s $SENSOR_IP --sport 2525 -d $REMOTE_IP --dport 1024:65535 -j ACCEPT # wget http://users.pandora.be/larc/download/snortcenter-v1.0-RC1.tar.gz # tar -zxvf snortcenter-v1.0-RC1.tar.gz -C /var/www/html # mv /var/www/html/www /var/www/html/snortcenter # mcedit /var/www/html/snortcenter/config.php # vi /var/www/html/snortcenter/config.php # mysql -u root -p mysql> CREATE DATABASE snortcenter; mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snortcenter.* to snortcenteruser@localhost; mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snortcenter.* to snortcenteruser; mysql> set password for 'snortcenteruser'@'localhost'=password('ваш_пароль№6'); mysql> set password for 'snortcenteruser'@'%'=password('ваш_пароль№6'); mysql> exit //echo "$sql
"; $result = $db->acidExecute($sql); $result_a = $db->acidExecute("SELECT max(id) FROM preprocessor"); $myrow = $result_a->acidFetchRow(); $update_rule_count[1] = 'add-spp'; $update_rule_count[2] = $myrow[0]; #!/usr/bin/perl while ($temp=){ if ($temp=~/^[^#].*\\\n$/) { chomp $temp; chop $temp; } print $temp; } # chmod +x convert_rules.pl $fp=popen($curl_path."curl -s $proxyline $snortrules_url | gunzip -dcf - | tar -xOf - rules/*.rules rules/*.conf rules/*.config", "r"); $fp=popen($curl_path."curl -s $proxyline $snortrules_url 2>/dev/null | tar xzOf - rules/*.rules rules/*.conf rules/*.config", "r"); $fp=popen($curl_path."curl -s $proxyline $snortrules_url | gunzip -dcf - | tar -xOf - rules/*.rules rules/*.conf rules/*.config | /var/www/html/snortcenter/convert_rules.pl", "r"); $fp=popen($curl_path."curl -s $proxyline $snortrules_url 2>/dev/null | tar xzOf - rules/*.rules rules/*.conf rules/*.config | /var/www/html/snortcenter/convert_rules.pl", "r"); elseif ($what == "byte_test") { if ($rule['byte_test']) $rule['byte_test'][$content_nr] .= "; byte_test: $val"; else $rule['byte_test'][$content_nr] = $val; elseif ($what == "byte_test") { $rule['byte_test'][$content_nr] = $val; # wget http://users.pandora.be/larc/download/acid-0.9.6b23-plugin-v1.tar.gz # tar -zxvf acid-0.9.6b23-plugin-v1.tar.gz -C /progi # mv /var/www/html/acid/acid_main.php /var/www/html/acid/acid_main.php.bak # mv /var/www/html/acid/acid_output_html.inc /var/www/html/acid/acid_output_html.inc.bak # mv /var/www/html/acid/acid_style.css /var/www/html/acid/acid_style.css.bak # cp -R /progi/acid-0.9.6b23_plugin/* /var/www/html/acid # cp -Rv /progi/acid-0.9.6b23_plugin/* /var/www/html/acid #!/bin/bash # # snortd Start/Stop the snort IDS daemon. # # chkconfig: 2345 79 11 # description: snort is a lightweight network intrusion # detection tool that currently detects more than 1100 host # and network vulnerabilities, portscans, backdoors, and more. # # June 10, 2000 -- Dave Wreski # - initial version # # July 08, 2000 Dave Wreski # - added snort user/group # - support for 1.6.2 # Source function library. . /etc/rc.d/init.d/functions # Specify your network interface here INTERFACE=eth0 # See how we were called. case "$1" in start) echo -n "Starting snort: " # ifconfig eth0 up daemon /usr/local/bin/snort -o -i $INTERFACE -d -D -c /etc/snort/snort.$INTERFACE.conf touch /var/lock/subsys/snort sleep 3 if [ -f /var/log/snort/alert ] then rm /var/log/snort/alert fi echo ;; stop) echo -n "Stopping snort: " killproc snort rm -f /var/lock/subsys/snort echo ;; restart) $0 stop $0 start ;; status) status snort ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0 # chkconfig snortd on (# chkconfig snortd2 on) # chkconfig snortd on Ошибки переполнения буфера извне и изнутри как обобщенный опыт реальных атак Крис Касперски Листинг 1. Пример последовательного переполнения буфера при записи seq_write(char *p) { char buff[8]; … strcpy(buff, p); } Листинг 2. Пример индексного переполнения буфера при чтении idx_write(int i) { char buff[]="0123456789"; … return buff[i]; } char *p = malloc(MAX_BUF_SIZE); Листинг 3. Фрагмент программы, подверженной переполнению с затиранием указателя на исполняемый код code_ptr() { char buff[8]; void (*some_func) (); … printf("passws:"); gets(buff); … some_func(); } Листинг 4. Фрагмент программы, подверженной последовательному переполнению при записи, с затиранием указателя на таблицу виртуальных функций class A{ public: virtual void f() { printf("legal\n");}; }; main() { char buff[8]; A *a = new A; printf("passwd:");gets(buff); a->f(); } Листинг 5. Дизассемблерный листинг переполняющийся программы с краткими комментариями ; CODE XREF: start+AFvp .text:00401000 main proc near .text:00401000 .text:00401000 var_14 = dword ptr -14h ; this .text:00401000 var_10 = dword ptr -10h ; *a .text:00401000 var_C = byte ptr -0Ch .text:00401000 var_4 = dword ptr -4 .text:00401000 .text:00401000 push ebp .text:00401001 mov ebp, esp .text:00401003 sub esp, 14h ; открываем кадр стека и резервируем 14h стековой памяти .text:00401003 .text:00401003 ; .text:00401006 push 4 .text:00401008 call operator new(uint) .text:0040100D add esp, 4 ; выделяем память для нового экземпляра объекта A и получаем ; указатель .text:0040100D .text:0040100D ; .text:00401010 mov [ebp+var_10], eax ; записываем указатель на объект в переменную var_10 .text:00401010 .text:00401010 ; .text:00401013 cmp [ebp+var_10], 0 .text:00401017 jz short loc_401026 .text:00401017 ; проверка успешности выделения памяти .text:00401017 ; .text:00401019 mov ecx, [ebp+var_10] .text:0040101C call A::A .text:0040101C ; вызываем конструктор объекта A .text:0040101C ; .text:00401021 mov [ebp+var_14], eax ; заносим возвращенный указатель this в переменную var_14 .text:00401021 .text:00401021 ; … .text:0040102D loc_40102D: ; CODE XREF: main+24^j .text:0040102D mov eax, [ebp+var_14] .text:00401030 mov [ebp+var_4], eax ; берем указатель this и перепрятываем его в переменную var_4 .text:00401030 .text:00401030 ; ; "passwd:" .text:00401033 push offset aPasswd .text:00401038 call _printf .text:0040103D add esp, 4 .text:0040103D ; выводим приглашение к вводу на экран .text:0040103D ; .text:00401040 lea ecx, [ebp+var_C] ; переполняющийся буфер расположен ниже указателя на объект ; и первичного указателя this, но выше порожденного указателя ; this, что делает последний уязвимым .text:00401040 .text:00401040 .text:00401040 .text:00401040 ; .text:00401043 push ecx .text:00401044 call _gets .text:00401049 add esp, 4 .text:00401049 ; чтение строки в буфер .text:00401049 ; .text:0040104C mov edx, [ebp+var_4] ; загружаем уязвимый указатель this в регистр EDX .text:0040104C .text:0040104C ; .text:0040104F mov eax, [edx] .text:0040104F ; извлекаем адрес виртуальной таблицы .text:0040104F ; .text:00401051 mov ecx, [ebp+var_4] .text:00401051 ; передаем функции указатель this .text:00401051 ; .text:00401054 call dword ptr [eax] ; вызываем виртуальную функцию – первую функцию виртуальной ; таблицы .text:00401054 .text:00401054 ; .text:00401056 mov esp, ebp .text:00401058 pop ebp .text:00401059 retn .text:00401059 main endp Листинг 6. Фрагмент программы, подверженной последовательному переполнению при записи и затиранием скалярной переменной и указателя на данные, поглощающими затертую переменную data_ptr() { char buff[8]; int x; int *p; printf("passws:"); gets(buff); … *p = x; } Листинг 7. Фрагмент программы, подверженной последовательному переполнению при записи, с затиранием индекса index_ptr() { char *p; char buff[MAX_BUF_SIZE]; int i; p = malloc(MAX_BUF_SIZE); i = MAX_BUF_SIZE; … printf("passws:"); gets(buff); … // if ((i < 1) || (i > MAX_BUF_SIZE)) ошибка while(i--) p[i] = buff[MAX_BUF_SIZE – i]; } Листинг 8. Фрагмент программы, подверженный переполнению с затиранием скалярной переменной var_demo(float *money_account) { char buff[MAX_BUF_SIZE]; float buks = CURRENT_BUKS_RATE; printf("input money:"); gets(buff); if (atof(buff)<0) ошибка! введите положительное значение … *money_account -= (atof(buff) * CURRENT_BUKS_RATE); } Листинг 9. Фрагмент программы, подверженной последовательному переполнению при записи с затиранием постороннего буфера buff_demo() { char buff[MAX_BUF_SIZE]; char pswd[MAX_BUF_SIZE]; … fgets(pswd, MAX_BUF_SIZE, f); … printf("passwd:"); gets(buff); if (strncmp(buff, pwsd, MAX_BUF_SIZE)) // неправильный пароль else // правильный пароль } Программное управление ADSI: LDAP Иван Коробко Set obj = GetObject ("LDAP://DC=Domain_name1/DC=Domain_name2/DC=Domain_name3/OU=OU_Name_Level1/OU=OU_Name_Level2…/OU=OU_Name_Levelµ/CN=CN_Name") Set obj = GetObject ("LDAP://DC=RU/DC=Domain1/OU=Group1/OU=Group4/CN=User3") Set obj=GetObject("LDAP://CN=CN_Name,OU=OU_Name_Levelµ…,OU=OU_Name_Level2,OU=OU_Name_Level1/DC=…") Set obj=GetObject("LDAP://CN=User3,OU=Group4,OU=Group3,DC=Domain1,dc=RU") /// LDAP://server/DC=domain,DC=ru; SELECT поле11,поле21,полеn1 FROM путь WHERE objectClass="тип_объекта" Пример 1: Set objNameSpace = GetObject("WinNT:") For Each Domain in objNameSpace DomainName=Domain.Name Next Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.CommandText = "SELECT printerName, serverName FROM " _ & " 'LDAP://"& DomainName & "' WHERE objectClass='printQueue'" objCommand.Properties("Cache Results") = False Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF temp=temp & "Printer Name: " & objRecordSet.Fields("printerName").Value & " Server Name: " & objRecordSet.Fields("serverName").Value & chr(13) objRecordSet.MoveNext Loop wscript.echo temp Пример 2: Set obj=GetObject("LDAP://CN=User3, OU=Group1,OU=Users, o=domain.ru") For Each U_obj In obj wscript.echo "UserUID: " & U_obj.Get("uid") Next Пример 3: Set PreObj= GetObject("LDAP:") Set obj= PreObj.OpenDSObject("LDAP://CN=User3, OU=Group1,OU=Users, o=domain.ru", "CN=User1","1234567",0) For Each U_obj In obj wscript.echo "UserUID: " & U_obj.Get("uid") Next Пример 4: Set PreObj= GetObject("LDAP:") Set obj= PreObj.OpenDSObject("LDAP://CN=User3, OU=Group1,OU=Users, o=domain.ru", "CN=User1","1234567",0) Set U_obj=obj.GetObject("InetOrgPerson","CN=User3") U_obj.Put "CN","User4" U_obj.SetInfo MsgBox "Параметр CN изменен." Пример 5: Set PreObj= GetObject("LDAP:") Set obj= PreObj.OpenDSObject("LDAP:// OU=Group1, OU=Users,o=domain.ru", "CN=User1","1234567",0) Set U_obj=obj.Create("InetOrgPerson","CN=User3") ClassArray=Array("InetOrgPerson","person","top","organizationPerson") U_obj.Put "objectClass", ClassArray U_obj.Put "cn", "User_Name_3" U_obj.Put "sn", "Second_Name_3" U_obj.SetInfo MsgBox "Учетная запись создана." Пример 6 a) - WinNT: Set obj=GetObject("WinNT:") For Each str In obj DomainName=str.Name Next Set UserName="Value" Set element=GetObject("WinNT://" & DomainName & "/ USER1") Msgbox "FullName: "+ cstr(element.FullName) Пример 6 б) - LDAP: set rootDSE_ = GetObject("LDAP://RootDSE") DomainName = rootDSE_.Get("defaultNamingContext") UserLogonName="USER1" Const ADS_SCOPE_SUBTREE = 2 Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.CommandText = "SELECT name, sAMAccoutName FROM " _ & " 'LDAP://"& DomainName & "' WHERE objectClass='users'" objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.Properties("Cache Results") = False Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF If objRecordSet.Fields("sAMAccoutName").Value=UserLogonName msgbox "FullName: "+ objRecordSet.Fields("name").Value end if Loop