Jordan Bachynski had 19 points, one shy of his career high, and nine rebounds to help the Sun Devils (9-20, 5-12 Pac-12) end a losing streak at four games.
Freshman Byron Wesley set a career best for the second consecutive game with 22 points for the Trojans (6-23, 1-15), who lost their seventh game in a row. Maurice Jones had 12 points for USC.
Wesley had 18 points in the Trojans' loss at Arizona on Thursday night.
USC didn't score a field goal in the last 11 minutes 16 seconds after going ahead, 47-45, on Wesley's basket.
Chanse Creekmur's three-point shot put Arizona State up for good, 48-47, with 10:21 to go, then Trent Lockett stole Wesley's pass for a breakaway dunk and Bachynski made one of two free throws to make it 51-47 with 9:07 remaining. Wesley's two free throws cut it to 51-49 and Lockett's rebound basket put Arizona State up 53-49 with 7:44 to go.
The Sun Devils didn't score again until Colvin's drive. Wesley made one of two free throws and Greg Allen made two to cut Arizona State's lead to 53-52 with 5:41 left.
Finally, Colvin drove toward the hoop, was cut off and tossed the ball toward the rim, drawing a foul from James Blasczyk as the ball somehow went in. He made the free throw to boost the lead back to four points and the Trojans misfired two times at the end.
The Sun Devils led, 31-25, after the first half.
After Wesley's layup put USC ahead, 15-14, Arizona State used a 16-4 run to go up, 30-19, with 3:17 remaining. Colvin and Jonathan Gilling made three-point baskets in the run and the Sun Devils made eight of 10 free throws.
Wesley brought the Trojans back by scoring twice and Garrett Jackson made a three-pointer from the corner to cut the lead to 30-25 with 49 seconds left in the half.
Jones' three-pointer, followed by Wesley's three-point play, put USC up, 39-38, with 131/2 minutes to go.