The win snapped a two-game Pac-12 losing streak for the Ducks (13-6, 3-3), who have won their last nine games against the Trojans (9-9, 1-5). Dillon Brooks finished with 12 points for Oregon, and Jalil Abdul-Bassit had 11 off the bench.
Julian Jacobs and Katin Reinhardt led USC with 16 points each. Jordan McLaughlin added 14 and Nikola Jovanovic had 10 to go with 10 rebounds.
Jordan Bell, who went to the bench late in the game after taking an elbow to the face, finished with 13 rebounds as the Ducks grabbed a 45-37 edge on the boards.
Oregon finished 25 for 31 from the foul line, to just 11 for 18 for the Trojans. After trailing by as many as 15 points twice early in the second half, USC fought back behind Reinhardt and Jovanovic to pull even at 61 with 5:40.
However, the Trojans couldn't score again as the Ducks were seven for eight on free throws during a clinching 9-0 run over the next five minutes for a 70-61 lead.
Oregon made 12 of its last 14 free throws after USC had tied the score.
The Ducks opened the game on a 16-2 run by hitting six of their first seven shots and with Bell, the Pac-12's second-leading shot blocker, rejecting two of USC's first six attempts. The Trojans climbed back with a 12-2 burst, but weren't able to pull closer than four points.