Richard Wartell, Vishwath Mohan, Dr. Kevin Hamlen, Dr. Zhiqiang Lin

Slides:



Advertisements
Similar presentations
Defenses. Preventing hijacking attacks 1. Fix bugs: – Audit software Automated tools: Coverity, Prefast/Prefix. – Rewrite software in a type safe languange.
Advertisements

Securing Untrusted Code via Compiler-Agnostic Binary Rewriting Richard Wartell, Vishwath Mohan, Dr. Kevin Hamlen, Dr. Zhiqiang Lin The University of Texas.
David Brumley Carnegie Mellon University Credit: Some slides from Ed Schwartz.
CS457 – Introduction to Information Systems Security Software 3 Elias Athanasopoulos
Introduction to Information Security ROP – Recitation 5 nirkrako at post.tau.ac.il itamarg at post.tau.ac.il.
PRESENTED BY: © Mandiant Corporation. All rights reserved. X86 Binary Rewriting Many Binaries. Such Secure. Wow. Richard Wartell 06/29/14.
Dec 5, 2007University of Virginia1 Efficient Dynamic Tainting using Multiple Cores Yan Huang University of Virginia Dec
Review: Software Security David Brumley Carnegie Mellon University.
1 CHAPTER 8 BUFFER OVERFLOW. 2 Introduction One of the more advanced attack techniques is the buffer overflow attack Buffer Overflows occurs when software.
1 Lecture 5: Procedures Assembly Language for Intel-Based Computers, 4th edition Kip R. Irvine.
Windows XP SP2 Stack Protection Jimmy Hermansson Johan Tibell.
Accessing parameters from the stack and calling functions.
Practical Session 3. The Stack The stack is an area in memory that its purpose is to provide a space for temporary storage of addresses and data items.
Andrea Bittau, Adam Belay, Ali Mashtizadeh, David Maziéres, Dan Boneh
September 22, 2014 Pengju (Jimmy) Jin Section E
Web siteWeb site ExamplesExamples Irvine, Kip R. Assembly Language for Intel-Based Computers, Stack Operations Runtime Stack PUSH Operation POP.
Branch Regulation: Low-Overhead Protection from Code Reuse Attacks Mehmet Kayaalp, Meltem Ozsoy, Nael Abu-Ghazaleh and Dmitry Ponomarev Department of Computer.
1 RISE: Randomization Techniques for Software Security Dawn Song CMU Joint work with Monica Chew (UC Berkeley)
Address Obfuscation: An Efficient Approach to Combat a Broad Range of Memory Error Exploits Sandeep Bhatkar, Daniel C. DuVarney, and R. Sekar Stony Brook.
Smashing the Gadgets: Hindering Return-Oriented Programming Using In-Place Code Randomization Vasilis Pappas, Michalis Polychronakis, and Angelos D. Keromytis.
Address Space Layout Permutation
Application Security Tom Chothia Computer Security, Lecture 14.
SCRAP: Architecture for Signature-Based Protection from Code Reuse Attacks Mehmet Kayaalp, Timothy Schmitt, Junaid Nomani, Dmitry Ponomarev and Nael.
Dr. José M. Reyes Álamo 1.  The 80x86 memory addressing modes provide flexible access to memory, allowing you to easily access ◦ Variables ◦ Arrays ◦
Code Generation Gülfem Savrun Yeniçeri CS 142 (b) 02/26/2013.
Introduction: Exploiting Linux. Basic Concepts Vulnerability A flaw in a system that allows an attacker to do something the designer did not intend,
Mitigation of Buffer Overflow Attacks
Detecting Code Reuse Attacks with a Model of Conformant Program Execution Emily R. Jacobson, Andrew R. Bernat, William R. Williams, Barton P. Miller Computer.
CS457 – Introduction to Information Systems Security Projects Elias Athanasopoulos
Exploitation possibilities of memory related vulnerabilities
CS216: Program and Data Representation University of Virginia Computer Science Spring 2006 David Evans Lecture 22: Unconventional.
Buffer Overflow Proofing of Code Binaries By Ramya Reguramalingam Graduate Student, Computer Science Advisor: Dr. Gopal Gupta.
Buffer Overflow Attack Proofing of Code Binary Gopal Gupta, Parag Doshi, R. Reghuramalingam, Doug Harris The University of Texas at Dallas.
CNIT 127: Exploit Development Ch 1: Before you begin.
Introduction to Information Security ROP – Recitation 5.
1 Understanding Pointers Buffer Overflow. 2 Outline Understanding Pointers Buffer Overflow Suggested reading –Chap 3.10, 3.12.
Where’s the FEEB?: Effectiveness of Instruction Set Randomization Nora Sovarel, David Evans, Nate Paul University of Virginia Computer Science USENIX Security.
On the Effectiveness of Address-Space Randomization Hovav Shacham, Matthew Page, Ben Pfaff, Eu-Jin Goh, Nagendra Modadugu, Dan Boneh.
Buffer Overflow Attack- proofing of Code Binaries Ramya Reguramalingam Gopal Gupta Gopal Gupta Department of Computer Science University of Texas at Dallas.
Compiler Construction Code Generation Activation Records
Security Attacks Tanenbaum & Bo, Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
EXPLOITATION CRASH COURSE – FALL 2013 UTD Computer Security Group – Andrew Folloder csg.utdallas.edu (credit: Scott Hand)
CSC 221 Computer Organization and Assembly Language Lecture 15: STACK Related Instructions.
Practical Session 8. Position Independent Code- self sufficiency of combining program Position Independent Code (PIC) program has everything it needs.
ROP Exploit. ROP Return Oriented Programming (ROP): is a hacking exploit technique where you exploit buffer overflow to inject a chain of gadgets. Each.
1 Introduction to Information Security , Spring 2016 Lecture 2: Control Hijacking (2/2) Avishai Wool.
Lecture 18: ROP - Continued CS 2011 Spring 2016, Dr. Rozier.
Paradyn Project Paradyn / Dyninst Week Madison, Wisconsin April 12-14, 2010 Paradyn Project Safe and Efficient Instrumentation Andrew Bernat.
Exploiting & Defense Day 1 Recap
Introduction to Information Security
Mitigation against Buffer Overflow Attacks
Remix: On-demand Live Randomization
Stack Operations Dr. Hadi AL Saadi.
Assembly language.
C function call conventions and the stack
Introduction to Information Security
Jump Over ASLR: Attacking Branch Predictors to Bypass ASLR
Exploiting & Defense Day 2 Recap
CSC 495/583 Topics of Software Security Return-oriented programming
Q: Exploit Hardening Made Easy
Summary by - Bo Zhang and Shuang Guo [Date: 03/31/2014]
MIPS Procedure Calls CSE 378 – Section 3.
Practical Session 4.
Machine Level Representation of Programs (IV)
Week 2: Buffer Overflow Part 1.
Week 2: Buffer Overflow Part 2.
X86 Assembly Review.
Computer Architecture and System Programming Laboratory
Return-to-libc Attacks
Presentation transcript:

