Standard 5-field cron has no operator for "last day of the month" — months have different lengths (28–31 days), and cron's day-of-month field can't express that conditionally. There's no single expression that's correct for every month.
The common workaround is 0 0 28-31 * * (run every day from the 28th through the 31st), combined with a check inside the job itself: compare tomorrow's date to day 1, and exit early unless it matches. That way the job only actually does its work on the true last day, whatever that is for the current month.