Sri Lanka spinner Rangana Herath captured three early wickets to rattle Zimbabwe's top-order after the hosts conceded a 10-run lead on the third day of their one-off Test in Colombo on Sunday.
Zimbabwe were left reeling at 23 for four at lunch with Sean Williams unbeaten on one and the visitors leading by just 33 runs in their second innings.
Skipper Graeme Cremer gave Zimbabwe the lead after his maiden five-wicket haul helped bowl out Sri Lanka for 346, but the visiting batsmen let the small advantage slip.
It was Herath's left-arm spin that undid the fine work from leg-spinner Cremer (5-125), as the veteran bowler took the wickets of Hamilton Masakadza, Tarisai Musakanda and Regis Chakabva.
Off-spinner Dilruwan Perera joined forces to get the prized wicket of first-innings centurion Craig Ervine for five at the stroke of lunch.
Earlier, Cremer bowled overnight batsman Asela Gunaratne for 45 as the Sri Lankan innings folded midway through the morning session.
Gunaratne, who will not field this match after injuring his hamstring in the first innings, played with grit after being dropped down the batting order.
He formed crucial partnerships along the way, including a 48-run eighth-wicket stand with overnight partner Herath (22) to lift the hosts from a precarious 274-7 on day two.
Despite needing medical assistance during his 110-ball knock, Gunaratne helped Sri Lanka add 53 crucial runs to their overnight score of 293-7.