Binary Stirring: Self-randomizing Instruction Addresses of Legacy x86 Binary Code Richard Wartell, Vishwath Mohan, Dr. Kevin Hamlen, Dr. Zhiqiang Lin The University of Texas at Dallas Outline slide     * Return-oriented Programming Attacks & Defenses     * Challenge: Defending Source-free COTS Legacy Code     * Our Solution: Self-Transforming Instruction Relocation (STIR)     * Experimental Results     * Conclusion Don't dwell on this slide.  Strive to spend no more than about 15 seconds on it.  Its only purpose is to caution the audience that we'll be explaining ROP for a while before we get to the novelties of our own work.  I recommend something like, "I'll start with a review of return-oriented programming attacks and some of the significant challenges of extending ROP defenses to full-scale, production-level legacy code.  Then I'll present our solution, called STIR.  Finally, I'll describe our experimental results and conclude. Supported in part by NSF, AFOSR, and DARPA

Attack Vector Malicious Input Buffer Overflow Attacker can control input to a remote program Recognizes a buffer overflow, uses it to modify stack values Uses this to attack the system Buffer Overflow

Randomize Library Image Base Attacks Timeline Return to Unsafe User Code Gadgets (Shacham, Q [8,1]) Return to Unsafe Library (return-to-libc) Execute Code on the Stack 1980 1990 2000 2010 Timeline of attacks, Buffer overflow to code on the stack, make the stack nx, return add on stack to exploitable system code, aslr, using user level code (Q), how to defend? Make Stack Non-exec (WxorX) Randomize Library Image Base (ASLR) ?

