St. Johnstone 0 Rangers 2
The Gers cashed in on a Stuart McCaffrey own goal minutes from the interval and Spanish sub Nacho Novo ended the First Division leaders' 14-game unbeaten run with the second.
Steven Naismith returned to the Gers line-up for the first time since damaging a cruciate in a semi-final clash with St Johnstone at Hampden Park nine months ago.
Perth winger Gavin Swankie opted to test Gers keeper Allan McGegor early with a dipping free-kick which the alert Scotland international fended off.
Saints midfielder Chris Millar was cautioned for a late lunge which floored Pedro Mendes in the fourth minute.
The home team swept forward and when striker Andy Jackson teed-up Liam Craig the midfielder's 20 yard snapshot was tipped to safety by McGregor.
Saints created an even better chance in the 33rd minute when a Derek Holmes knockdown found Jackson lurking unmarked, only for McGregor to block the centre's 12-yard shot and prevent his team falling behind.
Perth skipper Kevin Rutkiewicz was yellow-carded for a wild tackle which caught Naismith, with Millar, Mendes and Madjid Bougherra joining him.
But despite failing to ignite the Glasgow side snatched a 42nd minute lead when Perth defender Stuart McCaffrey's attempted close-range clearance flew high into his own net.
Veteran keeper Alan Main recklessly chased an overhit Naismith cross beyond his penalty area, but instead of booting it into the stand he was left trying to make up lost ground when Steve Davis fed Kris Boyd.
The Birmingham City target drilled in a low cross and while Kenny Miller failed to provide the finish, the luckless McCaffrey did the job for him.
Saints couldn't recover their earlier composure and seven minutes after coming on, sub Novo rolled home a simple second in the 78th minute after being set-up by Davis in a decisive counter attack.