WinAPI рдореЗрдВ рдПрдХ CreateRemoteThread рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдирдпрд╛ рдереНрд░реЗрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреАрдПрд▓рдПрд▓ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдмреБрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ (рдЧреЗрдо, рдкрд╛рд╕рд╡рд░реНрдб рдЪреЛрд░реА, рдЖрджрд┐ рдореЗрдВ рдзреЛрдЦрд╛) рдХреЗ рд▓рд┐рдП, рдФрд░ рдордХреНрдЦреА рдкрд░ рдЪрд▓ рд░рд╣реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЬреЛрдбрд╝реЗрдВ рдЬрд╣рд╛рдВ рд╡реЗ рдирд╣реАрдВ рдереЗ рдкреНрд░рджрд╛рди рдХреА рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрджрд┐рдЧреНрдз рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ CreateRemoteThread рдХрд╛ рддреИрдпрд╛рд░ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╖рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫреЗ рд╕рд╛рд╣рд╕рд┐рдХ рдХрд╛рд░реНрдп рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ред
рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ, ELF рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреА рдорджрдж рд╕реЗ, x86_64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдХреБрдЫ рдЬреНрдЮрд╛рди, рдбрд┐рдмрдЧрд░ рдХреЗ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЛ рд▓реЛрдб рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╛рда рдХреЛ рд╕рдордЭрдирд╛ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рд╕реА рднрд╛рд╖рд╛, рдЙрд╕ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдВ рдорд╢реАрди рдХреЛрдб рдФрд░ рдореЗрдореЛрд░реА рдХреА рднреВрдорд┐рдХрд╛ рдХреА рд╕рдордЭ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛, рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд, рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ Gnome Control Center рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ "рдЬреЛрдбрд╝рдиреЗ" рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░
рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдб рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рдЦрдВрдб рдирд╣реАрдВ рдерд╛, рддреЛ рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реЛрдЧрд╛: LD_PRELADADред рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдордирдорд╛рдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдЖрдк рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рд╕рд╛рде рдореЗрдВ, LD_PRELOAD рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкреНрд░рд╕рд┐рджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдореЙрд▓реЛрдХ () рдФрд░ рдореБрдХреНрдд () рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, LD_PRELOAD рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИ, рдЬрдмрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ dlopen () рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рд▓реЗрдХрд┐рди, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реНрдерд┐рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
LD_PRELOAD рдХреЗрд╡рд▓ рдЙрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ -static
рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдорддреМрд░ рдкрд░ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдмрд╛рдж рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдареЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ, рдЖрдк рд░рди рдЯрд╛рдЗрдо рдкрд░ рдХреЛрдб рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдореЛрдбрд╝ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдИ рднреА рддреИрдпрд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреА рд╣реЛрдЧреАред рдЕрдиреНрдпрдерд╛, рдЖрдк рдЗрд╕ рдкрд╛рда рдХреЛ рдирд╣реАрдВ рдкрдврд╝реЗрдВрдЧреЗ :)
рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
- рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдХреЛрдб рд▓реЛрдб рдХрд░реЗрдВред
- рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░реЗрдВред
- рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред
рдЖрдЗрдП рдЬрд╛рдиреЗ ...
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рдХреЗ рдЕрдзреАрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб, рдпрд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХреЛрдб, рдпрд╛ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рднреЗрджреНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг: рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ, рд╕реНрдЯреИрдХ рдкрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ, рдХрднреА-рдХрднреА рдХрд╛рдо рднреА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░, рдИрдорд╛рдирджрд╛рд░ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ ред рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдбрд┐рдмрдЧрд░реНрд╕ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЗрдВред рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рд┐рдирдХреНрд╕ рдкрд░, рдореБрдЦреНрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ ptrace () рд╣реИ ред рдпрд╣ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝рдиреЗ, рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред ptrace () рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг рдХреЗрд╡рд▓ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдХреЛрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛
рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЗрд▓реЛрдб ( рд╢реЗрд▓ рдХреЛрдб ) рдЖрдорддреМрд░ рдкрд░ рдЙрди рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕реА рдмрдлрд░ рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░рддреЗ рд╣реИрдВред рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред WinAPI рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди WriteProcessMemory рд╣реИред рдЗрд╕ рдкреНрд░рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ UNIX рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ: рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ / рдкреНрд░реЛрдХ / $ pid / рдореЗрдо рд╣реИ , рдЬреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛
рд╕рд┐рд░реНрдл рдореЗрдореЛрд░реА рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реА рдХрд╛рдлреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рднреЗрджреНрдпрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреЗ рд╕рд╛рде рдЧреИрд░-рддреБрдЪреНрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП "рд╕рд╣реА" рдореЗрдореЛрд░реА рдХреЛ рдЦреЛрдЬрдиреЗ рдпрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рддреИрдпрд╛рд░реА рдХрд╛ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╢реЗрд▓ рдХреЛрдб рд╣реА рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рд╕рдВрднрд╡рддрдГ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬреИрд╕реЗ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ, рдЧреНрд░рд╛рдлрд┐рдХ рдЖрджрд┐рдо, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдирдВрдЧреЗ рдорд╢реАрди рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЗрди рд╕рднреА рд╢рд╛рдВрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ?
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдХреЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдорддреМрд░ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рддрдерд╛рдХрдерд┐рдд рд╕реНрдерд┐рддрд┐-рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ )ред рдЗрд╕рд▓рд┐рдП рдкрддреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рддреЛ рд▓реЛрдбрд░ рдЬреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рдЯреАрдХ рдкрддреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣ рд╢реБрд░реВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд░ рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ рдХрд╛ рдкрддрд╛ рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ:
- рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рди рдХрд░реЗрдВ, рд╕реНрд╡рдЪреНрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд░ рд╕рдм рдХреБрдЫ рдХрд░реЗрдВ
- рд╢реЗрд▓ рдХреЛрдб рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдбрд╛рд▓реЗрдВ
- рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд░ рдХрд╛ рдХрд╛рдо рдЦреБрдж рдХрд░реЗрдВ
- рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдмреВрдЯрд▓реЛрдбрд░ рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ
рд╣рдо рдмрд╛рдж рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкреВрд░реНрдг рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдЧреБрдкреНрдд рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╕рд░рд▓, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред
рдХреЛрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг
ptrace () рдЖрдкрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЛрдб рдФрд░ рддреИрдпрд╛рд░ рдХреЛрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдмрд╕ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдкрддрд╛% рд░рд┐рдк рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦреЗрдВ - рдФрд░ рд╡реЙрдЗрд▓рд╛! рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ рдХрд┐ рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреВрд░ рдирд╣реАрдВ рдЧрдИ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдб рднреА рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдорд╛рдзрд╛рди рд╕реНрдХреЗрдЪ
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ:
- рд╣рдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВред
- рд╣рдо рд╕реНрдореГрддрд┐ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд╛рддреЗ рд╣реИрдВ:
- libdl - рдПрдХ рдирдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- libpthread - рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдкрд╛рддреЗ рд╣реИрдВ:
- libdl: dlopen (), dlsym ()
- libpthread: pthread_create (), pthread_detach ()
рд╣рдо рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╢реЗрд▓ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ:
void shellcode(void) { void *payload = dlopen("/path/to/payload.so", RTLD_LAZY); void *entry = dlsym(payload, "entry_point"); pthread_t thread; pthread_create(&thread, NULL, entry, NULL); pthread_detach(thread); }
- рд╣рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рдХреЛрдб рджреЗрддреЗ рд╣реИрдВред
рдирддреАрдЬрддрди, рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд╣реА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ: рд╡реЗ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирдпрд╛ рдереНрд░реЗрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред
рдкреНрд░рддрд┐рдмрдВрдз
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреБрдЫ рд╕реАрдорд╛рдПрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ:
- рдмреВрдЯрд▓реЛрдбрд░ рдореЗрдВ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП libdl (рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░)ред
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓реЗрдмрд░рдкреНрд░реНрд░реЗрдб (рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╕реНрдереИрддрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рднреА-рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЦреБрдж рдХреЛ x86_64 рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд▓реЗрдВрдЧреЗред (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ 32-рдмрд┐рдЯ x86 рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдм рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЧреБрдкреНрдд рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рд░реНрдп рдЕрднреА рднреА рдЕрдиреБрд╕рдВрдзрд╛рди рд░реБрдЪрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдФрджреНрдпреЛрдЧрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдордЬреЛрд░ рдЕрд╡рд╕рд░ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред
рдкрд╛рдЪрди: libdl рдФрд░ libpthread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдПрдХ рдЕрдиреБрднрд╡реА рдкреЗрд╢реЗрд╡рд░ рдкрд╛рдардХ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЕрдЧрд░ __libc_dlopen_mode () рдФрд░ __libc_dlsym () рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА glibc рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╣реИрдВ, рддреЛ libdl рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ libdl рдЙрдирдХреЗ рдКрдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рд░рдг рд╣реИ? рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рдХреНрд▓реЛрди () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд▓реЗрдмрд░рдкреИрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ:
рд╡реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдХрд░ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рднреА рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИрдВ:
- рд▓рд┐рдирдХреНрд╕ рдмрд╛рдЗрдирд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реАрдЦрдирд╛
- рд╕реНрдореГрддрд┐ рдлреЛрд░реЗрдВрд╕рд┐рдХ рдХреА рдХрд▓рд╛
рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдЦреИрд░, рдХрдо рд╕реЗ рдХрдо рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬреЛ 90% рдЪреЗрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, 20 рдЧреБрдирд╛ рдХрдо рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 80% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рджрд░рдЕрд╕рд▓, glibc рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП libdl рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рдХреЛрдб рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рд▓рд┐рдмреНрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА рдмрд╛рдж рдореЗрдВ рдЧреНрд▓рд┐рдмреЗрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреА)ред
рдХреНрдпреЛрдВ dlopen () рд╕рдм рдкрд░ glibc рдХреЗ рдЕрдВрджрд░?
рдпрд╣ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгред
рдмрд┐рдВрджреБ рдирд╛рдо рд╕реЗрд╡рд╛ рд╕реНрд╡рд┐рдЪ (NSS) рд╣реИ - glibc рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдирд╛рдореЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдорд╢реАрдиреЛрдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ, рдореЗрд▓ рд╕рд░реНрд╡рд░реЛрдВ рдЖрджрд┐ рдХреЗ рдирд╛рдоред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ getaddrinfo () рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП IP рдкрддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдбреЛрдореЗрди рдирд╛рдо рдФрд░ getpwuid () рдЕрдкрдиреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдПрдирдПрд╕рдПрд╕ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдЗрд╕рдХреЗ рд▓рд┐рдП, glibc рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдЬрдм рдЖрдк рд╕реНрдЯреИрдЯрд┐рдХрд▓реА рдЕрд╕реЗрдВрдмрд▓ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ getaddrinfo () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓рд┐рдВрдХрд░ рдПрдХ "рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░" рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ:
/tmp/build/socket.o: рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ 'рд╕реЙрдХреЗрдЯ :: рдмрд╛рдЗрдВрдб':
рд╕реЙрдХреЗрдЯ.рдУ :(ред рдЯреЗрдХреНрд╕реНрдЯ + 0x374): рдЪреЗрддрд╛рд╡рдиреА: рд╕реНрдЯреИрдЯрд┐рдХрд▓реА рд▓рд┐рдВрдХреНрдб рдореЗрдВ 'getaddrinfo' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдмреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдзрд╛рдЧрд╛ рди рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреИрдХ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рдереНрд░реЗрдб-рд▓реЛрдХрд▓ рд╕реНрдЯреЛрд░реЗрдЬ (рдЯреАрдПрд▓рдПрд╕) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдирдП рдзрд╛рдЧреЗ рдХреЗ рд╕рд╣реА рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рдордиреНрд╡рд┐рдд рд╕рдВрдЪрд╛рд▓рди, рдПрдХ рдмрд╛рдЗрдирд░реА рдХреЛрдб рд▓реЛрдбрд░ рдФрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреНрд▓реЛрди () рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХреЙрд▓ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЯреАрдПрд▓рдПрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЖрдВрдЦреЛрдВ рд╕реЗ рдЫрд┐рдкреА рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдПрдХ рдРрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрд╣реБ-рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА? рд╕рд╣реА, рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ред рджрд░рдЕрд╕рд▓, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛рдо рдХрд╛ рдХреЛрдИ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред рдЕрдЧрд░ рд╣рдо рдпрд╣ рдорд╛рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ libpthread рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпрд╣ рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЪрд░рдг 1. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХрдиреЗрдХреНрд╢рди
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ, рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ ptrace () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЖрддреА рд╣реИред
Ptrace () рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рд╕рдВрдкрд░реНрдХ
Ptrace () рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЖрдк рд▓рдЧрднрдЧ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рд╕рдВрд▓рдЧреНрди рдФрд░ рдХреЛрдЪрд┐рдВрдЧ
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реЗрд╕рд░ рд╕реЗ рдПрдХ рдзрд╛рдЧрд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
ptrace (PTRACE_ATTACH, pid, 0, 0);
рдпрд╛
ptrace (PTRACE_SEIZE, pid, 0, PTRACE_O_flags);
PTRACE_ATTACH рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ SIGSTOP рднреЗрдЬрддрд╛ рд╣реИред рдЕрдЧрд░ рдЯреНрд░реИрд╕рд░ рдРрд╕рд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ
SIGSTOP рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рджрдмрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐
рдЕрдиреНрдп рд╕рдВрдХреЗрдд рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ
рдЕрдиреБрд░реЗрдЦрдХ рдЕрдиреНрдп рд╕рд┐рдЧ рдХреЗ рд╕рд╛рде рдЯреНрд░реЗрд╕ рд╕рд┐рдЧреНрдирд▓-рдбрд┐рд▓реАрд╡рд░реА-рд╕реНрдЯреЙрдк рджрд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
nal (s) рдкрд╣рд▓реЗ! рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рддрдм рддрдХ рдЗрди рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдордЬрдмреВрдд рдХрд░рдирд╛ рд╣реИ
SIGSTOP рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ SIGSTOP рдЗрдВрдЬреЗрдХреНрд╢рди рджрдмрд╛рдПрдВред рдбрд┐рдЬрд╛рдЗрди рдмрдЧ
рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдПрдХ ptrace рд╕рдВрд▓рдЧреНрди рд╣реИ рдФрд░ рдПрдХ рд╕рдорд╡рд░реНрддреА рд╡рд┐рддрд░рд┐рдд SIGSTOP рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рджреМрдбрд╝ рдФрд░ рд╕рдорд╡рд░реНрддреА SIGSTOP рдЦреЛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ рдкрд╣рд▓рд╛ рдХрджрдо PTRACE_ATTACH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:
int ptrace_attach(pid_t pid) { if (ptrace(PTRACE_ATTACH, pid, 0, 0) < 0) return -1; if (wait_for_process_stop(pid, SIGSTOP) < 0) return -1; return 0; }
Ptrace () рдХреЗ рдмрд╛рдж, рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ, рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ред ptrace () рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ SIGSTOP рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗрдЯрдкрд┐рдб () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕реА рд╕рдордп, рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╕реАрдорд╛ рдорд╛рдорд▓реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, SIGSTOP рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╕ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдорд░ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рджреВрд╕рд░реЗ, рдХреБрдЫ рдЕрдиреНрдп рд╕рдВрдХреЗрдд рдкрд╣рд▓реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЗрд╕реЗ (PTRACE_CONT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд░рдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕реНрд╡рдпрдВ, рд╣рдорд╛рд░реЗ SIGSTOP рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
static int wait_for_process_stop(pid_t pid, int expected_signal) { for (;;) { int status = 0; if (waitpid(pid, &status, 0) < 0) return -1; if (WIFSIGNALED(status) || WIFEXITED(status)) return -1; if (WIFSTOPPED(status)) { int stop_signal = status >> 8; if (stop_signal == expected_signal) break; if (ptrace(PTRACE_CONT, pid, 0, stop_signal) < 0) return -1; continue; } return -1; } return 0; }
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдпреЛрдЧ
рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдмрд╕ PTRACE_DETACH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
int ptrace_detach(pid_t pid) { if (ptrace(PTRACE_DETACH, pid, 0, 0) < 0) return -1; return 0; }
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдбрд┐рдмрдЧрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдбрд┐рдмрдЧрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╡реЗ ptrace () рджреНрд╡рд╛рд░рд╛ рд░реЛрдХ рджрд┐рдП рдЧрдП рдереЗ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ SIGSTOP рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ ptrace () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд SIGCONT рдпрд╛ PTRACE_DETACH рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдЬрд╛рдЧреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдВрд╕реНрдХреГрддрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
Ptrace_scope рд╕реЗрдЯрд┐рдВрдЧ
рдбреАрдмрдЧрд░ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдХреБрдЫ рднреА рдбрд┐рдмрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрдЧрд╛! рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдбрд┐рдмрдЧрд┐рдВрдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╕рд┐рд╕реНрдЯрдо рдЖрдорддреМрд░ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрдо рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд╝рд╛рдЗрд▓ / proc / sys / рдХрд░реНрдиреЗрд▓ / yama / ptrace_scope рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЪрд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
- 0 - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдиреЗ рд╢реБрд░реВ рдХреА рдереА
- 1 - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЛрдб, рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- 2 - рдХреЗрд╡рд▓ рдПрдХ рд░реВрдЯ рд╕рд┐рд╕реНрдЯрдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
- 3 - рдбрд┐рдмрдЧрд┐рдВрдЧ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рдореЛрдб рддрдм рддрдХ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдмреВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдбрд┐рдмрдЧрд░ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 0 рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ ptrace_scope рдлрд╝рд╛рдЗрд▓ (рдЬрд┐рд╕рдореЗрдВ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдХреЛ рд▓рд┐рдЦрдХрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
$ sudo sh -c 'echo 0 > /proc/sys/kernel/yama/ptrace_scope'
рдпрд╛ рдбрд┐рдмрдЧрд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВ:
$ sudo ./inject-thread ...
рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо
рдирддреАрдЬрддрди, рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдбрд┐рдмрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдбрд┐рдмрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИ:
$ sudo ./inject-thread --target $(pgrep docker) $ cat /proc/$(pgrep docker)/status | head Name: docker State: t (tracing stop) <--- Tgid: 31330 Ngid: 0 Pid: 31330 PPid: 1 TracerPid: 2789 <--- PID Uid: 0 0 0 0 Gid: 0 0 0 0 FDSize: 64 $ ps a | grep [2]789 2789 pts/5 S+ 0:00 ./inject-thread --target 31330
рдЪрд░рдг 2. рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦреЛрдЬреЗрдВ
рдЕрдЧрд▓рд╛ рдЪрд░рдг рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдмрд╣реБрдд рд╣реИ, рдЬрд╣рд╛рдВ рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?
рдлрд╝рд╛рдЗрд▓ / рдЦрд░реАрдж / $ рдкреАрдЖрдИрдбреА тАЛтАЛ/ рдирдХреНрд╢реЗ
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реНрдиреЗрд▓ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХреНрдпрд╛ рдФрд░ рдХрд╣рд╛рдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ , рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП / proc рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ:
$ рдмрд┐рд▓реНрд▓реА / рдЦрд░реАрдж / рд╕реНрд╡ / рдирдХреНрд╢реЗ
00400000-0040c000 r-xp 00000000 fe: 01 1044592 / рдмрд┐рди / рдмрд┐рд▓реНрд▓реА
0060b000-0060c000 r - p 0000b000 fe: 01 1044592 / рдмрд┐рди / рдмрд┐рд▓реНрд▓реА
0060c000-0060d000 rw-p 0000c000 fe: 01 1044592 / рдмрд┐рди / рдмрд┐рд▓реНрд▓реА
013d5000-013f6000 rw-p 00000000 00:00 0 [рдвреЗрд░]
7f9920bd1000-7f9920d72000 r-xp 00000000 fe: 01 920019 /lib/x86_64-linux-gnu/libc-2.19.so
7f9920d72000-7f9920f72000 --- p 001a1000 fe: 01 920019 /lib/x86_64-linux-gnu/libc-2.19.so
7f9920f72000-7f9920f76000 r - p 001a1000 fe: 01 920019 /lib/x86_64-linux-gnu/libc-2.19.so
7f9920f76000-7f9920f78000 rw-p 001a5000 fe: 01 920019 /lib/x86_64-linux-gnu/libc-2.19.so
7fc3f8381000-7fc3f8385000 rw-p 00000000 00:00 0
7fc3f8385000-7fc3f83a6000 r-xp 00000000 fe: 01 920012 /lib/x86_64-linux-gnu/ld-2.19.so
7fc3f83ec000-7fc3f840e000 rw-p 00000000 00:00 0
7fc3f840e000-7fc3f8597000 r - p 00000000 fe: 01 657286 / usr / lib / рд╕реНрдерд╛рдиреАрдп / рд╕реНрдерд╛рдиреАрдп-рд╕рдВрдЧреНрд░рд╣
7fc3f8597000-7fc3f859a000 rw-p 00000000 00:00 0
7fc3f85a3000-7fc3f85a5000 rw-p 00000000 00:00 0
7fc3f85a5000-7fc3f85a6000 r - p 00020000 fe: 01 920012 /lib/x86_64-linux-gnu/ld-2.19.so
7fc3f85a6000-7fc3f85a7000 rw-p 00021000 fe: 01 920012 /lib/x86_64-linux-gnu/ld-2.19.so
7fc3f85a7000-7fc3f85a8000 rw-p 00000000 00:00 0
7ffdb6f0e000-7ffdb6f2f000 rw-p 00000000 00:00 0 [рд╕реНрдЯреИрдХ]
7ffdb6f7f000-7ffdb6f81000 r-xp 00000000 00:00 0 [vdso]
7ffdb6f81000-7ffdb6f83000 r - p 00000000 00:00 0 [vvar]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [рд╡рд┐рд╕реНрдХреЙрдиреНрд╕рд┐рди]
рдЗрд╕ рдлрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдордХреНрдЦреА рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ:
- рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдкрддрд╛ рд╕реАрдорд╛
- рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдЕрдзрд┐рдХрд╛рд░
r/-
: рдкрдврд╝рд╛w/-
: рд▓рд┐рдЦреЗрдВx/-
: рдирд┐рд╖реНрдкрд╛рджрдиp/s
: рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛
- рдлрд╝рд╛рдЗрд▓ рдСрдлрд╕реЗрдЯ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ)
- рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдХреЛрдб рдЬрд╣рд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд┐рдд рд╣реИ
- рдлрд╝рд╛рдЗрд▓ рдЗрдирдХреЛрдб рд╕рдВрдЦреНрдпрд╛ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ)
- рдкреНрд░рджрд░реНрд╢рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде (рдпрджрд┐ рдХреЛрдИ рд╣реЛ)
рдореЗрдореЛрд░реА рдХреЗ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЬрдм рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдРрд╕реА рдореЗрдореЛрд░реА рдкрдврд╝рддреА рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдлрд╕реЗрдЯ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рддреЛ рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ ( рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ рдореИрдХреЗрдирд┐рдЬреНрдо, p
рдореЛрдб рдкреНрд░рд╛рдЗрд╡реЗрдЯ рд╣реИ), рдпрд╛ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ ( s
рдореЛрдб рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдЕрдирд╛рдо рд╣реИрдВ - рдпрд╣ рдореЗрдореЛрд░реА рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рд╕рд╛рдорд╛рдиреНрдп" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП: рд╕реНрдЯреИрдХ рдФрд░ рдвреЗрд░ред рдЕрдирд╛рдо рдХреНрд╖реЗрддреНрд░ рдпрд╛ рддреЛ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ ( рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рддрдВрддреНрд░) рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫрджреНрдо рдирд╛рдореЛрдВ [vdso] рдФрд░ [vsyscall] рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдореЗрдореЛрд░реА рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд╣рдо рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рд╕реЗ рдЙрд╕рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрди рд╕рднреА рдкрддреЛрдВ рдХреЛ рдЦреЛрдЬ рд▓реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреИрдирдл (рдкрд░рд┐рд╡рд╛рд░) рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
static bool read_proc_line(const char *line, const char *library, struct memory_region *region) { unsigned long vaddr_low = 0; unsigned long vaddr_high = 0; char read = 0; char write = 0; char execute = 0; int path_offset = 0; sscanf(line, "%lx-%lx %c%c%c%*c %*lx %*x:%*x %*d %n", &vaddr_low, &vaddr_high, &read, &write, &execute, &path_offset); if (!strstr(line + path_offset, library)) return false; if (region) { region->vaddr_low = vaddr_low; region->vaddr_high = vaddr_high; region->readable = (read == 'r'); region->writeable = (write == 'w'); region->executable = (execute == 'x'); region->content = NULL; } return true; }
, libc-2.19.so, :

2 - ? 51? ? ?
, , .
, , . , , , (, , ).
, ( 4 ). , .
, . тАФ тАФ . 2 тАФ , ( x86_64 4 , 2 , 1 ). .
, :
- libdl: dlopen() dlsym()
- libpthread: pthread_create() pthread_detach()
, , . Linux ( address space layout randomization , ASLR). (- , ), тАФ - .
, , , /proc/$pid/maps. , .
3. ELF-
, , , .
:
$ nm -D /lib/x86_64-linux-gnu/libdl-2.19.so | grep dlopen 0000000000001090 T dlopen
nm . .
- , nm , . , dlsym().
тАФ ELF-, . procfs. UNIX way, /proc/$pid/mem , тАФ ( /proc/$pid/maps).
Linux mmap(), ( , ). :
static int map_region(pid_t pid, struct memory_region *region) { size_t length = region->vaddr_high - region->vaddr_low; off_t offset = region->vaddr_low; char path[32] = {0}; snprintf(path, sizeof(path), "/proc/%d/mem", pid); int fd = open(path, O_RDONLY); if (fd < 0) goto error; void *buffer = malloc(length); if (!buffer) goto error_close_file; if (read_region(fd, offset, buffer, length) < 0) goto error_free_buffer; region->content = buffer; close(fd); return 0; error_free_buffer: free(buffer); error_close_file: close(fd); error: return -1; } static int read_region(int fd, off_t offset, void *buffer, size_t length) { if (lseek(fd, offset, SEEK_SET) < 0) return -1; size_t remaining = length; char *ptr = buffer; while (remaining > 0) { ssize_t count = read(fd, ptr, remaining); if (count < 0) return -1; remaining -= count; ptr += count; } return 0; }
ELF- . , -, , -, .
ELF
ELF тАФ Linux. , , .
ELF . ELF . тАФ , . , тАФ . ELF-.
, libdl-2.19.so :

( readelf --headers
.)
, , (29 9). тАФ , , . ELF тАФ , . Linux, , LOAD, ( ).
ELF- , . , .
, . ┬л┬╗ . .bss, , ( ).
, ELF тАФ , . ...
?
() . , dlsym(), . - .
ELF (. 2-10). , .dynamic , DYNAMIC . .dynamic , :
- .dynsym тАФ ;
- .dynstr тАФ ;
- .hash тАФ -, .
, , ELF:

ELF, (1), (2), (3), (4) , ред
ELF тЖТ
() ELF <elf.h>, , , . , ELF тАФ . 32- 64- , , , . x86_64, ELF .
ELF- ( Elf64_Ehdr ). ( program headers ), e_phoff e_phnum :

тАФ , , ELF- тАФ , , , , .
e_phoff, , . e_phnum e_phentsize .
( ), ELF тАФ 64 .
тЖТ DYNAMIC
. тАФ Elf64_Phdr ( 64- ELF-), . PT_DYNAMIC p_type :

:
- p_vaddr тАФ , ;
- p_memsz тАФ .
.dynamic 0x2D88 ( ). DYNAMIC тАФ 0x202D88. 0x210 (8448) . .
DYNAMIC тЖТ .dynsym, .dynstr, .hash
.dynamic, DYNAMIC, . Elf64_Dyn , :

8 d_val d_ptr , 8- d_tag , , . :
- DT_HASH (4) тАФ .hash ( d_ptr)
- DT_STRTAB (5) тАФ .dynstr ( d_ptr)
- DT_SYMTAB (6) тАФ .dynsym ( d_ptr)
- DT_STRSZ (10) тАФ .dynstr ( d_val)
- DT_NULL (0) тАФ
. .dynamic : , , , .
, DYNAMIC , . , , - , .
.dynamic , . -, .dynstr , ? .
. , .dynsym , . ( ┬л┬╗ .symtab, , , . .)
Elf64_Sym , ELF тАФ , , , . dlopen
:

:
- st_name тАФ ,
- st_info тАФ ( )
- st_value тАФ
( , nm , dlopen() .text, 0x1090 .)
, .
тАФ - , . ( ). .dynstr , libdl-2.19.so :

, ( ┬лdlopen┬╗, 0xA5) , . .
-
.hash - , . - тАФ тАФ ELF-, . , .dynsym, , . ( ) - .
- <elf.h>, (. 2-19). - , :

рдЬрд╣рд╛рдБ
- nbuckets тАФ buckets
- nchains тАФ chains ( )
- buckets тАФ
- chains тАФ
- :
- h .
- i
buckets[h % nbuckets]
, . - ( ) , .
- тАФ
chains[i % nchains]
. - 3тАФ4 , .
-, ELF:
static uint32_t elf_hash(const char *name) { uint32_t h = 0; uint32_t g; while (*name) { h = (h << 4) + *name++; g = h & 0xF0000000; if (g) h ^= g >> 24; h &= ~g; } return h; }
, "dlopen"
- 112420542 :

libdl тАФ , 39 , . - .
, :
- dlopen() dlsym() libdl
- pthread_create() pthread_detach() libpthread
, .
. . , .
ELF- . , ( ). , . , , . .
4. -
, , - , : , . - .
-
, -:
void shellcode(void) { void *payload = dlopen("/path/to/payload.so", RTLD_LAZY); void (*entry)(void) = dlsym(payload, "entry_point"); pthread_t thread; pthread_create(&thread, NULL, entry, NULL); pthread_detach(thread); }
?
, тАФ . , , , - тАФ - ! .
тАФ - . , , : .
.section .rodata .global shellcode_start .global shellcode_address_dlopen .global shellcode_address_dlsym .global shellcode_address_pthread_create .global shellcode_address_pthread_detach .global shellcode_address_payload .global shellcode_address_entry .global shellcode_end .set RTLD_LAZY, 1 .align 8 shellcode_start: lea shellcode_address_payload(%rip),%rdi mov $RTLD_LAZY,%rsi mov shellcode_address_dlopen(%rip),%rax callq *%rax mov %rax,%rdi lea shellcode_address_entry(%rip),%rsi mov shellcode_address_dlsym(%rip),%rax callq *%rax sub $8,%rsp mov %rsp,%rdi xor %rsi,%rsi mov %rax,%rdx xor %rcx,%rcx mov shellcode_address_pthread_create(%rip),%rax callq *%rax mov (%rsp),%rdi add $8,%rsp mov shellcode_address_pthread_detach(%rip),%rax callq *%rax int $3 .align 8 shellcode_address_dlopen: .space 8 shellcode_address_dlsym: .space 8 shellcode_address_pthread_create: .space 8 shellcode_address_pthread_detach: .space 8 shellcode_address_payload: .space 256 shellcode_address_entry: .space 256 shellcode_end: .end
, . :
$ as -o shellcode.o shellcode.S
, , , . : (procedure linkage table, PLT), .
- , (, ) . - .
-
- . , , , . ?
-
, . , . , . , .
(- ), : , , . , , JIT- , . ?
:
, . -, - , . -, . -, , - -, .
, . . x86_64 int $3
тАФ 0xCC тАФ . ptrace() PTRACE_POKETEXT тАФ , 8 , . , , .
, , , : . - , .
?
, ! malloc()!
. , -, . . , mmap():
void inject_shellcode(const void *shellcode_src, size_t shellcode_size) { void *shellcode_dst = mmap(NULL, shellcode_size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); copy_shellcode(shellcode_dst, shellcode_src, shellcode_size); }
, ptrace() , .
, ? , . Linux x86_64 :
- %rax
- тАФ тАФ %rsi, %rdi, %rdx, %r10, %r8, %r9
- SYSCALL,
- %rax
ptrace() PTRACE_GETREGS PTRACE_SETREGS. , . - SYSCALL.
: , %rip. , , SYSCALL.
SYSCALL
SYSCALL? , . - , - . тАФ libc. , , , :
unsigned long find_syscall_instruction(struct library *library) { for (size_t i = 0; i < library->region_count; i++) { struct memory_region *region = &library->regions[i]; if (!(region->readable && region->executable)) continue; const uint8_t *region_data = region->content; size_t region_size = region->vaddr_high - region->vaddr_low; if (region_size < 2) continue; for (size_t offset = 0; offset < region_size - 1; offset++) { if (region_data[offset + 0] == 0x0F && region_data[offset + 1] == 0x05) { return region->vaddr_low + offset; } } } return 0; }
, /proc/$pid/maps . x86_64 , - . , 0x0F 0x05. , , ARM, 0xDF 0x00 ( SVC #0), .
PTRACE_{GET,SET}REGS
:
int get_registers(pid_t pid, struct user_regs_struct *registers) { int err = 0; if (ptrace(PTRACE_GETREGS, pid, registers, registers) < 0) err = -errno; return err; }
struct user_regs_struct
, <sys/user.h>. . . , varargs :
static int set_regs_for_syscall(struct user_regs_struct *registers, unsigned long syscall_insn_vaddr, long syscall_number, int args_count, va_list args) { registers->rip = syscall_insn_vaddr; registers->rax = syscall_number; for (int i = 0; i < args_count; i++) { switch (i) { case 0: registers->rdi = va_arg(args, long); break; case 1: registers->rsi = va_arg(args, long); break; case 2: registers->rdx = va_arg(args, long); break; case 3: registers->r10 = va_arg(args, long); break; case 4: registers->r8 = va_arg(args, long); break; case 5: registers->r9 = va_arg(args, long); break; default: return -E2BIG; } } return 0; } static long perform_syscall(pid_t pid, unsigned long syscall_insn_vaddr, long syscall_number, int args_count, ...) { struct user_regs_struct old_registers; struct user_regs_struct new_registers; get_registers(pid, &old_registers); new_registers = old_registers; va_list args; va_start(args, args_count); set_regs_for_syscall(&new_registers, syscall_insn_vaddr, syscall_number, args_count, args); va_end(args); set_registers(pid, &new_registers); wait_for_syscall_completion(pid); get_registers(pid, &new_registers); long result = new_registers.rax; set_registers(pid, &old_registers); return result; }
PTRACE_SYSCALL
: , ?
PTRACE_SYSCALL. PTRACE_CONT, . , - : , .
PTRACE_SYSCALL SIGTRAP : ( ) ( ). , ptrace() , , .
, SIGTRAP:
static int wait_for_syscall_enter_exit_stop(pid_t pid) { if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) return -1; if (wait_for_process_stop(pid, SIGTRAP) < 0) return -1; return 0; } void wait_for_syscall_completion(pid_t pid) { wait_for_syscall_enter_exit_stop(pid); wait_for_syscall_enter_exit_stop(pid); }
тАФ , тАФ (wait_for_process_stop() ). . , .
PTRACE_O_TRACESYSGOOD
, PTRACE_SYSCALL : , , - . , SIGTRAP ( ).
SIGTRAP . PTRACE_O_TRACESYSGOOD, :
- SIGTRAP тАФ -
- SIGTRAP | 0x80 тАФ
int ptrace_attach(pid_t pid) { if (ptrace(PTRACE_ATTACH, pid, 0, 0) < 0) return -1; if (wait_for_process_stop(pid, SIGSTOP) < 0) return -1; + /* */ + unsigned long options = PTRACE_O_TRACESYSGOOD; + if (ptrace(PTRACE_SETOPTIONS, pid, 0, options) < 0) + return -1; return 0; } static int wait_for_syscall_enter_exit_stop(pid_t pid) { if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) return -1; - if (wait_for_process_stop(pid, SIGTRAP) < 0) + if (wait_for_process_stop(pid, SIGTRAP | 0x80) < 0) return -1; return 0; }
-
- :
void write_shellcode(void) { char shellcode_text[SHELLCODE_TEXT_SIZE]; size_t shellcode_size = shellcode_end - shellcode_start; prepare_shellcode(shellcode_text, shellcode_size); write_remote_memory(target, shellcode_text_vaddr, shellcode_text, shellcode_size); }
- : dlopen(), .
static inline void copy_shellcode(char *shellcode_text, const char *shellcode_addr, const void *data, size_t length) { ptrdiff_t offset = shellcode_addr - shellcode_start; memcpy(shellcode_text + offset, data, length); } static void prepare_shellcode(char *shellcode_text, size_t shellcode_size) { copy_shellcode(shellcode_text, shellcode_start, shellcode_start, shellcode_size); copy_shellcode(shellcode_text, shellcode_address_dlopen, &dlopen_vaddr, sizeof(dlopen_vaddr)); copy_shellcode(shellcode_text, shellcode_address_dlsym, &dlsym_vaddr, sizeof(dlsym_vaddr)); copy_shellcode(shellcode_text, shellcode_address_pthread_create, &pthread_create_vaddr, sizeof(pthread_create_vaddr)); copy_shellcode(shellcode_text, shellcode_address_pthread_detach, &pthread_detach_vaddr, sizeof(pthread_detach_vaddr)); copy_shellcode(shellcode_text, shellcode_address_payload, payload, sizeof(payload)); copy_shellcode(shellcode_text, shellcode_address_entry, entry, sizeof(entry)); }
, , -:
extern const char shellcode_start[]; extern const char shellcode_address_dlopen[]; extern const char shellcode_address_dlsym[]; extern const char shellcode_address_pthread_create[]; extern const char shellcode_address_pthread_detach[]; extern const char shellcode_address_payload[]; extern const char shellcode_address_entry[]; extern const char shellcode_end[];
, .
- . /proc/$pid/mem, :
int write_remote_memory(pid_t pid, unsigned long vaddr, const void *data, size_t size) { char path[32] = {0}; snprintf(path, sizeof(path), "/proc/%d/mem", pid); int fd = open(path, O_WRONLY); if (fd < 0) return -1; if (lseek(fd, vaddr, SEEK_SET) < 0) { close(fd); return -1; } int err = do_write_remote_memory(fd, data, size); close(fd); return err; } static int do_write_remote_memory(int fd, const void *data, size_t size) { size_t left = size; while (left > 0) { ssize_t wrote = write(fd, data, left); if (wrote < 0) return -1; data += wrote; left -= wrote; } return 0; }
, - тАФ ┬л ┬╗ . . - , .
5.
- . , : %rip -, PTRACE_SETREGS, PTRACE_CONT . .
, , . -? ?
, . , ┬л ┬╗ . , . :
тАФ . dlopen() pthread_create() . - dlopen(), dlopen() ?
-, , , . , pthread_create() . , ( ). clone().
pthread_create()?
, - , ?
: clone().
, (libc) (pthread). clone() (thread control block, TCB) (thread-local storage, TLS), , . . pthread_create() , .
┬л┬╗, clone() libc pthread. , .
clone() :
: -?
, - : , , , .
. , , . рдХреИрд╕реЗ? : exit(). , .
. exit() -:
+.set __NR_exit, 60 .set RTLD_LAZY, 1 @@ - /* - * . - */ - int $3 + /* + * exit(0); + */ + xor %rdi,%rdi + mov $__NR_exit,%rax + syscall
: exit() тАФ exit() . exit() , exit() тАФ . Linux exit_group().
. . , , PROT_EXEC:
shellcode_stack_vaddr = remote_mmap(target, syscall_vaddr, 0, SHELLCODE_STACK_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_STACK | MAP_GROWSDOWN, -1, 0);
, Linux x86_64 тАФ ┬л┬╗ , . mmap() , clone() . , mmap() MAP_GROWSDOWN, , .
PTRACE_O_TRACECLONE
. , - . waitpid(), : , .
тАФ PTRACE_O_TRACECLONE. . , . , , , . , PTRACE_ATTACH , .
-, :
- unsigned long options = PTRACE_O_TRACESYSGOOD; + unsigned long options = PTRACE_O_TRACESYSGOOD | PTRACE_O_TRACECLONE; if (ptrace(PTRACE_SETOPTIONS, pid, 0, options) < 0) return -1;
-, clone(), PTRACE_EVENT_CLONE, , PTRACE_SYSCALL. :
-void wait_for_syscall_completion(pid_t pid) +void wait_for_syscall_completion(pid_t pid, long syscall) { wait_for_syscall_enter_exit_stop(pid); + + /* clone() PTRACE_EVENT_CLONE */ + if (syscall == __NR_clone) + wait_for_clone_event(pid); wait_for_syscall_enter_exit_stop(pid); }
:
static int wait_for_clone_event(pid_t pid) { if (ptrace(PTRACE_CONT, pid, 0, 0) < 0) return -1; int event = SIGTRAP | (PTRACE_EVENT_CLONE << 8); if (wait_for_process_stop(pid, event) < 0) return -1; return 0; }
clone() PID , . :
void clear_ptrace_options(pid_t pid) { ptrace(PTRACE_SETOPTIONS, pid, 0, 0); }
, clone() ptrace(), PTRACE_O_TRACECLONE. , , - .
, - . clone() :
static int spawn_shell_thread() { shell_tid = remote_clone(target, syscall_ret_vaddr, CLONE_FILES | CLONE_FS | CLONE_IO | CLONE_SIGHAND | CLONE_SYSVSEM | CLONE_THREAD | CLONE_VM, shellcode_stack_vaddr + SHELLCODE_STACK_SIZE); if (!shell_tid) return -1; return 0; }
clone() : , , , . , .
CLONE_FILES, CLONE_FS, CLONE_IO, CLONE_SIGHAND, CLONE_SYSVSEM, CLONE_VM тАФ . , CLONE_FILES , ( fork()). тАФ тАФ , . . , CLONE_VM , , .
CLONE_THREAD : Linux тАФ ┬л ┬╗, . , , getpid() , kill() тАФ - , execve() тАФ , .
, clone() fork(): , . clone() : , тАФ . . ( , , .)
, pthread_create() , , . ?
fork() :
pid_t child = fork(); if (child < 0) { } if (child == 0) { }
, . clone() . .
. , clone() , . syscall ret, , . .
SYSCALL + RET
, . , syscall ret:
-if (region_size < 2) +if (region_size < 3) continue; /* * 0F 05 syscall + * C3 retq */ -for (size_t offset = 0; offset < region_size - 1; offset++) { +for (size_t offset = 0; offset < region_size - 2; offset++) { if (region_data[offset + 0] == 0x0F && - region_data[offset + 1] == 0x05) + region_data[offset + 1] == 0x05 && + region_data[offset + 2] == 0xC3) { return region->vaddr_low + offset; } }
, .
. prepare_shellcode() , , :
void write_shellcode(void) { char shellcode_text[SHELLCODE_TEXT_SIZE]; size_t shellcode_size = shellcode_end - shellcode_start; /* , , . . */ prepare_shellcode(shellcode_text, shellcode_size); /* - */ write_remote_memory(target, shellcode_text_vaddr, shellcode_text, shellcode_size); + /* ┬л┬╗ */ + unsigned long retaddr_vaddr = + shellcode_stack_vaddr + SHELLCODE_STACK_SIZE - 8; + write_remote_memory(target, retaddr_vaddr, + &shellcode_text_vaddr, sizeof(shellcode_text_vaddr)); }
, , .
, , . System V ABI , ( %rsp) 16 . shellcode_stack_vaddr + SHELLCODE_STACK_SIZE
: ( 4096 ), 1 . 8 , , retq, - . - :
- sub $8,%rsp + sub $16,%rsp /* */ mov %rsp,%rdi xor %rsi,%rsi mov %rax,%rdx xor %rcx,%rcx mov shellcode_address_pthread_create(%rip),%rax callq *%rax
, %rsp 16 pthread_create(). SIGSEGV, тАФ pthread_create() , .
, - , clone():
static int spawn_shell_thread() { shell_tid = remote_clone(target, syscall_ret_vaddr, CLONE_FILES | CLONE_FS | CLONE_IO | CLONE_SIGHAND | CLONE_SYSVSEM | CLONE_THREAD | CLONE_VM, /* ** */ - shellcode_stack_vaddr + SHELLCODE_STACK_SIZE); + shellcode_stack_vaddr + SHELLCODE_STACK_SIZE - 8); if (!shell_tid) return -1; return 0; }
ptrace() SIGSTOP, :
int ignore_thread_stop(pid_t pid) { return wait_for_process_stop(pid, SIGSTOP); }
. ptrace():
void resume_thread(pid_t pid) { ptrace(PTRACE_CONT, pid, 0, 0); }
, , , exit(). waitpid(). тАФ CLONE_THREAD wait() ,тАФ PTRACE_O_TRACECLONE, :
int wait_for_process_exit(pid_t pid) { int status = 0; if (waitpid(pid, &status, 0) < 0) return -1; if (!WIFEXITED(status)) return -1; return WEXITSTATUS(status); }
pthread , , pthread_join() pthread , . , тАФ . , , .
рдореБрдХреНрдд рд╕реНрдореГрддрд┐
, - . , - , munmap():
void remote_munmap(pid_t pid, unsigned long syscall_insn_vaddr, unsigned long addr, size_t len) { perform_syscall(pid, syscall_insn_vaddr, __NR_munmap, 2, (long) addr, (long) len); } static void unmap_shellcode() { remote_munmap(target, syscall_ret_vaddr, shellcode_text_vaddr, SHELLCODE_TEXT_SIZE); remote_munmap(target, syscall_ret_vaddr, shellcode_stack_vaddr, SHELLCODE_STACK_SIZE); }
, , , тАФ ptrace() . (, SIGSTOP), , ( ):
int stop_thread(pid_t pid) { if (kill(pid, SIGSTOP) < 0) return -1; if (wait_for_process_stop(pid, SIGSTOP) < 0) return -1; return 0; }
, , . PTRACE_DETACH:
int ptrace_detach(pid_t pid) { if (ptrace(PTRACE_DETACH, pid, 0, 0) < 0) return -1; return 0; }
, . , . , .
рдирд┐рд╖реНрдХрд░реНрд╖
? . , , .

