Willing to pay for a simple "single-held-button-time-counter"

  sprintf(Upmsg, "UP %01d:%02d:%02d", Up.hours, Up.minutes, Up.seconds);

You want a one character field, with leading 0s as needed. Just how many leading 0s might be needed to pad the field to one character?

You use button in loop() and in the (stupidly named) IntCallback() function, which is an interrupt service routine. Variables shared between ISRs and other function MUST be declared volatile.

Your ISR is triggered when the pin changes state, and yet you don't care, in the ISR, what state the pin is now in.

What, EXACTLY, are you trying to measure?