Saints took a shock lead at Ibrox through Graham Carey, who is on loan from Celtic, before McCulloch netted either side of the break and Nacho Novo put the gloss on the win late on.
McCulloch retained his place in the team after limping out of Sunday's Old Firm derby, meaning Maurice Edu had to settle for a place on the bench despite his dramatic late winner against Celtic.
Rangers were without Madjid Bougherra after the defender failed to recover from injury and he was replaced by Danny Wilson, while DaMarcus Beasley started ahead of Kyle Lafferty, who dropped out of the squad.
Saints made two changes from their goalless draw against Hamilton, with Carey and Garry Brady drafted into the starting line-up.
The Buddies attempted to put their hosts under pressure early on when Michael Higdon tried his luck with an audacious strike which dipped over the crossbar and failed to trouble Allan McGregor too much in the Rangers goal.
The goalkeeper was called into action to block at close range from Steven Thomson after David Barron had teed up the shot.
Rangers had a decent chance to open the scoring when Beasley was fouled on the edge of the box by Barron but Steven Davis' resultant free-kick into the packed box was hooked to safety.
The home side were then denied twice by the woodwork. Davis came much closer this time when his thunderous set-piece from 20 yards out smacked off the crossbar and back into play.
Sasa Papac pounced on a loose ball and attempted to dispatch an angled drive from just outside the six-yard box into the back of the net, only to see the shot hit the near post.
Instead, the Scottish champions were stunned when Saints took the lead with 30 minutes gone. David Weir fouled Higdon 25 yards out and Carey curled the free-kick past the helpless McGregor.
But the celebrations were short-lived when Rangers levelled just two minutes later. Kevin Thomson's free-kick sparked a scramble before the ball broke for McCulloch to rifle home from eight yards.
McCulloch then turned provider to set up Wilson for a superb volley in front of goal that Paul Gallacher did well to block on the stroke of half-time.
Rangers surged ahead within a minute of the restart, with McCulloch claiming his second of the day.
A long ball from Papac to the back post was nodded on by Kris Boyd for Kenny Miller, who rolled the ball into the path of McCulloch who lashed it past Gallacher from the edge of the box.
Beasley was unfortunate not to add his name to the scoresheet when he found himself with only the goalkeeper to beat at the back post but was denied by an alert Gallacher.
Novo and Edu were both thrown into the action and the former ensured there would be no late fightback from Saints when he netted with 12 minutes to go.
A Davis free-kick sailed over the head of Boyd before dropping nicely for Novo to flick past Gallacher at the back post.
The win allowed Rangers to increase the already massive gulf between themselves and Celtic in the SPL, before their Glasgow rivals travel to Falkirk on Sunday.