Hola a todos. Necesitaría ayuda para poder traducir una función de ensamblador (no hay binarios) a C. La verdad es que estoy un poco perdida y no se como empezar. Así que necesitaria ayuda. Este es el codigo
Disculpad, lo borro poque esta incompleto. Cuando lo localice completo lo vuelvo a publicar
Gracias a todos
Adela
https://retdec.com/decompilation/
Ou Ida pro plugins ....
Cita de: Geovane en 14 Febrero 2018, 19:05 PM
https://retdec.com/decompilation/
Ou Ida pro plugins ....
Geovane lo contrario, ella quiere ASM -> C
Cita de: adelaperez en 14 Febrero 2018, 17:55 PM
Hola a todos. Necesitaría ayuda para poder traducir una función de ensamblador (no hay binarios) a C. La verdad es que estoy un poco perdida y no se como empezar. Así que necesitaria ayuda. Este es el codigo
0x0000054d <+0>: lea ecx,[esp+0x4]
0x00000551 <+4>: and esp,0xfffffff0
0x00000554 <+7>: push DWORD PTR [ecx-0x4]
0x00000557 <+10>: push ebp
0x00000558 <+11>: mov ebp,esp
0x0000055a <+13>: push ebx
0x0000055b <+14>: push ecx
0x0000055c <+15>: sub esp,0x10
0x0000055f <+18>: call 0x450 <__x86.get_pc_thunk.bx>
0x00000564 <+23>: add ebx,0x1a9c
0x0000056a <+29>: mov DWORD PTR [ebp-0x10],0x0
0x00000571 <+36>: lea eax,[ebx-0x19a0]
0x00000577 <+42>: mov DWORD PTR [ebp-0x14],eax
0x0000057a <+45>: sub esp,0xc
0x0000057d <+48>: push DWORD PTR [ebp-0x14]
0x00000580 <+51>: call 0x3e0 <strlen@plt>
0x00000585 <+56>: add esp,0x10
0x00000588 <+59>: mov DWORD PTR [ebp-0x18],eax
0x0000058b <+62>: mov DWORD PTR [ebp-0xc],0x0
0x00000592 <+69>: jmp 0x5ad <main+96>
0x00000594 <+71>: mov edx,DWORD PTR [ebp-0xc]
0x00000597 <+74>: mov eax,DWORD PTR [ebp-0x14]
0x0000059a <+77>: add eax,edx
0x0000059c <+79>: movzx eax,BYTE PTR [eax]
0x0000059f <+82>: movsx eax,al
0x000005a2 <+85>: imul eax,DWORD PTR [ebp-0x18]
0x000005a6 <+89>: add DWORD PTR [ebp-0x10],eax
0x000005a9 <+92>: add DWORD PTR [ebp-0xc],0x1
0x000005ad <+96>: mov eax,DWORD PTR [ebp-0xc]
0x000005b0 <+99>: cmp eax,DWORD PTR [ebp-0x18]
0x000005b3 <+102>: jl 0x594 <main+71>
0x000005b5 <+104>: sub esp,0x8
0x000005b8 <+107>: push DWORD PTR [ebp-0x10]
0x000005bb <+110>: lea eax,[ebx-0x1992]
0x000005c1 <+116>: push eax
0x000005c2 <+117>: call 0x3d0 <printf@plt>
0x000005c7 <+122>: add esp,0x10
0x000005ca <+125>: mov eax,0x0
0x000005cf <+130>: lea esp,[ebp-0x8]
0x000005d2 <+133>: pop ecx
0x000005d3 <+134>: pop ebx
0x000005d4 <+135>: pop ebp
0x000005d5 <+136>: lea esp,[ecx-0x4]
0x000005d8 <+139>: ret
Gracias a todos
Adela
Así como está es un trabajo de herrero, se ve que es una función pero hay referencias que no están incluidas en lo que compartes pues apuntan a otras direcciones de memoria del ejecutable, lo que se ve a simple vista es que se calcula un tamaño, ha de ser la string de entrada del usuario (carece referencias de scanf o gets) y luego tras una operación las imprime
Ola
tens o ASM, mas não tens o binário ? como isso, qual origem ?
No, lo siento, sólo el ASM
Adela
Deberías ponernos un poco en situaccion de donde sale ese código?
Cambien como dice .:UND3R:. este codigo esta incompleto
Hola aparentemente el codigo esta completo porque el desensamblado corresponde al MAIN de un programa en C y acaba en un retorno de control. Parece ser que el código no pertenece a un ejecutable pero probablemente corresponda a una librería que carga otro programa.
El mayor problema que veo no radica en el código ASM el cual si que tienes y no hay problema.
El problema viene respecto al valor de los punteros y los registros ya que sin ellos no puedes saber que hace el programa en este bucle
0x00000594 <+71>: mov edx,DWORD PTR [ebp-0xc]
0x00000597 <+74>: mov eax,DWORD PTR [ebp-0x14]
0x0000059a <+77>: add eax,edx
0x0000059c <+79>: movzx eax,BYTE PTR [eax]
0x0000059f <+82>: movsx eax,al
0x000005a2 <+85>: imul eax,DWORD PTR [ebp-0x18]
0x000005a6 <+89>: add DWORD PTR [ebp-0x10],eax
0x000005a9 <+92>: add DWORD PTR [ebp-0xc],0x1
0x000005ad <+96>: mov eax,DWORD PTR [ebp-0xc]
0x000005b0 <+99>: cmp eax,DWORD PTR [ebp-0x18]
0x000005b3 <+102>: jl 0x594 <main+71>
No sabemos que condiciones tiene
eso parece un main donde existe un string cualquiera (hola)
el programa reserva espacio para llamar a la api strlenght, luego compara si es igual (mueve el valor 1),se ve algo mal porque lo normal es ver alguna variable declarada (debe estar en esas rutinas de dword
si no es igual osea es mayor o menor entonces va a otro lado
y en todos los casos debería imprimir el valor por pantalla (printf@plt)
saludos Apuromafo