Linux . GTK+ . , make:
libpayload.so: payload.c $(CC) $(CFLAGS) $(shell pkg-config --cflags --libs gtk+-3.0) -shared -o $@ $<
entry() GTK- тАФ GTK UI , :
#include <glib.h> #include <gtk/gtk.h> static gboolean actual_entry(gpointer _arg) { /* : */ hook_gtk_entry_constructor(); /* FALSE, */ return FALSE; } void entry(void) { /* -, */ g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, actual_entry, NULL, NULL); }
, GTK , GtkEntry . "input-purpose" . ┬л┬╗, , .
GTK glib тАФ тАФ GtkEntry . constructed(), . :
static void (*old_gtk_entry_constructed)(GObject *object); static void new_gtk_entry_constructed(GObject *object) { GtkEntry *entry = GTK_ENTRY(object); old_gtk_entry_constructed(object); } static void hook_gtk_entry_constructor(void) { GTypeClass *entry_type_class = g_type_class_peek(GTK_TYPE_ENTRY); GObjectClass *entry_object_class = G_OBJECT_CLASS(entry_type_class); old_gtk_entry_constructed = entry_object_class->constructed; entry_object_class->constructed = new_gtk_entry_constructed; }
GtkEntry :
, GtkEntry , , . , :
static void new_gtk_entry_constructed(GObject *object) { GtkEntry *entry = GTK_ENTRY(object); old_gtk_entry_constructed(object); g_signal_connect(entry, "notify::input-purpose", G_CALLBACK(input_purpose_changed), NULL); g_signal_connect(entry, "icon-press", G_CALLBACK(icon_pressed), NULL); g_signal_connect(entry, "icon-release", G_CALLBACK(icon_released), NULL); }
. , . .
static void input_purpose_changed(GtkEntry *entry) { GtkInputPurpose purpose = gtk_entry_get_input_purpose(entry); if (purpose == GTK_INPUT_PURPOSE_PASSWORD) { gtk_entry_set_icon_activatable(entry, GTK_ENTRY_ICON_PRIMARY, TRUE); gtk_entry_set_icon_from_icon_name(entry, GTK_ENTRY_ICON_PRIMARY, "list-remove"); } else { gtk_entry_set_icon_activatable(entry, GTK_ENTRY_ICON_PRIMARY, FALSE); gtk_entry_set_icon_from_icon_name(entry, GTK_ENTRY_ICON_PRIMARY, NULL); } }
: , , , - , :
static void icon_pressed(GtkEntry *entry, GtkEntryIconPosition position) { if (position != GTK_ENTRY_ICON_PRIMARY) return; gtk_entry_set_visibility(entry, TRUE); gtk_entry_set_icon_from_icon_name(entry, GTK_ENTRY_ICON_PRIMARY, "list-add"); } static void icon_released(GtkEntry *entry, GtkEntryIconPosition position) { if (position != GTK_ENTRY_ICON_PRIMARY) return; gtk_entry_set_visibility(entry, FALSE); gtk_entry_set_icon_from_icon_name(entry, GTK_ENTRY_ICON_PRIMARY, "list-remove"); }
рд╡рд╣ рд╕рдм рд╣реИред
GitHub (GPLv2).
, . gdb :
$ gdb --pid $(pgrep target) \ --batch \ -ex 'compile file -raw shell-code.c'