How Relevant is RoP? Microsoft’s 2012 BlueHat Competition Focused on RoP Mitigation $260,000 total for top three solutions Successful attack against 2nd place solution was published one month later

Attacker Smashes the Stack! Q’s RoP Attack Registers eax <eax> Address Value 0028FF8C <return_val> 0028FF90 <st_1> 0028FF94 <st_2> 0028FF98 <st_3> 0028FF9C <st_4> 0028FFA0 <st_5> 0028FFA4 <st_6> 0028FFA8 <st_7> 0028FFAC <st_8> 0028FFB0 <st_9> 0028FFB4 <st_10> 0028FFB8 <st_11> 0028FFBA <st_12> 0028FFC0 <st_13> 0028FFC4 <st_14> 0028FFC8 <st_15> 0x6D78941C:  retn Registers eax <eax> ebx <ebx> ecx <ecx> edx <edx> edi <edi> esi <esi> esp <esp> ebp <ebp> esp 0x6D8011AC:  add esp, 12 0x6D8011AF:  retn Attacker Smashes the Stack! 0x6D802A88:  pop edi       0x6D802A89:  retn 0x6D81BDD7:  pop ecx       0x6D81BDD8:  retn 0x6D8FF623:  mov edx, esi  0x6D8FF625:  pop esi     0x6D8FF626:  mov eax, ebx 0x6D8FF628:  pop ebx       0x6D8FF629:  pop ebp       0x6D8FF62A:  retn  Return-oriented Programming (cite the Q paper) - Give assembly code for the simplest ROP attack you can put on one slide.  Slide should probably have a memory image with two parts: (1) the stack content (marked non-executable), (2) assembly code for portions of the code segment that are hijacked as part of the attack's payload. Walk the audience through the attack step by step (probably using consecutive slides that animate the progress of the instruction pointer and stack pointer).  The first step should be the injection of the return address sequence onto the stack.  (Don't show the actual buffer overrun exploit.  Just say that's how the attacker put these bytes on the stack.)  The second step is a return instruction that jumps to the attacker-supplied address.  Note at this point that the attacker can't just jump to injected code on the stack because the stack is non-executable.  Next, show a couple more returns that access gadgets that load malicious args into registers or stack slots.  The final gadget should be one that performs a dangerous library call (e.g., FormatDisk or somesuch).  The library call should use the IAT, not a direct reference SIMPLIFY AND PUT TOGETHER Executable 0x6D97ED06:  sub  ecx, edx 0x6D97ED08:  push edi 0x6D97ED09:  push ecx 0x6D97ED0A:  call [IAT:conn]      Non-Executable <ignore> indicates info irrelevant to the attack

Attack Success! Q’s RoP Attack eip Registers eax <ignore> ebx Stack Address Value 0028FF8C Gadg1:6D8011AC 0028FF90 <ignore> 0028FF94 0028FF98 0028FF9C Gadg2:6D8FF623 0028FFA0 <var_1> 0028FFA4 <var_2> 0028FFA8 <var_3> 0028FFAC Gadg3:6D81BDD7 0028FFB0 <var_4> 0028FFB4 Gadg4:6D802A88 0028FFB8 <var_5> 0028FFBA Gadg5:6D97ED06 0028FFC0 0028FFC4 0028FFC8 eip 0x6D78941C:  retn Registers eax <ignore> ebx ecx edx edi esi <var_6> esp ebp esp Gadg1: 0x6D8011AC:  add esp, 12 0x6D8011AF:  retn <var_2> Gadg4: 0x6D802A88:  pop edi   0x6D802A89:  retn <var_4> <v4-v6> Attack Success! <var_6> Gadg3: 0x6D81BDD7:  pop ecx       0x6D81BDD8:  retn <var_5> Gadg2: 0x6D8FF623:  mov edx, esi  0x6D8FF625:  pop esi     0x6D8FF626:  mov eax, ebx 0x6D8FF628:  pop ebx       0x6D8FF629:  pop ebp       0x6D8FF62A:  retn  <var_1> Return-oriented Programming (cite the Q paper) - Give assembly code for the simplest ROP attack you can put on one slide.  Slide should probably have a memory image with two parts: (1) the stack content (marked non-executable), (2) assembly code for portions of the code segment that are hijacked as part of the attack's payload. Walk the audience through the attack step by step (probably using consecutive slides that animate the progress of the instruction pointer and stack pointer).  The first step should be the injection of the return address sequence onto the stack.  (Don't show the actual buffer overrun exploit.  Just say that's how the attacker put these bytes on the stack.)  The second step is a return instruction that jumps to the attacker-supplied address.  Note at this point that the attacker can't just jump to injected code on the stack because the stack is non-executable.  Next, show a couple more returns that access gadgets that load malicious args into registers or stack slots.  The final gadget should be one that performs a dangerous library call (e.g., FormatDisk or somesuch).  The library call should use the IAT, not a direct reference SIMPLIFY AND PUT TOGETHER <var_3> <v4 - v6> Executable Gadg5: 0x6D97ED06:  sub  ecx, edx 0x6D97ED08:  push edi 0x6D97ED09:  push ecx 0x6D97ED0A:  call [IAT:X]      <var_5> Non-Executable <ignore> indicates info irrelevant to the attack Action: Store esi in edx for later use Action: Return to first gadget Action: Throw away top three stack values Action: Store <var_4> in ecx for later use Action: Push arguments and make unsafe library call Action: Store <var_5> in edi for later use

