South Africa reached 201-4 to close to within 55 runs of Zimbabwe's first-innings total with six wickets remaining on the second day of the Test match in Harare.
After bowling out the hosts for 256 in the fourth over of the morning, the Proteas made steady progress in the one-off clash.
Number 11 John Nyumbu was the final Zimbabwe wicket to fall, Dale Steyn taking his fifth wicket of the innings as he drew a faint edge down the leg side to wicketkeeper Quinton de Kock.
South Africa made a good start to their response, passing 50 without losing a wicket.
Alviro Petersen was the first man to go, and the opener could consider himself a little unfortunate after he edged an attempted sweep from Nyumbu.
The ball hit wicketkeeper Richmond Mutumbami, who leapt to his right to take a dramatic catch.
That brought Faf du Plessis to the crease and he and Dean Elgar worked well together, putting on 75 runs before the latter fell for 61, Mutumbami pulling off another stunning catch, much to the batsman's frustration.
South Africa were finding run-scoring a struggle and Zimbabwe claimed two big wickets cheaply, Hashim Amla going for only four and AB de Villiers managing just seven.
Both men would have been disappointed with their shots but Du Plessis anchored the innings with a disciplined knock.
By the the close the batsman had reached 69 off 192 balls, while De Kock will resume on 27.
Meanwhile, Zimbabwe's Tendai Chatara has been reprimanded after pleading guilty to a level-one breach of the ICC code of conduct during the first day's play.
After being given out caught behind, Chatara shook his head and pointed to his leg as he walked to the pavilion. The fast bowler admitted the offence and accepted the sanction.