Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CNIT 127: 4: Format string bugs

147 views

Published on

Slides for a college course at City College San Francisco. Based on "The Shellcoder's Handbook: Discovering and Exploiting Security Holes ", by Chris Anley, John Heasman, Felix Lindner, Gerardo Richarte; ASIN: B004P5O38Q.

Instructor: Sam Bowne

Class website: https://samsclass.info/127/127_F18.shtml

Published in: Education
  • Be the first to comment

  • Be the first to like this

CNIT 127: 4: Format string bugs

  1. 1. CNIT 127: Exploit Development
 
 Ch 4: Introduction to Format String Bugs Updated 9-15-18
  2. 2. Understanding Format Strings
  3. 3. Data Interpretation • RAM contains bytes • The same byte can be interpreted as – An integer – A character – Part of an instruction – Part of an address – Part of a string – Many, many more...
  4. 4. Format String Controls Output
  5. 5. Most Important for Us • %x Hexadecimal • %8x Hexadecimal padded to 8 chars • %10x Hexadecimal padded to 10 chars • %100x Hexadecimal padded to 100 chars
  6. 6. Format String Vulnerabilities
  7. 7. Buffer Overflow • This code is obviously stupid char name[10]; strcpy(name, "Rumplestiltskin"); • C just does it, without complaining
  8. 8. Format String Without Arguments • printf("%x.%x.%x.%x"); – There are no arguments to print! – Should give an error message – Instead, C just pulls the next 4 values from the stack and prints them out – Can read memory on the stack – Information disclosure vulnerability
  9. 9. Format String Controlled by Attacker
  10. 10. Explanation • %x.%x.%x.%x -- read 4 words from stack • %n.%n -- write 2 numbers to RAM
 addresses from the stack
  11. 11. %n Format String • %n writes the number of characters printed so far • To the memory location pointed to by the parameter • Can write to arbitrary RAM locations • Easy DoS • Possible remote code execution
  12. 12. printf Family • Format string bugs affect a whole family of functions
  13. 13. Countermeasures
  14. 14. Defenses Against Format String Vulnerabilities • Stack defenses don't stop format string exploits – Canary value • ASLR and NX – Can make exploitation more difficult • Static code analysis tools – Generally find format string bugs • gcc – Warnings, but no format string defenses
  15. 15. Exploitation Technique
  16. 16. Steps for a Format String Exploit • Control a write operation • Find a target RAM location – That will control execution • Write 4 bytes to target RAM location • Insert shellcode • Find the shellcode in RAM • Write shellcode address to target RAM location
  17. 17. Control a Parameter • The format string is on the stack • Insert four letters before the %x fields • Controls the fourth parameter – Note: sometimes it's much further down the list, such as parameter 300
  18. 18. Target RAM Options • Saved return address – Like the Buffer Overflows we did previously • Global Offset Table – Used to find shared library functions • Destructors table (DTORS) – Called when a program exits • C Library Hooks
  19. 19. Target RAM Options • "atexit" structure (link Ch 4n) • Any function pointer • In Windows, the default unhandled exception handler is easy to find and exploit
  20. 20. Disassemble in gdb • gdb -q fs • disassemble main • First it calls printf • Later it calls putchar, using the address at 0x804a018
  21. 21. Dynamic Relocation (also called Global Offset Table (GOT)) • PLT and GOT are used to address shared libraries • See links Ch 4o, 4p
  22. 22. Targeting the GOT • Global Offset Table • Pointer to putchar at 0804a018 • Change pointer to hijack execution
  23. 23. Writing to the GOT • We control the eip!
  24. 24. Python Code to Write 1 Byte
  25. 25. Write 4 Bytes, All The Same
  26. 26. Write 4 Bytes, Increment = 16
  27. 27. Write 00000000
  28. 28. Write Chosen Values in 4 Bytes
  29. 29. Write Chosen Values in 4 Bytes
  30. 30. Inserting Dummy Shellcode xcc is BRK
  31. 31. View the Stack in gdb • Choose an address in the NOP sled
  32. 32. Dummy Exploit Runs to xcc
  33. 33. Testing for Bad Characters • x09 is bad
  34. 34. Testing for Bad Characters • 10 is bad
  35. 35. Testing for Bad Characters • x20 is bad
  36. 36. Testing for Bad Characters • Started at 33 = 0x21 • No more bad characters
  37. 37. Generate Shellcode • msfvenom -p linux/x86/shell_bind_tcp • -b 'x00x09x0ax20' • PrependFork=true • -f python
  38. 38. Keep Total Length of Injection Constant • Required to keep the stack frame size constant
  39. 39. Final Check • Address in NOP sled • Shellcode intact
  40. 40. Shell (in gdb)
  41. 41. Outside gdb • Crashed with segfault on Kali 2018.1 • Had to add 0x30 to address

×