Hanna Heller (Saoirse Ronan) is a 15-year-old girl who lives with her father, Erik Heller (Eric Bana) in rural northern Finland, near Kuusamo. The film opens with her hunting and killing a reindeer.
Since the age of two, Hanna has been trained by Erik, an ex-CIA operative from Germany, to be a skilled assassin. He teaches her hand-to-hand combat and drills her in target shooting. He left the agency, going incognito into the Arctic. Erik knows a secret that cannot become public, and Marissa Wiegler (Cate Blanchett), a senior CIA officer, searches for him in order to eliminate him. Erik has trained Hanna with the intent that she will kill Marissa. Due to her upbringing in the wilderness, she is unfamiliar with many aspects of modern civilisation despite having read encyclopedias.
One night, Hanna tells Erik that she is "ready" to face their enemies. Erik digs up a radio beacon that eventually will alert the CIA to their presence. Although he warns Hanna that a confrontation with Marissa will be fatal for either her or Marissa, he leaves the final decision to Hanna who activates the beacon. Erik leaves, instructing her to meet him in Berlin. A special forces team arrives to capture Hanna and Erik, but Erik is already gone and while Hanna kills two soldiers, the rest of the soldiers assume Erik killed them before escaping.
Hanna is taken to an underground CIA complex where Marissa, being suspicious, sends a body double (Michelle Dockery) to talk to Hanna. While talking to the double Hanna starts to cry and crawls sobbing into the lap of the double, which makes her captors uneasy. They send some guards to her cell to sedate her. As they enter the cell, Hanna kills the double along with some of the guards and escapes.
In a flashback, Marissa is seen firing at a car that is carrying Hanna's mother, two-year-old Hanna, and Erik. The car crashes but the trio flees. Marissa shoots Johanna, but Erik escapes with Hanna into the woods.
Hanna finds herself on the run in the Moroccan desert, where she meets bohemian British people couple Sebastian (Jason Flemyng) and Rachel (Olivia Williams), who are on a camper-van holiday with their teenage daughter, Sophie (Jessica Barden), and their younger son, Miles (Aldo Maland). She stows away in the family's camper-van on the ferry ride to Spain seeking to reach Berlin. The family is nice to her, and she and Sophie become friends, even sharing a kiss together.
Marissa hires Isaacs (Tom Hollander), a former agent, to capture Hanna. Hanna travels with the family as they drive north. Isaacs and two skinheads trail them and eventually corner Hanna and the family in France, but she manages to escape, killing one of the assailants. Marissa catches up with the British family and during interrogation finds out that Hanna is heading to Berlin.
Arriving at the address that Erik had told her, Hanna meets with Knepfler (Martin Wuttke), an eccentric old magician and a friend of Erik's, who lives in an abandoned amusement park. Hanna plans a rendezvous with her father. However, Marissa and Isaacs arrive. Hanna escapes, but overhears comments that suggest Erik is not her biological father.
Later, Hanna goes to her grandmother's apartment where she finds her grandmother murdered. In a conversation Erik admits to Hanna that he is not her biological father. Erik once recruited pregnant women into a program where their children's DNA was enhanced in order to create super-soldiers. After the project was shut down, its subjects were eliminated.
Marissa and Isaacs arrive, intent on killing them; Erik acts as a distraction to allow Hanna to escape. Erik kills Isaacs in a fight, but is shot by Marissa, who goes to Knepfler's house. Hanna is there, having just discovered Knepfler dead. They wound each other and eventually Marissa becomes disoriented from her wound, slows down and loses her weapon. Hanna finds the weapon and kills Marissa, echoing the deer hunting scene from the start of the film.

Question: Who does Hanna kill at the CIA complex?
Answer: Marissa's double
Alternative answer: Marissa's double and guards