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

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

  1. Sams

    Sams Member

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

    как раз наоборот, записать бинарный код шелл-кода, в понятном для С языка виде.

    С этой работой идеально справиться WinHex. Открываешь через данный хекс-редактор файл с опкодами, выделяешь, затем в меню Edit - Copy Block - C Source. Забрать результат можно из буфера обмена.
    Только здесь нужно учитывать один нюанс, опкоды в файле должны быть не просто скопированы, т.е. в текстовом виде, а записаны именно как байты. Через обычный текстовый редактор такое проделать не удастся.
     
    #1181 Sams, 7 Nov 2011
    Last edited: 7 Nov 2011
  2. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0

    а если сразу скопировать его в GREP hex то получается сразу типо того
    \xE8\x6E\x00\x00\x00\x68\x00\x30\x40\x00\x50\xE8\x 5D\x00\x00\x00

    а в C Source будет так
    unsigned char data[1648] = {
    0x4D, 0x5A, 0x90, 0x00,

    а копировать нужно сразу весь .ехе файл в хекс редакторе или только
    до ExitProcess

    но я и так и так пробовал не выходит с тем кодом hello world который ты написал скомпелил его через масм норм все скомпелилось ,а дальше я застрял , после как все скомпелил открыл Hello world через хекс редактор как ты сказал собрал код вставил его в компилятор на C ,после компиляции на C файл .ехе (ехплоит просто завис и открылся дебагер показав адрес ошибки
     
    #1182 SEKTOR3A, 7 Nov 2011
    Last edited: 7 Nov 2011
  3. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Смотри, когда ты открываешь скомпилированный экзешник через хекс редактор, то ты получаешь просто структурированный (PE-EXE) код. Но ты не учел тот факт, что перед корректной работой шелл-кода нужно выполнить подготавливающий код, который патчит, прописывая адреса. Т.е. тебе нужно вначале выполнить часть программы, и только затем из оперативки выдрать бинарный поток уже пропатченного шелл-кода. Именно из ОЗУ, но никак не из физической памяти. Только в этом случае он будет работоспособным.
    Именно для этого случая я и написал, что нужно использовать CreatFileA/WriteFile. Таким образом после выполнения подготавливающего кода, уже пропатченный шелл код копируется в файл, который в свою очередь и скармливается хекс редактору.
     
  4. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    В общем вот, дописал, не мучайся:

    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
    [COLOR=Yellow]fName			db 'ShellCode.bin',0[/COLOR]
    temp			dd 0
    
    .code
    Main:
    [COLOR=Lime];подготавливающий код[/COLOR]
    	;находим адрес ExitProcess
    	push offset _kernel32
    	call LoadLibraryA
    	
    	push offset _ExitProcess
    	push eax
    	call GetProcAddress
    	
    	mov __ExitProcess,eax
    	
    	;находим адрес MessageBoxA
    	push offset _user32
    	call LoadLibraryA
    	
    	push offset _MessageBoxA
    	push eax
    	call GetProcAddress
    	
    	mov __MessageBoxA,eax
    	
    [COLOR=Lime]	;шелл-код готов. Можно копировать куда надо либо запускать. 
    	;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode.
    	
    	;создаем пустой файл[/COLOR]
    [COLOR=Yellow]	xor eax,eax
    	push eax
    	push eax
    	push CREATE_ALWAYS
    	push eax
    	push eax
    	push GENERIC_WRITE
    	push offset fName
    	call CreateFileA	
    	push eax[/COLOR]
    	
    [COLOR=Lime]	;копируем шелл-код в файл, в виде бинарного потока[/COLOR]
    [COLOR=Yellow]	push 0
    	push offset temp
    	push SizeOfShellcode	;размер шелл-кода
    	push offset ShellCode	;буфер - шелл-код
    	push eax
    	call WriteFile[/COLOR]
    	
    [COLOR=Lime]	;закрываем файл[/COLOR]
    [COLOR=Yellow]	pop eax
    	call CloseHandle[/COLOR]
    	
    [COLOR=Lime];шелл-код[/COLOR]
    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) 
    end Main
    После выполнения кода получишь, в папке с прогой, файл под именем ShellCode.bin. Это и есть шелл-код в виде бинарного потока. Открывай его через хекс редактор, преобразовывай в понятный для С язка вид, и можешь исполнять.
     
  5. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0




    спасибо что помогаешь но все таки у меня есть к тебе вопрос
    смотри на все что ты описал делаю все так же
    линканул последний исходный код
    таким образом
    c:\masm32\bin\Link.exe /SUBSYSTEM:WINDOWS /SECTION:.text,RWE ShellCode.obj
    pause

    но не как не создался ShellCode.bin,а создался ShellCode.ехе файл в той же папке где компилятор масм без папки темп
    после запустил ShellCode.ехе сразу создался ShellCode.bin файл потом открыл его хекс редактором снял код вставил его в С

    исходный код на С
    PHP:
     #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
      #include <iostream>
    #include <windows.h>

       

    int main(){
        
    unsigned char shellcode[]="\xE8\x00\x00\x00\x00\x5D\x81\xED\x6E\x10\x40\x00\x6A\x00\x8D\x85\x97\x10\x40\x00\x50\x50\x6A\x00\xFF\x95\x93\x10\x40\x00\x6A\x00\xFF\x95\x8F\x10\x40\x00\x62\x3D\x40\x77\x19\xD6\x87\x76\x49\x20\x61\x6D\x20\x73\x68\x65\x6C\x6C\x63\x6F\x64\x65\x00";
      
     
        ((
    void (*)())shellcode)();
     
    system("PAUSE");
        return 
    0;
    }
    компилирую на С бинарный поток выдранный с хекс редактора ,компилирует норм но не запускает .ехе файл ,снова открывается дебагер и указывает адрес ошибки

    здесь одно но или я не правильно линкую на масме или на С



    а это сам hello world который ты написал (последний исходник)
    в бинарном виде на С
    PHP:
    unsigned char data[61] = {
        
    0xE80x000x000x000x000x5D0x810xED0x6E0x100x400x000x6A0x000x8D0x85
        
    0x970x100x400x000x500x500x6A0x000xFF0x950x930x100x400x000x6A0x00
        
    0xFF0x950x8F0x100x400x000x620x3D0x400x770x190xD60x870x760x490x20
        
    0x610x6D0x200x730x680x650x6C0x6C0x630x6F0x640x650x00
    };
     
    #1185 SEKTOR3A, 9 Nov 2011
    Last edited: 9 Nov 2011
  6. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Он и не должен был создаться. ShellCode.exe создает ShellCode.bin в результате своей работы, после выполнения.

    Шелл-код на выходе получается 100% работоспособный - проверенно. У тебя же проблема, скорее всего, кроется в MessageBoxA. Она экспортируется из ДЛЛ user32.dll, которая твоей программой не используется, а значит её и нету в области памяти процесса. Я на С не писал, не пишу, и писать не буду, потому конкретным куском кода помочь не могу. А так просто возьми, и подключи user32.dll в своей программе и всё заработает.
     
  7. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    А еще, как вариант, можно взвесить подгрузку user32.dll на плечи шелл-кода.

    P.S. Я в коде допустил ошибку, где вызывается функция CloseHandle. Нужно перед ней убрать команду pop eax.

    И так, вот генерация шелл-кода, который осуществляет подгрузку user32.dll самостоятельно, т.е. в своей программе на С подгрузку делать уже не придется.

    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
    _kernel32		db 'kernel32.dll',0
    _ExitProcess	db 'ExitProcess',0
    _MessageBoxA	db 'MessageBoxA',0
    _LoadLibraryA	db 'LoadLibraryA',0
    fName			db 'ShellCode.bin',0
    temp			dd 0
    
    .code
    Main:
    [COLOR=Lime];подготавливающий код
    	;находим адрес ExitProcess[/COLOR]
    	push offset _kernel32
    	call LoadLibraryA
    	push eax
    	
    	push offset _ExitProcess
    	push eax
    	call GetProcAddress
    	
    	mov __ExitProcess,eax
    	
    	[COLOR=Lime];находим адрес LoadLibraryA[/COLOR]
    	pop eax
    	push offset _LoadLibraryA
    	push eax
    	call GetProcAddress
    	
    	mov __LoadLibraryA,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]
    	xor eax,eax
    	push eax
    	push eax
    	push CREATE_ALWAYS
    	push eax
    	push eax
    	push GENERIC_WRITE
    	push offset fName
    	call CreateFileA	
    	push eax
    	
    	[COLOR=Lime];копируем шелл-код в файл, в виде бинарного потока[/COLOR]
    	push 0
    	push offset temp
    	push SizeOfShellcode	;размер шелл-кода
    	push offset ShellCode	;буфер - шелл-код
    	push eax
    	call WriteFile
    	
    	[COLOR=Lime];закрываем файл[/COLOR]
    	[COLOR=Red][B];pop eax не требуется[/B][/COLOR]
    	call CloseHandle
    
    [COLOR=Lime];шелл-код[/COLOR]
    [COLOR=DarkOrange]ShellCode:
    	call GetDelta
    	
    GetDelta:
    	pop ebp
    	sub ebp,offset GetDelta
    	
    	[COLOR=Lime];подгружаем user32.dll[/COLOR]
    	lea eax,[ebp+_user32]
    	push eax
    	call [ebp+__LoadLibraryA]
    	
    	[COLOR=Lime];вызываем MessageBoxA[/COLOR]
    	push 0
    	lea eax,[ebp+__Message]
    	push eax
    	push eax
    	push 0
    	call [ebp+__MessageBoxA]
    	
    	[COLOR=Lime];ExitProcess[/COLOR]
    	push 0
    	call [ebp+__ExitProcess]
    	
    	[COLOR=Lime];данные шелл-кода[/COLOR]
    _user32			db 'user32.dll',0
    __ExitProcess	dd 0
    __MessageBoxA	dd 0
    __LoadLibraryA	dd 0
    __Message		db 'I am shellcode',0
    SizeOfShellcode	equ ($-offset ShellCode) [/COLOR]
    end Main
    Вообще таких вариантов можно написать целую массу. Всё зависит от цели и требуемых размеров кода.
     
    #1187 Sams, 9 Nov 2011
    Last edited: 9 Nov 2011
  8. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0

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


    заранее благодарю
     
  9. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Кто сказал, что я вообще имею отношению к сплойтам и когда-либо их использовал? о_О Речь идет о базонезависимости, а не об запуске готового кода для получения привилегий используя уязвимости.

    это к чему?

    Код в посте #1195 абсолютно работоспособен и проверен через отладчик, в чем ты можешь сам убедиться.
     
    #1189 Sams, 9 Nov 2011
    Last edited: 9 Nov 2011
  10. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    #1195

    какие тут могут быть секреты ,не ужели трудно объяснить ,если знаешь

    хоть я и чайник в асме но в твоем коде я не нахожу того что ты создавая пустой файл для записи бинарного патока для будущего щелкода
    тут я не нашел запись для
    PHP:
    push offset _kernel32
    push offset _ExitProcess
    push offset _LoadLibraryA
    push offset _user32
    push offset _MessageBoxA

    а твой код такой
    ;копируем шелл-код в файл, в виде бинарного потока
    PHP:
    push 0
        push offset temp
        push SizeOfShellcode    
    ;размер шелл-кода
        push offset ShellCode    
    ;буфер шелл-код
        push eax
        call WriteFile

    а если тут добавить к коду эти строки ,а уж потом call WriteFile call CloseHandle RET
    PHP:
    push offset _kernel32
    push offset _ExitProcess
    push offset _LoadLibraryA
    push offset _user32
    push offset _MessageBoxA


    мое мнение наверно бинарный поток копирует не весь опкод

    а может я и не прав...
    тут я сделал иначе вод код


    PHP:
    .386
    .model flat,stdcall 
    option casemap
    :none
    .data
    start
    :
    push 0
    push 0
    jmp string
    return:
    pop ebx
    push ebx
    adress of text
    mov eax
    ,сюда адрес Messagebox
    call eax
    eax-adress_OF_Messagebox

    push 0
    mov eax
    ,сюда адрес ExitProcess
    string
    :
    call return
    db "my Shellcode"
    end start
    на скрине все показано

    1
    http://i5.pixs.ru/storage/7/3/1/NoNamebmp_7771600_3314731.jpg
    2
    http://i5.pixs.ru/storage/7/4/9/NoName2bmp_6599566_3314749.jpg
    3
    http://i5.pixs.ru/storage/7/8/7/NoName445b_1140933_3314787.jpg
    4
    http://i5.pixs.ru/storage/8/0/1/NoName4bmp_9903130_3314801.jpg
    5
    http://i5.pixs.ru/storage/8/1/1/NoName44bm_8095798_3314811.jpg
    6
    http://i2.pixs.ru/storage/8/2/1/NoName4457_1345734_3314821.jpg

    http://i2.pixs.ru/storage/0/4/8/NoName3bmp_5718757_3315048.jpg
    не судите строго я Новичок в асме.
     
    #1190 SEKTOR3A, 10 Nov 2011
    Last edited by a moderator: 29 Mar 2012
  11. DeepBlue7

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

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    Вопросик...

    Как при помощи ассемблера можно найти симбол в стринге ?

    Например...

    004437A2 68 E8BF5200 PUSH 0052BFE8 ; ASCII "someevilstring"
    //найти в стринге, допустим, симбол '.
     
  12. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Code:
       mov bx,offset string
    l:
       cmp bx,'$'
       je exit
       cmp bx,60h ;код кавычки
       je smth
       inc bx
       jmp l
    
     
    1 person likes this.
  13. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    со строками работают индекс источника и приемника, так что пример не совсем верный.
     
    #1193 DooD, 16 Nov 2011
    Last edited: 16 Nov 2011
  14. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    ШТО? Строки - это обычный набор байт, с которым работают любые регистры, и код выше абсолютно верен, но не рационален, т.е. не оптимизирован. Регистры приемник и источник нужны для работы специальных команд, которые предназначены для работы с блоком байт (в него же и входят строки). В ассемблере вообще нету понятия "строки".



    Если под найти подразумевается вычислить позицию символа внутри текста либо строки, то есть специальная команда scasx
    Code:
    	mov al,'n'
    	mov edi,<адрес строки>
    	cld
    	repne scasb
    
    В edi, после выполнения, адрес искомого символа.
    Связка repne scasb меняет значение регистра ecx, декрементируется, и если он равняется нулю, то желаемый результат не будет достигнут. Потому можно перед выполнением записать в ecx число -1:
    Code:
    	xor ecx,ecx
    	dec ecx
    
    И в дополнение - флаг D задает направление поиска: если он опущен, то поиск производится с начала строки, если же поднят - с конца.

    Что касается
    вот конкретно под этот пример:
    Code:
    	xor ecx,ecx
    	dec ecx
    	mov al,27h ; '
    	mov edi,0052BFE8h
    	cld
    	repne scasb
    
    И вообще, нахуя я это написал, если всем требуется только тупо готовый код? Что-то я задумался. Замечтался.
     
    #1194 Sams, 16 Nov 2011
    Last edited: 16 Nov 2011
    1 person likes this.
  15. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    правильнее проводить работу в esi edi, а не в регистрах общего назначения.
     
  16. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    вопрос по криптору ,есть исходник криптора на асме скачал с инета для изучения,
    вопрос такой почему после крипта любого зверя антевирь арет примерно так ,если криптанул пинча то он его видет как пинча после крипта ,если криптанул индюка то после крипта индюк остается индюком то есть антевирь его видит как есть

    название криптора -=[ yoda's Crypter ]=-
     
  17. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    это протектор вроде,мб ав умеет его распаковывать,по тому и орет.
     
  18. Sams

    Sams Member

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

    SEKTOR3A, о каком крипторе идет речь, если вы не знаете столь примитивной и вседоступной информации, которая лежит наверное даже на википедии? Сами же писали, что новичок в АСМ, а уже беретесь за крипт пинчей? Да вам как минимум пол года только формат исполняемых файлов учить для получения поверхностных знаний. Это тоже, что и в первом классе неопределенный интеграл считать. И не нужно говорить, что делает всё ради знаний, и давить на то, что новичок и хотите научиться. В теме в шелл-кодом всё стало видно. Если вы надеетесь протий быстро учебный курс по написанию криптов, как это делается в книгах по Делфи "Хелло ворлд", что бы рубать баксы за крипт пичней, то это просто лольство.
    А в исходниках крипта yoda вы и 10 строк не разберете.
     
    #1198 Sams, 17 Nov 2011
    Last edited: 17 Nov 2011
  19. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0


    Спасибо, но думаю полгода многовато как то

    этих строк достаточно было изменить чтоб пинч заткнулся
    PHP:
    encrypt !
        
    mov eax,pMem
        mov ebx
    ,0

        call CryptPE
        popad
     
  20. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Подскажите по решению задачи из книги Кип Ирвин. Задача:"Напишите программу, которая бы генерировала и отображала последовательность случайных строк, каждая строка должна быть длиной не больше 10 символов, в диапазоне A-Z".

    Мне тут все понятно, кроме одного - как задать диапазон? Я думал, сделать это с помощью скан-кодов клавиш, т.е. (псевдокод)
    from (i=1eh;i<=2ch;i++)
    write i;

    Но не знаю, какая функция может вывести символ по его скан коду? стандартная функция из книги (writechar) выводит какую-то ерунду, если ей передать что-то типа 1eh.