RoP Defense Strategy Defense Goal RoP is one example of a broad class of attacks that require attackers to know or predict the location of binary features Defense Goal Frustrate such attacks by randomizing feature space or removing features

RoP Defenses: Compiler-based let rec merge = function | list, [] | [], list -> list | h1::t1, h2::t2 -> if h1 <= h2 then h1 :: merge (t1, h2::t2) else h2 :: merge (h1::t1, t2);; Control the machine code instructions used in compilation (Gfree [2] and Returnless [3]) Use no return instructions Avoid gadget opcodes Hardens against RoP Requires code producer cooperation Legacy binaries unsupported Gadget-removing Compiler ROP Defenses: Compiler-based - Have a figure with source code going into a compiler and gadget-free object code coming out the other side.  Explain that if you're willing to recompile your code with a special compiler, you can generate gadget-free code.  Cite the G-Free and Return-less Kernels papers.  However, most code-producers are unwilling to adopt a new toolchain just for gadget removal, so the majority of the world is stuck with using gadget-filled legacy binaries for which source is not available. Gadget-free Binary

RoP Defenses: ASLR ASLR randomizes the image base of each library 232 Sys. Address Space ASLR randomizes the image base of each library Gadgets hard to predict Brute force attacks still possible [4] Virtual Address Space User Address Space ROP Defenses: ASLR - Have a slide with a process layout diagram on the left containing various colored blocks denoting libraries. Then run a little animation that scrambles the library positions producing a new layout on the right, but with the main module at its original location.  Explain that ASLR makes it hard to predict locations of gadgets located in libraries, but brute force attacks can still guess their locations when the address space is small (e.g., 32-bit).  (Cite the "On the Effectiveness of ASLR" paper on the slide.) 20

RoP Defenses: IPR / ILR Instruction Location Randomization (ILR) [5] Randomize each instruction address using a virtual machine Increases search space Cannot randomize all instructions High overhead due to VM (13%) In-place Randomization (IPR) [6] Modify assembly to break known gadgets Breaks 80% of gadgets on average Cannot remove all gadgets Preserves gadget semantics Deployment issues User Address Space 231 lib1 lib2 lib3 ROP Defenses: IPR/ILR - Have a similar slide but with tiny colored boxes within each library block.  The animation should scramble these tiny boxes within each library block.  Explain that IPR and ILR (cite both papers) conceptually perform finer-grained, instruction-level randomization within the libraries, increasing the search space and defeating the brute force attacks.  But they cannot randomize the main module. main 20

Self-randomizing COTS binary w/o source code Our Goal Self-randomizing COTS binary w/o source code Low runtime overhead Complete gadget removal Flexible deployment (copies randomize themselves) No code producer cooperation

