Spinners Grant Flower and Marillier struck just when Marvan Atapattu (50) and Mahela Jayawardene (76) had threatened to put Sri Lanka on course for a big total on the opening day of fluctuating fortunes.
Thilan Samaraweera was unbeaten on eight and Chaminda Vaas on two at stumps as the hosts lost their last three wickets for 14 runs after electing to bat on a slow pitch.
Grant Flower dismissed well-set Atapattu and Jayawardene to finish with 2-57, while Marillier removed Kumar Sangakkara (29) and Hashan Tillakaratne (three) to grab 2-48.
Seamer Heath Streak got his lone wicket in the last session, having Russel Arnold (40) caught by wicket-keeper Andy Flower.
Jayawardene tried to restore balance with a 97-run stand for the fourth wicket with Arnold, counter-attacking vigorously during his 14th Test half-century.
Grant Flower, however, soon put his team back into the game when he held a return catch to dismiss Jayawardene, who struck nine fours in his 130-ball innings.
Marillier also kept the pressure from the other end as Sri Lanka made a cautious start, scoring 74 in the first session against a tight Zimbabwean seam attack.
The hosts stepped up the run-rate in the second as they gathered 101, but also lost two big wickets to Grant Flower and Marillier.
Grant Flower provided the breakthrough when he removed Atapattu, pulling straight to Gavin Rennie who took a superb reflex catch at silly mid-on.
Atapattu was involved in two useful stands, adding 50 for the opening wicket with skipper Sanath Jayasuriya (28) and 57 for the next with left-handed Kumar Sangakkara (29).
Atapattu batted cautiously, taking 167 minutes for his 10th Test half-century in 54 matches.
Sangakkara did not last long, inside-edging a Marillier delivery on to his wickets while trying to sweep.
Jayasuriya, struggling to score freely in the opening hour, fell when he had started playing shots. He made 28 before chopping a Travis Friend delivery on to his stumps in the 17th over.
Sri Lanka went into into the match with two specialist spinners, including Upul Chandana to provide support to Muttiah Muralitharan.
Leg-spinner Chandana came in place of an unfit left-arm seamer Nuwan Zoysa for the only change from the team that won the second Test by an innings and 94 runs at Kandy on Monday.
Muralitharan, with 395 wickets in 71 Tests, is set to become the youngest and quickest to reach the 400-mark as the pitch is expected to favour spinners. He has already grabbed 21 in two matches against the tourists.
Zimbabwe brought in opener Dion Ebrahim in place of Hamilton Masakadza, released for the under-19 World Cup in New Zealand.
SRI LANKA (1st innings)
M.Atapattu c Rennie b G.Flower 50
S.Jayasuriya b Friend 28
K.Sangakkara b Marillier 29
M.Jayawardene c and b G. Flower 76
R.Arnold c A.Flower b Streak 40
H.Tillakaratne c A.Flower b Marillier 3
T.Samaraweera not out 8
C.Vaas not out 2
EXTRAS (lb-4 nb-3) 7
TOTAL (for six wickets) 243
FALL OF WKTS: 1-50 2-107 3-125 4-222 5-229 6-236
TO BAT: U.Chandana, B.Fernando, M.Muralitharan.
BOWLING (to date): Streak 19-6-57-1 (3nb), Friend 13-3-31-1, Olonga 8-1-30-0, G.Flower 25-5-57-2, Marillier 21-4-48-2, Gripper 4-0-16-0.
ZIMBABWE: T.Gripper, D.Ebrahim, S.Carlisle, G.Rennie, A.Flower, G.Flower, C.Wishart, H.Streak, D.Marillier, T.Friend, H. Olonga.—Reuters