|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 22, 2004 14:02:00 · Поправил: stalp Как узнать под какой ОС выполняется мой код (то... Windows/Unix/Linux (во время выполнения) Точнее как определить способ осуществления системного вызова в ОС, на которой выполняется программа. (вызов int 80h / lcall $7,$0 / или вообще надо искать в памяти kernel32)??? "КОД" - просто откомпилированный под Intel-процессоры бинарный код (неважно как он запускается... просто программа, выполняемая под любую ось, загружает его из файла и передаёт ему управление...) PS. Ну не верю я, что в этой конфе собрались одни поклонники Windows!?!?!?! ASM-программеры под *nix, ОТЗОВИТЕСЬ!!!! |
|
|
Дата: Май 22, 2004 14:55:16 или вообще искать в памяти kernel32??? Поиск кернела для выньдос: www.hick.org/code/skape/papers/win32-shellcode.pdf |
|
|
Дата: Май 22, 2004 15:14:39 Правка Гм… Поправьте меня, если я ошибаюсь. Мне кажется, определить ОС можно по селекторам, то есть сравнить адреса, на которые указывает, скажем, FS… |
|
|
Дата: Май 23, 2004 01:14:48 · Поправил: stalp Если никто точного алгоритма не знает, давайте протестируем с помощью нижепреведённой программы... (Пожайлуста, не поленитесь запустить давнозаброшенный Linux или Unix... :) //---------------------------------------------------- // test.c // Программа просто выводит на содержимое // селекторов CS,DS,ES,SS,FS,GS и регистров EIP,ESP // Будучи запущенной под *nix, также проверит возможность // осуществления системных вызовов с помощью int 80h и // с помощью lcall $7,$0 //------------------------------------------------------ #include <stdio.h>
#ifndef WIN
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#endif
unsigned short int
r_cs,r_ds,r_es,r_ss,r_fs,r_gs;
void main(void)
{
unsigned char* ptr=(char*)0;
#ifndef WIN
int i,status,supported = -1;
pid_t pid;
asm("mov %cs,r_cs"); asm("mov %ds,r_ds");
asm("mov %es,r_es"); asm("mov %ss,r_ss");
asm("mov %gs,r_gs"); asm("mov %fs,r_fs");
#else
_asm
{
mov r_cs,cs
mov r_ds,ds
mov r_es,es
mov r_ss,ss
mov r_gs,gs
mov r_fs,fs
}
#endif
printf("CS:0x%.4X; DS: 0x%.4X; ES: 0x%.4X; SS: 0x%.4X; FS: 0x%.4X; GS: 0x%.4X\n",
(long)r_cs,(long)r_ds,(long)r_es,(long)r_ss,(long)r_fs,(long)r_gs);
printf("EIP:0x%.8X; ESP: 0x%.8X\n",main,&ptr);
#ifndef WIN
#ifndef NO_SYSCALL_TEST
for(i=0;i<2;i++)
{
if(!(pid=fork()))
{
switch(i){
case 0:
asm("pushl $11");
asm("pushl $0");
asm("movl $1,%eax");
asm("int $0x80");
break;
case 1:
asm("pushl $11");
asm("pushl $0");
asm("movl $1,%eax");
asm(".byte 0x9a,0x00,0x00,0x00,0x00,0x07,0x00");
}
exit(10);
}
if(pid>0 && waitpid(pid,&status,0)==pid)
supported = (WIFEXITED(status) && WEXITSTATUS(status)==11)?1:0;
printf("Testing \"%s\" call support: %s\n",
i?"lcall $7,$0":"int 80h",
(supported>0)?"Yes":(!supported)?"No":"Fail");
}
#endif
#endif
}
///////////////////////////////////////////////////////// Компиляция под Windows (Visual Studio) cl test.c /DWIN Компиляция под Windows (CBuilder) bcc32 -DWIN test.c Компиляция и запуск под *nix cc test.c uname -a >info.txt ;./a.out >>info.txt ; cat info.txt ///////////////////////////////////////////////////////// Результаты постить сюда или мне на почту (stalp@mail333.com), потом я подведу итоги тут, на форуме... По большей части интересуют результаты работы программы на разных версиях *nix'ов, но если программа под Windows будет выдавать сильно отличные от нижеприведённых результаты, то тоже постите... |
|
|
Дата: Май 23, 2004 01:17:52 Резултаты на Windows 2k SP2: CS:0x001B; DS: 0x0023; ES: 0x0023; SS: 0x0023; FS: 0x0038; GS: 0x0000 EIP:0x0040111C; ESP: 0x0012FF88 |
|
|
Дата: Май 23, 2004 01:18:43 Результаты на FreeBSD 4.6.2 CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x08048530; ESP: 0xBFBFFBFC Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes |
|
|
Дата: Май 23, 2004 20:36:40 Я что-то не совсем понимаю эту задачу... Если программа работает под win32, то в ней есть вызовы (не обязательно, но тем не менее) всяких kernel'ов и она В ПРИНЦИПЕ не может работать под тот же linux с int 80h. Достаточно проверить свой код на вхождение таких команд ! А еще есть фрорматы выполняемых файлов и т.д. Если же код написан с возможностью работы и там и там, то он ДОЛЖЕН содержать такой разветвитель, а не наоборот, сначала начать "работать", а потом определеить - где. Вообще если есть такая возможность (а она есть ?) написать такой код на чистом ANSI C, чтобы компилировалось и там и там без #define, то, раз вроде как нет в обычных библиотеках функции типа get_system_version(), то видимо надо ловить отличия в выполнении команд типа copy, del - в них (их поддержке) должна быть разница... |
|
|
Дата: Май 23, 2004 22:56:35 Я что-то не совсем понимаю эту задачу... Если программа работает под win32, то в ней есть вызовы (не обязательно, но тем не менее) всяких kernel'ов и она В ПРИНЦИПЕ не может работать под тот же linux с int 80h. Достаточно проверить свой код на вхождение таких команд ! А еще есть фрорматы выполняемых файлов и т.д. ЗАДАЧА: код должен сам во время своего выполнения определить ОСь под которой он запущен и в зависимости от этого делать системные вызовы или использовать kernel... "КОД" != "ПРОГРАММА"... форматы тут не важны... |
|
|
Дата: Май 24, 2004 15:08:23 · Поправил: IceStudent Правка [удалено] |
|
|
Дата: Май 24, 2004 18:41:59 · Поправил: stalp IceStudent Значит, код уже есть? А как, простите, он собирается выполняться? Как отдельное приложение или в виде "вставки" в другие программы? См. ещё раз условие... "КОД" - просто бинарный откомпилированный файл... без формата, без Rellocation table, без всего... Этот файл загружается путём обычного считываения всего файла в память... и на него передаётся управление... ну например это можно сделать так: (програма под *nix) #include <stdio.h>
char executed_code[10000];
int main(void) {
FILE* f;
void (*run)()=(void *)executed_code;
if(!(f=fopen("exploit1.bin","rb"))) exit(0);
fread(executed_code,1,sizeof(executed_code),f);
fclose(f);
asm("leal executed_code,%eax");
asm("jmpl %eax");
} |
|
|
Дата: Май 24, 2004 19:12:13 · Поправил: kyprizel FreeBSD 5.2.1-RELEASE-p4 $ ./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x08048584; ESP: 0xBFBFE9EC Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes P.S. мультиплатформенные шеллкоды рулят :) |
|
|
Дата: Май 24, 2004 19:20:25 FreeBSD 5.2.1-RELEASE-p6 $ ./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x08048584; ESP: 0xBFBFEC98 Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes FreeBSD 4.9-RC $ ./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x0804853C; ESP: 0xBFBFFBEC Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes FreeBSD 5.2-CURRENT $ ./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x0804853C; ESP: 0xBFBFECCC Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes Linux, ядро 2.6.4 $ ./a.out CS:0x0073; DS: 0x007B; ES: 0x007B; SS: 0x007B; FS: 0x0000; GS: 0x0000 EIP:0x080483C4; ESP: 0xBFFFF994 Testing "int 80h" call support: No Testing "lcall $7,$0" call support: No как доберусь до мака - кину еще оттуда результаты |
|
|
Дата: Май 24, 2004 19:33:07 Linux 2.4.26 $ ./a.out CS:0x0023; DS: 0x002B; ES: 0x002B; SS: 0x002B; FS: 0x0000; GS: 0x0000 EIP:0x080484A0; ESP: 0xBFFFFAE4 Testing "int 80h" call support: No Testing "lcall $7,$0" call support: No FreeBSD 5.2.1-RELEASE $ ./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x0804853C; ESP: 0xBFBFECCC Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes FreeBSD 5.2.1-p6 в jail'е $ ./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x08048584; ESP: 0xBFBFED54 Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes FreeBSD 4.9-RELEASE-p3 %./a.out CS:0x001F; DS: 0x002F; ES: 0x002F; SS: 0x002F; FS: 0x002F; GS: 0x002F EIP:0x0804853C; ESP: 0xBFBFFB2C Testing "int 80h" call support: Yes Testing "lcall $7,$0" call support: Yes Думаю, теперь БСДшных машин тебе для анализа хватит за глаза :) |
|
|
Дата: Май 24, 2004 21:32:50 слуши, а нету у когонить NT4, там какие селехторы, а? интересн всёж |
|
|
Дата: Май 25, 2004 01:30:54 · Поправил: stalp kyprizel P.S. мультиплатформенные шеллкоды рулят :) Хоть кто-то понимающий нашёлся :) За тесты бооооольшое спасибо!!!!! :) kyprizel Думаю, теперь БСДшных машин тебе для анализа хватит за глаза :)[/b] Ещё-б кто-нить нашёлся с каким-нить OpenBSD... kyprizel [i]Linux 2.4.26 Testing "int 80h" call support: No Testing "lcall $7,$0" call support: No Что-то я намудрил с тестом под Linux :( надо будет разобраться... ЗАТО УЖЕ МОЖНО СДЕЛАТЬ ВЫВОД, ЧТО LINUX,FreeBSD и Windows МОЖНО различать как минимум по двум старшим байтам ESP: ESP: 0xBFBFFB2C (FreeBsd) ESP: 0xBFFFFAE4 (Linux) ESP: 0x0012FF88 (Windows) PS. Ждём добровольцев потестировать Win 9x, Win NT |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049 |