Challenge: Binary Randomization w/o metadata Relocation information, debug tables and symbol stores not always available Reverse engineering concerns Perfect static disassembly without metadata is provably undecidable Best disassemblers make mistakes (IDA Pro) Challenge: Binary Randomization without Metadata - Explain what relocations are and how they facilitate randomization of libraries, but are unavailable for main modules.  Similarly, symbol stores and debug tables are not available for production-level binaries. Perfect disassembly of x86 code without metadata is provably undecidable; even the best disassemblers are often wrong.  (Maybe cite a stat or two from your PKDD paper.) Program Instruction Count IDA Pro Errors mfc42.dll 355906 1216 mplayerc.exe 830407 474 vmware.exe 364421 183

Unaligned Instructions Disassemble this hex sequence Undecidable problem FF E0 5B 5D C3 0F 88 52 0F 84 EC 8B Valid Disassembly FF E0 jmp eax 5B pop ebx 5D pop ebp C3 retn 0F 88 52 0F 84 EC jcc 8B … mov Valid Disassembly FF E0 jmp eax 5B pop ebx 5D pop ebp C3 retn Valid Disassembly FF E0 jmp eax 5B pop ebx 5D pop ebp C3 retn Unaligned Instructions - Give an example of a byte sequence with two different disassemblies.  (Just lift one from your PKDD presentation.)  Begin the byte sequence with a "jmp eax" instruction or something similar.  Explain that there's no way in general to know statically what eax will equal at runtime, so there's no way to know exactly where it will jump, and therefore no way to know which bytes start instructions.  This is why perfect disassembly is impossible in general. 0F db (1) 0F 88 db (2) 88 52 0F 84 EC mov 8B … 52 push edx 0F 84 EC 8B … jcc

Our Solution: STIR (Self-Transforming Instruction Relocation) Statically rewrite legacy binaries to re-randomize at load-time Greatly increases search space against brute force attacks Introduces no deployment issues Tested on 100+ Windows and Linux binaries 99.99% gadget reduction on average 1.6% overhead on average 37% process size increase on average STIR - Our solution is a rewriting system that can successfully randomize COTS x86 legacy binaries even from imperfect disassemblies.  It statically rewrites each legacy binary, creating a new binary that can re-randomize itself at load-time every time it is launched.  List the main benefits:  (1) rewritten binaries re-randomize themselves every time they are loaded, greatly increasing the search space without introducing deployment issues, (2) tested successfully on >100 Windows/Linux binaries without source or metadata, (3) >99.99% gadget elimination, (4) runtimes increased by only 1.6%, (5) process sizes increase by about 37%. SIMPLIFY TEXT

STIR Architecture Memory Image Binary Rewriter Original Self-stirring Application Binary Static Rewriting Phase Load-time Stirring Phase Self-stirring Conservative Disassembler (IDA Python) Lookup Table Generator Load-time Randomizer (Helper Library) Randomized Instruction Addresses STIR Architecture - Reproduce Figure 3 from our paper and summarize the various modules.  Instead of "Stirred Binary" in that figure, say "Self-stirring Binary".  (That would have been a better label for that item.) Explain disassembler is approximate

Innovation: Disassembly Error Tolerance Byte Sequence: FF E0 5B 5D C3 0F 88 B0 50 FF FF 8B Disassembled Invalid Hex Path 1 Path 2 Path 3 Path 4 FF jmp eax E0 loopne 5B pop 5D L1: pop C3 retn 0F jcc 88 mov B0 50 N/A 8B L2: mov Included Disassembly jmp eax pop L1: pop retn jcc L2: mov loopne jmp L1 mov jmp L2 Disassembly Error Tolerance - Show a shingled disassembly of your "unaligned instructions" example from slide 8.  Explain that even if a disassembly has errors, we can just conservatively assemble the ambiguous, overlapping bytes as separate blocks in our new code segment.

Static Rewriting Original Binary Rewritten Binary Header Rewritten Header Import Address Table Import Address Table .data .data .text .told (NX bit set) Block 1 -> 500F86… data -> (8 bytes) Block 2 -> 55FF24… … … Block 1 -> F4 <NB 1> data -> (8 bytes) Block 2 -> F4 <NB 2> … … Static Rewriting - Reproduce Figure 1.  Explain that disassemblers can't precisely identify all jump targets, but they're good at identifying a reasonable SUPERSET of all jump targets.  The old code segment is repurposed as a data segment with the possible targets labeled.  The labels are tagged pointers to their new locations in the rewritten code segment.  Mention that the resulting jump table is data, and therefore relocatable with standard library-randomization techniques, making it hard for attackers to find. .tnew NB 1 -> rewrite(Block 1) NB 2 -> rewrite(Block 2) … … Denotes a section that is modified during static rewriting

