[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Да, так и есть, MASM32 умеет вызывать и stdcall, и cdecl функции при заданном прототипе.
     
  2. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Кто подскажет как найти сразу 3 и более символов следующих друг за другом?Вот код:
    Code:
    mov ecx,100
    mov edi,offset stroka
    mov eax,'H'
    repne scasb
    
    Один символ могу найти, а 3 нет.Заранее благодарен.
     
    #1162 MTV, 16 Oct 2011
    Last edited: 16 Oct 2011
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    потому что ты ищешь символ,а тебе надо искать слово.Значит уже как минимум будет использоваться адрес источника и адрес приемника,соответственно придется сравнивать пару строк,надеюсь понятно намекнул?
     
  4. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    DooD, спасибо, как добавил add esp, 8, так все и заработало.
    В Си есть много интересных функций, они проще и удобней некоторых апи, поэтому было интересно, как их вызывать.
     
  5. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    плз покажите пару примеров на асме написания шелкода hello world на примере этого исходного кода ,

    как ксорить нулевые байты
    PHP:
    format  pe gui 4.0


     
    include 'D:/include/win32ax.inc'
           
    section '.data' data readable writeable
           message db 
    'hello world',0

     start
    :


            
    invoke  MessageBox,NULL,message,message,MB_OK
             invoke  ExitProcess
    ,1

             
    .end  start 
     
  6. #andrew#

    #andrew# Elder - Старейшина

    Joined:
    24 Aug 2010
    Messages:
    45
    Likes Received:
    7
    Reputations:
    11
    SEKTOR3A
    Code:
    option casemap:none
    
    .386
    .model flat, stdcall
    
    include z:\asm\include\windows.inc
    include z:\asm\include\user32.inc
    include z:\asm\include\kernel32.inc
    
    includelib z:\asm\lib\user32.lib
    includelib z:\asm\lib\kernel32.lib
    
    .data
    	msg01 db 'Assembler Hello World!!!', 0
    	msg02 db 'Hello World Programm', 0
    .code
    start:
    	invoke MessageBox,NULL,addr msg01,addr msg02, MB_OK
    	invoke ExitProcess, 0
    end start
    
    Может как-нибудь так?прошу не пинать сильно,сам начал только что изучать асм.
     
  7. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    пробовал на масме твоё код скомпелить выдает ошибку
    include c:\masm32\include\windows.inc :inc(98) error A2005 symbol redefinition: char

    хотя у тебя в исходниках вроде нет ошибок но у меня инклуд не дает скомпелить в чем может проблема тут быть
     
  8. swt1

    swt1 Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    306
    Likes Received:
    78
    Reputations:
    21
    .386
    .model flat, stdcall
    option casemap:none

    include D:\masm32\include\windows.inc
    include D:\masm32\include\user32.inc
    include D:\masm32\include\kernel32.inc

    includelib D:\masm32\lib\user32.lib
    includelib D:\masm32\lib\kernel32.lib

    .data
    msg01 db 'Assembler Hello World!!!', 0
    msg02 db 'Hello World Programm', 0
    .code
    start:
    invoke MessageBox,NULL,addr msg01,addr msg02, MB_OK
    invoke ExitProcess, 0
    end start
     
  9. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Проблема в порядке подключения инклудов, я сам когда-то долго с этим разбирался. Надо сначала кернел.инк подключать, потом виндоуз, а не наоборот.

    Почему так - хз, может кто нибудь более грамотный (типа d_x или slesh) мог бы объяснить
     
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    надо сначала windows.inc подключать,пример выше правильный ,только я так и не понял при чем тут шелкод и ксор байт?
     
  11. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    а разницы нет чем скомпелить фасмом или масмом главное чтоб сработало
    делаю следующее компелю этот код

    FASM
    PHP:
    format  pe gui 4.0
     
    include 'D:/include/win32ax.inc'
           
    section '.data' data readable writeable
           message db 
    'hello world',0

     start
    :


            
    invoke  MessageBox,NULL,message,message,MB_OK
             invoke  ExitProcess
    ,1

             
    .end  start 
    ,после смотрю в дебагер

    PHP:
    00401007 6A 00            PUSH 0 аргумент <- стиль сообщения
    00401009   68 00104000      PUSH Hellowor.00401000                   
    ASCII "hello "  на строку с заголовком
    0040100E   68 00104000      PUSH Hellowor.00401000                   
    ASCII "hello " на строку с с текстом
    00401013   6A 00            PUSH 0 
    <- параметр хендл окна
    00401015   FF15 7C204000    CALL DWORD PTR DS
    :[USER32.MessageBoxA>>; USER32.MessageBoxA
    0040101B   6A 01            PUSH 1
    0040101D   FF15 5E204000    CALL DWORD PTR DS
    :[KERNEL32.ExitProces>; kernel32.ExitProcess
    потом собераю опкод в бенарный вид
    вот так ,
    PHP:
    6A0068001040006800104000FF157C2040006A01FF155E204000 
    после преобразую его в шелкод таким образом
    PHP:
     "\х6A\х00\х68\х00\х10\х40\х00\х68\х00\х10\х40\х00\хFF\х15\х7C\х20\х40\х00\х6A\х01\хFF\х15\х5E\х20\х40\х00"
    после всего запускаю с++ и компелю
    таким образом

    PHP:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
      #include <iostream>
    #include <windows.h>
     
    int main(){
        
    unsigned char shellcode[]=
       
     
    "\х6A\х00\х68\х00\х10\х40\х00\х68\х00\х10\х40\х00\хFF\х15\х7C\х20\х40\х00\х6A\х01\хFF\х15\х5E\х20\х40\х00";

       
     
        
    system("PAUSE");
     
        ((
    void (*)())shellcode)();
     
        return 
    0;
    }
    но так как присутствую нули будет ошибка открывается автоматом дебагер и указывает адрес access violation at 0x0022ff18 :write of address 0xf54337f5.process stopped

    поэтому и спрашиваю как избавится от нулевых байтов или я может не так что то делаю?
     
  12. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Когда явно запускаешь шеллкод, нули тебе никак не помешают. Просто ты, кажется, неправильно его преобразовал в двоичный вид в си, забыв об обратном порядке следования байтов в архитектуре x86. Плюс ко всему, в программе на асме строки в куче статической хранятся, и в шеллкод их будет очень проблематично перенести. Поэтому лучше их записывать в стек и оттуда же использовать. И да, еще, вызов винапи-фукцкий тоже производится через таблицу импорта по абсолютному адресу, ее тоже не перенесешь.
     
    #1172 GRRRL Power, 3 Nov 2011
    Last edited: 3 Nov 2011
  13. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    Спасибо за ответ.
    вот сделал пример со стекам
    PHP:
    format  pe gui 4.0  include 'D:\include\win32ax.inc'    section '.data' data readable writeable   message   db '*H','e','l','l','o',  '***','A','n','t','i','c','h','a','t*',0    start:   push dword MB_OK  push dword message  push dword message push dword 0  call [MessageBox]  call [ExitProcess]  .end start  
    , а как тут прикрутить к этому исходному коду импорт библиотек
    пример этого
    section '.idata' import data readable writeable
    library kernel32,'kernel32.dll'
    import kernel32,\
    ExitProcess,'ExitProcess'

    и.т.д

    PS: да еще в отладчике не меняются адреса что со стеками работать что без них ,если смотреть по первому исходному коду и по второму не имеет значение адреса одни и те же
     
    #1173 SEKTOR3A, 3 Nov 2011
    Last edited: 3 Nov 2011
  14. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Почитай лучше что-нибудь на тему написания подобного
    http://forum.antichat.ru/showthread.php?t=38435
    http://www.vividmachines.com/shellcode/shellcode.html
     
    _________________________
  15. #andrew#

    #andrew# Elder - Старейшина

    Joined:
    24 Aug 2010
    Messages:
    45
    Likes Received:
    7
    Reputations:
    11
    Не знаю, подключал инклуды в разных порядках и не заметил разницы,работает и так и так одинаково!!!
     
  16. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Шелл-код - это базонезависимый код, т.е. может функционировать без ошибок независимо от того, в каком месте программы он находится.

    Какой же это шелл-код?
    Code:
    00401007 > 6A 00            PUSH 0 аргумент <- стиль сообщения
    00401009   68 00104000      PUSH Hellowor.00401000                   ; ASCII "hello "  на строку с заголовком
    0040100E   68 00104000      PUSH Hellowor.00401000                   ; ASCII "hello " на строку с с текстом
    00401013   6A 00            PUSH 0 <- параметр - хендл окна
    00401015   FF15 7C204000    CALL DWORD PTR DS:[USER32.MessageBoxA>>; USER32.MessageBoxA
    0040101B   6A 01            PUSH 1
    0040101D   FF15 5E204000    CALL DWORD PTR DS:[KERNEL32.ExitProces>; kernel32.ExitProcess  
    Где здесь наблюдается базонезависимость?
    При преобразовании такого кода в бинарный поток нарушается все смещения относительно базы и адреса. Он никогда не будет работать.

    Нулевые байты тут вообще не при чем. Вы перечитали литературы по написанию сплойтов используя уязвимость stack overflow. Это заблуждение.

    Базонезависимый код можно написать в двух вариантах: полный базонезависимый и частично. Как написать полную базонезависимость, включая "ручной" поиск и вычисления адресов API функций, я даже и пытаться не буду объяснить, а вот второй метод - частичная базонезависимость, могу.

    Суть частичной базонезависимости заключается в предварительном пропатчивание шелл-кода уже найденными адресами функций. Таким образом программа разбивает на две части: подготавливающий код, и собственно сам базонезависимый.

    Писал под MASM:
    Code:
    .386
    .model flat, stdcall
    
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    
    .data
    _ExitProcess	db 'ExitProcess',0
    _MessageBoxA	db 'MessageBoxA',0
    _user32		db 'user32.dll',0
    _kernel32	db 'kernel32.dll',0
    
    .code
    Main:
    [COLOR=Lime];подготавливающий код[/COLOR]
    	[COLOR=Lime];находим адрес ExitProcess[/COLOR]
    	push offset _kernel32
    	call LoadLibraryA
    	
    	push offset _ExitProcess
    	push eax
    	call GetProcAddress
    	
    	mov __ExitProcess,eax
    	
    	[COLOR=Lime];находим адрес MessageBoxA[/COLOR]
    	push offset _user32
    	call LoadLibraryA
    	
    	push offset _MessageBoxA
    	push eax
    	call GetProcAddress
    	
    	mov __MessageBoxA,eax
    	
    	[COLOR=Lime];шелл-код готов. Можно копировать куда надо либо запускать. 
    	;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode.[/COLOR]
    	
    [COLOR=Lime];шелл-код[/COLOR]
    [COLOR=DarkOrange]ShellCode:
    	call GetDelta
    	
    GetDelta:
    	pop ebp
    	sub ebp,offset GetDelta
    	
    	push 0
    	lea eax,[ebp+__Message]
    	push eax
    	push eax
    	push 0
    	call [ebp+__MessageBoxA]
    	
    	push 0
    	call [ebp+__ExitProcess]
    	
    __ExitProcess	dd 0
    __MessageBoxA	dd 0
    __Message	db 'I am shellcode',0
    SizeOfShellcode	equ ($-offset ShellCode) [/COLOR]
    end Main
    
    При линковке обязательно нужно разрешить секцию кода для записи, ключом /SECTION:.text,RWE

    Минусы данного метода: в разных версиях одной и той же win, адреса API функций - разные. Потому данный шелл-код будет работать не везде.
    Плюсы данного метода: охренеть какая компактность, по сравнению с полной независимость.

    В принципе теперь через CreateFileA/WriteFile можно записать готовый шелл-код в виде бинарного потока в отдельный файл, указав начало шелл-кода - адрес метки ShellCode, а размер, он же число записываемых байт - константу SizeOfShellcode.
     
    #1176 Sams, 4 Nov 2011
    Last edited: 4 Nov 2011
    1 person likes this.
  17. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    еще один вопрос хотел бы спросить, как можно перехватить API MessageBoxA при помощи хука этой же программы (hello world) чтоб при запуске программы hello world просто исчезло само окно MessageBox ,мне известно что можно это сделать при помощи .dll библиотеки которая и будет перехватывать MessageBox окно ,

    что нужно учитывать при написание такой .dll нужно ли смотреть на загрузку exe файла (hello world ) в память списков адресов функций импортируемых из различных Dll. oткомпилированный вызов функции через таблицу импорта или этого мало
     
    #1177 SEKTOR3A, 4 Nov 2011
    Last edited: 4 Nov 2011
  18. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Есть разные способы перехвата (через таблицу импорта, через запись своего кода в начало нужной API-функции и т.д.)

    http://kaimi.ru/2010/08/your-own-injector/
     
  19. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    SEKTOR3A,
    советую перед прочтением http://kaimi.ru/2010/08/your-own-injector/ ознакомится с http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml - тут больше теории и собственно сама суть.
     
  20. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    плиз подскажите какой утилитой быстрей собрать бинарный код (опкод) в шелкод нужно ли его собирать с право налево или как обычно ,я делаю таким образом запускаю олю выбираю себе нужный .ехе файл для сплоита жму в оли на ф8 смотрю начало точку входа и останова после собираю весь код стр+с но не меняю байты так иду как обычно с лево на право,
    пример куска кода
    PHP:
    00401005   E86E000000    call    00401078                         ; \LoadLibraryA
    0040100A   
    68 00304000    push    403000                           ; /ProcNameOrOrdinal "ExitProcess"
    0040100F   50             push    eax                              ; |hModule
    00401010   
    E8 5D000000    call    00401072                         ; \GetProcAddress
    беру опкоды
    PHP:
    E86E000000680030400050E85D000000
    потом так
    \xE8\x6E\x00\x00\x00\x68\x00\x30\x40\x00\x50\xE8\x5D\x00\x00\x00

    правильно я делаю?





    PS:смотрел раздел по адресу http://www.shellcode.ru/index.php?name=News&file=print&sid=18
    автор описывает то что
    От хакера требуется всеми силами избегать ситуации, когда в шелл-коде появляются нулевые байты

    а тут описание шелкода опкоды заносятся с лева на право как тогда правильней?
    http://www.safemode.org/files/zillion/shellcode/doc/Writing_shellcode.html
     
    #1180 SEKTOR3A, 7 Nov 2011
    Last edited: 7 Nov 2011