|
Mostrar Temas
|
Páginas: [1]
|
1
|
Programación / ASM / [ASM]Algoritmo de Ordenacion Quicksort
|
en: 24 Junio 2009, 04:04 am
|
Bueno aqui les dejo una traduccion a ensamblador del algoritmo de QuickSort me costo algo de trabajo y estuve un buen depurando pero por fin salio. Lo malo es que solo funciona con numeros de 32 bits positivos pero se puede arreglar para que funcionen con bytes y words (ahora lo de negativos no se intente cambiar jl y jg por jb y ja pero me los pone como mayores que cualquier positivo) Si de casualidad alguien no entiende el codigo que me diga y le pongo comentarios format pe console include '\fasm\include\win32ax.inc' entry start .data vector dd 32,9,11,5,99,3,1,2,5,12,100,4365 formato db '%i %i %i %i %i %i %i %i %i %i %i %i',13,10,0 .code start: call Dump push 11 push 0 push vector call quicksort call Dump ret quicksort: push ebp mov ebp,esp push esi push ebx push ecx push edx mov ebx,dword[ebp + 12] mov ecx,dword[ebp + 16] cdq mov eax, ebx add eax, ecx push ecx mov ecx,2 div ecx pop ecx xchg edx,eax mov esi, [ebp + 8] mov edx,dword[esi + edx * 4] qs@L1: qs@L1@L1: cmp dword[esi + ebx * 4],edx jge qs@L1@L1@out inc ebx jmp qs@L1@L1 qs@L1@L1@out: qs@L1@L2: cmp dword[esi + ecx * 4],edx jle qs@L1@L2@out dec ecx jmp qs@L1@L2 qs@L1@L2@out: qs@L1@IF1: cmp ebx, ecx jg qs@L1@IF1@out mov eax, dword[esi + ebx * 4] xchg eax, dword[esi + ecx * 4] mov dword[esi + ebx * 4], eax inc ebx dec ecx qs@L1@IF1@out: cmp ebx,ecx jle qs@L1 qs@L1@out: qs@IF1: cmp dword[ebp + 12],ecx jge qs@IF1@out push ecx push dword[ebp + 12] push esi call quicksort qs@IF1@out: qs@IF2: cmp ebx, dword[ebp + 16] jge qs@IF2@out push dword[ebp + 16] push ebx push esi call quicksort qs@IF2@out: pop edx pop ecx pop ebx pop esi pop ebp retn 12 Dump: pushad mov edi,vector push dword[edi + 11 * 4] push dword[edi + 10 *4 ] push dword[edi + 9 * 4] push dword[edi + 8 * 4] push dword[edi + 7 * 4] push dword[edi + 6 * 4] push dword[edi + 5 * 4] push dword[edi + 4 * 4] push dword[edi + 3 * 4] push dword[edi + 2 * 4] push dword[edi + 1 * 4] push dword[edi] push formato call [printf] add esp,52 popad ret section '.idata' import data readable library msvc,'msvcrt.dll' import msvc,printf,'printf'
los parametros se pasan por la pila y son asi quicksort(int *vector, int izq, int der)
|
|
|
2
|
Programación / ASM / [ASM]Syscall no me funciona + fallo de segmentacion
|
en: 14 Junio 2009, 06:11 am
|
hola tengo un problema, estoy tratando de aprender algo de las syscalls de linux con asm pero tengo un problema, mi codigo no funciona, el comportamiento es el siguiente. se supone que pide un texto e imprime su longitud pero sucede: pide texto, falla de segmentacion la consola toma lo que tecle y me dice como que si lo hubiera escrito como un comando ejemplo: si en el programa pongo hola no me imprime nada y despues la terminal me dice bash: ola comando no encontrado mi code es el siguiente include '/home/nyox/include/linux.inc' format ELF executable entry start segment readable executable start: mov eax,SYS_READ mov ebx, STDIN mov ecx,texto mov edx,size int 0x80 push texto call strlen push eax push numtexto call itoa push numtexto call strlen mov edx,eax mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, numtexto int 0x80 mov eax, SYS_EXIT xor ebx,ebx int 0x80 strlen: push edi xor ecx,ecx mov edi, [esp + 8] not ecx xor eax,eax cld repne scasb not ecx pop edi add eax,ecx dec eax retn 4 strrev: push ebp mov ebp,esp push edi mov edi,[ebp + 8] push edi call strlen xor ecx,ecx dec eax jmp LL1 LL0: dec eax inc ecx cmp ecx,eax jge LL2 LL1: mov dl,byte[edi + ecx] xchg byte[edi + eax],dl mov byte[edi + ecx],dl jmp LL0 LL2: pop edi pop ebp retn 4 itoa: push ebp mov ebp,esp pushad mov edi,[ebp + 8] mov eax,[ebp + 12] mov ebx,10 L@@1: xor edx,edx div ebx xchg eax,edx or eax,48 stosb mov eax,edx cmp eax,0 jnz L@@1 inc edi mov byte[edi],al push dword[ebp + 8] call strrev popad pop ebp retn 8 numtexto db 5 dup(0) texto db 10 dup(0) size dd 9
SYS_WRITE = 4 SYS_READ = 3 STDIN = 0 STDOUT = 1 el codigo rula perfectamente en win aunque no es lo mismo porque uso printf y scanf asi que supongo que mi error esta en el uso de las syscalls a ver si me pueden echar una mano el code en win es format PE console entry start include 'c:\fasm\include\win32ax.inc' .code start: invoke scanf,"%s",texto push texto call strlen push eax push numtexto call itoa push numtexto call strlen invoke printf,numtexto leave ret strlen: push edi xor ecx,ecx mov edi, [esp + 8] not ecx xor eax,eax cld repne scasb not ecx pop edi add eax,ecx dec eax retn 4 strrev: push ebp mov ebp,esp push edi mov edi,[ebp + 8] push edi call strlen xor ecx,ecx dec eax jmp LL1 LL0: dec eax inc ecx cmp ecx,eax jge LL2 LL1: mov dl,byte[edi + ecx] xchg byte[edi + eax],dl mov byte[edi + ecx],dl jmp LL0 LL2: pop edi pop ebp retn 4 itoa: push ebp mov ebp,esp pushad mov edi,[ebp + 8] mov eax,[ebp + 12] mov ebx,10 L@@1: xor edx,edx div ebx xchg eax,edx or eax,48 stosb mov eax,edx cmp eax,0 jnz L@@1 inc edi mov byte[edi],al push dword[ebp + 8] call strrev popad pop ebp retn 8 section '.data' data readable writeable numtexto db 5 dup(0) texto db 10 dup(0) size dd 9 section '.idata' import data readable library msvc,'msvcrt.dll' import msvc,printf,'printf',scanf,'scanf'
no cambia mucho solo el uso de entrada y salida gracias de antemano
|
|
|
3
|
Programación / Ingeniería Inversa / mi primer crackme
|
en: 21 Mayo 2009, 00:12 am
|
Bueno me estuve dando una vuelta por este subforo y me parecio interesante el tema de los crackmes, asi que aqui les dejo mi primer crackme en C. La respuesta es un poco obvia, pero nunca habia intentado hacer un programa de estos. http://www.megaupload.com/?d=M51KHACBme estare leyendo los tutos porque no pude resolver el de invisible y eso que todos dicen que esta facil. A ver si mis pocos conocimientos de asm me ayudan espero les sirva aunque sea para distraerse un rato P.D un user incorrecto o pass incorrecta provocan una exepcion. La unica manera de que no pase es poner el verdadero user y pass 1.-Høl¥ primero Arkangel_0x7C5 segundo
|
|
|
4
|
Programación / ASM / [ayuda]con un codigo asm,
|
en: 19 Mayo 2009, 04:47 am
|
Hola tengo un problema, este programa pide el nombre de un proceso y despues procede a terminarlo, pero no lo hace la funcion Process32First me devuelve nul y no se porque, yo creo que pase bien los parametros, por favor ayudenme a encontrar el error, esta un poco enredado porque soy novato, lo organize lo mejor que pude format pe console entry main include 'c:\fasm\include\win32ax.inc' .data ;Data begin--------------------------------------------------\ struct PROCESSENTRY32 ; dwSize dd ? ; cntUsage dd ? ; th32ProcessID dd ? ; th32DefaultHeapID dw ? ; th32ModuleID dd ? ; cntThreads dd ? ; th32ParentProcessID dd ? ; pcPriClassBase dd ? ; dwFlags dd ? ; szExeFile rb MAX_PATH ; ends ; pInfo PROCESSENTRY32 ; hProcess dd ? ; hProcesses dd ? ; TH32CS_SNAPPROCESS equ 0x00000002 ; NORM_IGNORECASE equ 0x00000001 ; LOCALE_USER_DEFAULT equ 0x0400 ; CSTR_EQUAL equ 0x2 ; PROCESS_TERMINATE equ 0x0001 ; lpExe db 256 dup(0) ; ;Data ends---------------------------------------------------/ .code ;Code Begins-------------------------------------------------\ main: ; invoke printf,"Escriba el proceso a terminar: " ; invoke scanf,"%s",addr lpExe ; xor eax,eax ; push eax ; push TH32CS_SNAPPROCESS ; call [CreateToolhelp32Snapshot] ; cmp eax,INVALID_HANDLE_VALUE ; jne NoE1 ; push 1 ; call ErrorReport ; jmp main@Salir ; NoE1: ; mov [hProcesses],eax ; push pInfo ; push [hProcesses] ; call [Process32First] ; cmp eax,FALSE ; jne NoE2 ; push 2 ; call ErrorReport ; jmp main@Salir ; NoE2: ; bucle1: ; push 0xFFFFFFFF ; push lpExe ; push 0xFFFFFFFF ; push pInfo.szExeFile ; push NORM_IGNORECASE ; push LOCALE_USER_DEFAULT ; call [CompareString] ; cmp eax,CSTR_EQUAL ; jne Next ; push pInfo.th32ProcessID ; push FALSE ; push PROCESS_TERMINATE ; call [OpenProcess] ; cmp eax,0 ; je Next ; mov [hProcess],eax ; push 0 ; push [hProcess] ; call [TerminateProcess] ; push [hProcess] ; call [CloseHandle] ; ; Next: ; push pInfo ; push [hProcesses] ; call [Process32Next] ; cmp eax,FALSE ; je FinBucle1 ; jmp bucle1 ; FinBucle1: ; push [hProcesses] ; call [CloseHandle] ; main@Salir: ; ; leave ; ret ; ;Main Ends'''''''''''''''''''''''''''''''''''''''''''''''''''; ;ErrorReport Begins''''''''''''''''''''''''''''''''''''''''''; ; proc ErrorReport,raz ; call [GetLastError] ; cmp [raz],1 ; je @0 ; cmp [raz],2 ; je @1 ; cmp [raz],3 ; je @2 ; jmp @def ; @0: ; invoke printf,"Error Handle Invalido code %d ",eax ; jmp Error@Salir ; @1: ; invoke printf,"Error cannot open the process ",eax ; jmp Error@Salir ; @2: ; jmp Error@Salir ; @def: ; invoke printf,"Error desconocido code %d ",eax ; Error@Salir: ; call [GetLastError] ; invoke printf,"%d",eax ; leave ; ret ; endp ; ;ErrorReports ends'''''''''''''''''''''''''''''''''''''''''''; ;.code ends--------------------------------------------------/ section '.idata' import data readable library k32,'kernel32.dll',msv,'msvcrt.dll' import k32,CreateToolhelp32Snapshot,'CreateToolhelp32Snapshot',\ GetLastError,'GetLastError',Process32First,'Process32First',\ CompareString,'CompareStringA', OpenProcess,'OpenProcess',\ TerminateProcess,'TerminateProcess', \ CloseHandle,'CloseHandle',Process32Next,'Process32Next' import msv,printf,'printf',scanf,'scanf'
saludos
|
|
|
5
|
Programación / ASM / [Ayuda]con punteros en asm
|
en: 12 Mayo 2009, 19:44 pm
|
Hola a todos quiero aprender a programar en asm, porque he oido que es el lenguaje mas rapido que hay, y tambien estoy enterado de todas sus desventajas. Pero bueno mi duda es esta como puedo usar punteros en asm. Ya se que es un poco pronto porque estoy empezando. Pero esto de practicar mientras aprendo me ha servido, antes mi idea es hacer una funcion para sacar la longitud de una cadena usando el caracter nulo. Para esto necesito hacer un puntero que apunte al principio de una cadena para irlo incrementndo pero no se nada estoy en cero. Bueno se lo basico como los registros, algunas instrucciones pero hasta ahi nada mas. No estoy pidiendo que me den una funcion hecha sino que me guien a como la puedo hacer yo.
gracias
|
|
|
|
|
|
|