Liam Dawson made an unbeaten half-century on debut and Adil Rashid also frustrated India but England were unable to make inroads with the ball on day two of the fifth Test.
England were reduced to 321-7 when Moeen Ali (146) fell nine runs short of his best Test score, but a century stand between Dawson (66 not out) and Rashid (60) ensured the tourists posted 477 all out in Chennai.
The spinners' partnership of 108 was England's highest for the eighth wicket in India and gave Alastair Cook's men a fighting chance of claiming a consolation victory in the final match of the series, which they trail 3-0.
Dawson set a new record score for an England player batting below seven on debut on a flat track at MA Chidambaram Stadium, where India were 60 without loss at stumps on Saturday.
England were in danger of undoing the good work on day one when Ravichandran Ashwin (1-151) got one to turn away from Ben Stokes (6) and the all-rounder edged behind.
Jos Buttler (5) also missed out when he was trapped in front by a full, straight delivery from paceman Ishant Sharma (2-42) to leave England wobbling somewhat on 300-6.
Moeen struggled to get going after his heroics on Friday, looking vulnerable against the short stuff as he twice got lucky when pulling Ishant short of fielders in the deep and was pinged on the chest by Umesh Yadav.
Yadav had his man when Moeen was tempted by another short one and picked out Ravindra Jadeja with an errant hook to end a superb 262-ball innings.
Dawson was struck on the helmet by an Ishant bouncer, but looked comfortable after that early blow, playing his shots on both sides of the wicket.
Runs hard to come by before lunch, but Dawson looked increasingly at home and Rashid got going with some wristy strokes as the pair scored more freely following the interval.
Rashid brought up his half-century in style with a classy cover drive off Jadeja, who he dispatched for another boundary later in the over to take a frustrating stand beyond the 100 mark.
The Yorkshire spinner slashed Yadav behind to fall one short of his highest Test total, but the composed Dawson went on bring up a deserved 50 with a single down the ground.
Stuart Broad (19) was run out soon after tea, but Dawson continued to enjoy himself and had his first six of a brilliant innings when Axar Patel took a diving catch, but landed on the ropes.
Jake Ball (12) launched Ashwin over the ropes at long-on in the same over, but England were finally all out when the paceman was cleaned up by Amit Mishra (1-87).
Parthiv Patel (29no), promoted to open after Murali Vijay damaged his shoulder in the field, and Lokesh Rahul (30no) got India off to a strong start, reducing the deficit to 417 at the close.