Supuesto buffer overflow con printf en MASM32

Iniciado por Hesp, 9 Junio 2012, 00:06 AM

0 Miembros y 1 Visitante están viendo este tema.

Hesp

Muy buenas.

Este sencillo programa da un fallo exactamente en el printf (no al compilar), imagino que es por no poner el correcto tamaño en: %d se que
Código (asm) [Seleccionar]
SysTime.wYear es
Código (asm) [Seleccionar]
word, pero no se a que correspondería en C, he probado toda las combinaciones, así que espero que me digais que hago mal  :huh:

Código (asm) [Seleccionar]
include masm32rt.inc

.data?

SysTime SYSTEMTIME <?>

.data

.code
start:
invoke GetSystemTime, addr SysTime
printf("%d\n", SysTime.wYear);
inkey "Press a key to continue ..."
invoke ExitProcess, NULL
end start

x64core

printf en MASM? estoy seguro que e visto una printf en MASM pero creo que es de Basic.inc hecho por jochen
o a menos que estes enlazando las librerias de VC a MASM?

Hesp

Cita de: RHL en  9 Junio 2012, 00:15 AM
printf en MASM? estoy seguro que e visto una printf en MASM pero creo que es de Basic.inc hecho por jochen
o a menos que estes enlazando las librerias de VC a MASM?

Gracias por contestar.

Se trata de la High Level Macro de MASM32 en Console Mode Macros (en el HELP de MASM32)

No se si la macro esta bug, o el fallo es mio lo mas seguro xD

x64core

vaya, la verdad quiza es que esta en las nuevas versiones de MASM porque yo tengo el viejo MASM
pero si no es la de hecho por jochen entonces:

INVOKE    crt_printf, ADDR formato, argumento1, argumento2

es declarada como crt_printf y hay un wrapper por printf.
eso debería funcionar  :)

Hesp

Bien, despues de pedir ayuda en el foro de MASM32 ya que se trataba de un problema mas bien especifico de MASM32, obtuve la solución:

Citarthe problem is probably, that wYear is a WORD, which cause the invoke macro to produce bad code -> move the value to a 32Bit GPR and then pass it to the macro:
Código (asm) [Seleccionar]
movzx edx,SysTime.wYear
printf(...,edx)

Así que aplicándolo al code seria:

Código (asm) [Seleccionar]
include masm32rt.inc

.data?

SysTime SYSTEMTIME <>

.data

.code
start:
invoke GetSystemTime, addr SysTime
movzx edx, SysTime.wYear
printf("%d\n", edx);
inkey "Press a key to continue ..."
invoke ExitProcess, NULL
end start


Muchas gracias!!

x64core

como dije desde un principio ese printf es de basic.inc de jochen , hasta el mismo te respondio  ::)