Load-time Stirring When binary is loaded: Initializer randomizes .tnew layout Lookup table pointers are updated Execution is passed to the new start address User Address Space 231 lib1 lib2 lib3 Load-time Stirring - Make an animation slide just like Slide 6 except that the main module also contains little colored blocks that get scrambled.  Explain that each time the stir-enabled binary loads, its initializer randomizes the .tnew layout (and updates the lookup table pointers) before falling through into the code. Segue: Now that we randomized everything, how do we preserve instruction semantics such as computed jumps? main 20

Computed Jump Preservation eax = 0x411A40 Original Instruction: .text:0040CC9B FF DO call eax Original Possible Target: .text:00411A40 5B pop ebp eax = 0x411A40 eax = 0x534AB9 Rewritten Instructions: .tnew:0052A1CB .tnew:0052A1CE .tnew:0052A1D2 80 38 F4 0F 44 40 01 FF D0 cmp byte ptr [eax], F4h cmovz eax, [eax+1] call eax Computed Jump Preservation - Reproduce Figure 2.  Explain how our rewritten segment dynamically detects and repoints computed jumps. Rewritten Jump Table: .told:00411A40 F4 B9 4A 53 00 F4 dw 0x534AB9 Rewritten Target: .tnew:00534AB9 5B pop ebp

Entropy Discussion ASLR STIR 2n-1 probes where n is the number of bits of randomness STIR 2 𝑛 ! 2( 2 𝑛 −g)! probes where g is the number of gadgets in the payload Must guess each where each gadget is with each probe.

Gadget Reduction Gadget Reduction - Reproduce Figure 8, and have some bullets indicating the outcomes of Mona and the Q hardener (cite both papers).

Windows Runtime Overhead Runtime Overhead - Reproduce Figure 10 and explain it.

Linux Runtime Overhead Runtime Overhead - Reproduce Figure 10 and explain it.

Conclusions First static rewriter to protect against RoP attacks Greatly increases search space Introduces no deployment issues Tested on 100+ Windows and Linux binaries 99.99% gadget reduction on average 1.6% overhead on average 37% process size increase on average Techniques can be leveraged to machine-verifiable software fault isolation Reins [7] Conclusions - Restate most of what you said on slide 9.  Also mention that we have a forthcoming ACSAC paper (cite it) that shows how these techniques can be leveraged for machine-verifiable software fault isolation of legacy COTS binaries.

References E. J. Schwartz, T. Avgerinos, and D. Brumley. Q: Exploit hardening made easy. In Proc. 20th USENIX Security Symposium, 2011. K. Onarlioglu, L. Bilge, A. Lanzi, D. Balzarotti, and E. Kirda. G-Free: Defeating return-oriented programming through gadget-less binaries. In Proc. 26th Annual Computer Security Applications Conf., pages 49–58, 2010. J. Li, Z. Wang, X. Jiang, M. Grace, and S. Bahram. Defeating return-oriented rootkits with “Return-less” kernels. In Proc. 5th European Conf. on Computer Systems, pages 195–208, 2010. H. Shacham, M. Page, B. Pfaff, E.-J. Goh, N. Modadugu, and D. Boneh. On the effectiveness of address-space randomization. In Proc. 11th ACM Conf. on Computer and Communications Security, pages 298–307, 2004. J. D. Hiser, A. Nguyen-Tuong, M. Co, M. Hall, and J. W. Davidson. ILR: Where’d my gadgets go? In Proc. IEEE Symposium on Security and Privacy, pages 571–585, 2012. V. Pappas, M. Polychronakis, and A. D. Keromytis. Smashing the gadgets: Hindering return-oriented programming using in-place code randomization. In Proc. IEEE Symposium on Security and Privacy, pages 601–615, 2012. R. Wartell, V. Mohan, K. Hamlen, Z. Lin. Securing Untrusted Code via Compiler-Agnostic Binary Rewriting. Upcoming in Annual Computer Security Applications Conference, Dec. 2012. Shacham, The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls (on the x86). ACM CCS 2007. References - complete citations of all papers referenced in the talk

Linux Runtime Overhead Runtime Overhead - Reproduce Figure 10 and explain it.