Zimbabwe skipper Graeme Cremer claimed three wickets to dent Sri Lanka's first innings reply on the second day of the one-off Test in Colombo on Saturday.
Cremer's leg-spin and two crucial run outs left Sri Lanka reeling at 7-293 at stumps. Asela Gunaratne (24) and Rangana Herath (5) were at the crease with the hosts still trailing Zimbabwe by 63 runs.
Gunaratne, who came down the batting order at number eight after picking up a hamstring injury while fielding, put up sturdy resistance in the final few overs of the day.
"The wicket has got drier and the leg-spinner (Cremer) is taking lot of turn. We have to bat well and we need to make sure that we get to 350," said Herath, who had taken five wickets to help dismiss Zimbabwe for 356.
"We had a good start, but they fought back well. We are still behind by 63 runs and we need to knock off that deficit," Herath told reporters.
Zimbabwe coach Heath Streak believes the visitors are in a "nice position", adding that anything between 250 and 280 would be a tough fourth-innings chase on this pitch.
"Any sort of lead is going to be very valuable on this track. It's going to be an interesting day's play tomorrow. Hopefully we can pick up those wickets quickly," Streak said.
Top Sri Lankan batsmen faltered against Cremer's wily wrist spinners including captain Dinesh Chandimal falling to his opposite number after a well-made 55.
Chandimal's wicket ended a 96-run stand for the fourth wicket with Angelo Mathews (41), who quit the captaincy this week after Sri Lanka's loss in the one-day series against Zimbabwe.
Cremer, who had got Kusal Mendis caught behind for 11 before tea, struck twice in the final session of play to put the hosts in trouble at 238-6.
Dilruwan Perera, who made a gritty 33 with 2 fours and as many sixes, was run out after hesitating on a single with his hamstrung partner Gunaratne.
Another unlucky run out early in the innings saw the back of opening batsman Upul Tharanga, who gave Sri Lanka a solid start with his brisk 71.
Tharanga fell short of his crease while backing up to a straight drive by Chandimal as the ball grazed past the fingers of paceman Donald Tiripano.
Tiripano's lucky fielding effort came after he got Zimbabwe's first breakthrough in Dimuth Karunaratne (25) in his first over after lunch, ending an 84-run opening partnership.
Earlier the Zimbabwe innings lasted just 4.4 overs of the morning session, adding only 12 runs to their overnight score. Batsman Craig Ervine top-scored with 160.
Left-arm spinner Herath returned with an impressive 5-116, his 30th five-wicket haul in 81 Tests.