En general .. para detectar errores de ese estilo con imagenes y cabeceras HTTP en general .. debes ir deshabilitando (comentando) las líneas de tu código referente a header() .. y las de ImagePng($img);
También es bueno ejecutar tu script passwd.php por separado bajo una llamada directa por el URL:
http://www.tal.tal/passwd.php si ahí obtienes tu X .. continua comentado los header() ..y la otra función. El objetivo es "ver" algún tipo de error, en función de ese error ya veremos que puedes hacer.
Un saludo,