· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Как узнать под какой ОС выполняется мой код... Windows/Unix/Linux

. 1 . 2 . >>

Посл.отвђт Сообщен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

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049