England added 97 runs in 31 overs in the morning session with Buttler (64) and tail-ender Ball (29) adding 51 runs for the unfinished ninth wicket.
India got rid of overnight batsman Ben Stokes (31), Chris Woakes (11) and Adil Rashid (4) after England resumed at 288 for five.
India's hopes of dismissing the visitors below 350 were dashed when Buttler and the Ball negotiated testing spin from Ravichandran Aswin and Ravindra Jadeja without much trouble.
Ashwin equalled Kapil Dev's record of 23 five-wicket hauls when he scalped Stokes while the other two wickets went to Jadeja.
Ashwin had Stokes top-edging in the very first over of the morning, but the fielder stationed at backward square leg reacted late to the opportunity and allowed the ball to hit the turf well.
It appeared to be a huge opportunity lost to dismiss the all-rounder who had scored a hundred in the drawn series opener in Rajkot.
However, Ashwin did not have to wait long to send back Stokes even as a decision review call by the hosts had to be taken to overturn the original decision of not out. DRS confirmed a thin outside edge off Stokes' bat before the ball was collected by Parthiv Patel.
Jadeja then got into the act. He first unsuccessfully reviewed a not out leg before decision by the umpire to leave the hosts without any DRS left in kitty.
But Jadeja got rid of the other batsman Chris Woakes - in his seventh over of the morning when he got the batsman to edge low to Patel.
Buttler was lucky as he edged Ashwin close to Kohli in slip on 40 but Jadeja dismissed Rashid with an arm ball that struck the off stump as the batsman left it by shouldering arms. In three overs the left arm bowler had taken two wickets to leave England at 334 for 8.
He should have had Ball caught at slip but Indian skipper Kohli dropped a sharp chance. Buttler went on to complete his half century in 106 balls.