Snap object with assigned rotation to surface
The problem here is that you've applied the rotation transformations to your button, or rotated the button around in edit mode, causing the object's local axes to no longer line up with what you consider to be upright for your object.
To show you what I mean, here are the local axes for your button object:



And here are the normal axes for the face you're trying to snap the button on: 



What Blender is doing when you're snapping the object is aligning the local XYZ-axes of the button to that of the cube. However, your desired orientation doesn't match that of the object's orientation, so when the local axes are aligned to the face of the cube, the button is at an angle to the surface (in other words, the XYZ axes in the first picture are rotated to match that in the second picture).

There are different methods you can try to use to manually rotate the object back into position, but in this case, it would be easiest to just recreate your button.

If you were unable to recreate your button, you can try to rotate the origin of the object so that it matches what you consider an "upright" position for it. To do this, go to the Active tool and Workspace settings tab and select Options > Transform > Affect Only > Origins. I would not recommend this here, as this will cause unwanted movement of parented objects.



The second way to realign your button is to enter edit mode and rotate the entire object in there since transformations done in edit mode do not affect the object's origin and hence, the object's local axes.

PS: I would consider making the black part of the button the parent, not the white part. If you try to animate the white part by pushing it down, the black part will move with it in the way you have it configured right now.