Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfрдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА
ret2csu рдПрдХ рд╣реИрдХрд┐рдВрдЧ рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ gadgets рдирд╣реАрдВ рдорд┐рд▓рддреЗред
рдЬрдм рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдЬреИрд╕реЗ libc) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдЫрд┐рдкреЗ рд╣реБрдП рд░рддреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдЧрд╛рдпрдм gadgets рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЬрд┐рд╕реЗ __libc_csu_init
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
__libc_csu_init рдореЗрдВ рдЬрд╛рджреБрдИ gadgets
__libc_csu_init
рдореЗрдВ, рджреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо (gadgets) рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ:
рдкрд╣рд▓рд╛ рдЕрдиреБрдХреНрд░рдо рд╣рдореЗрдВ рдХрдИ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (rbx, rbp, r12, r13, r14, r15) рдореЗрдВ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпреЗ рдРрд╕реЗ рд╕реНрд▓реЙрдЯ рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдПрдБ рдпрд╛ рдкрддреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЧреИрдЬреЗрдЯ рд╣рдореЗрдВ рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреЙрдк рдХрд░рдХреЗред
рджреВрд╕рд░рд╛ рдЕрдиреБрдХреНрд░рдо рдЙрди рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рд╕реЗрдЯ рдХрд┐рдП рд╣реИрдВ, рдХреБрдЫ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдЕрдиреНрдп рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдВред
рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ рдЬреЛ r15 рдФрд░ rbx рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдлрд┐рд░ rbx рдХреЛ 8 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╢рд╛рдпрдж рдЖрдк рд╡рд╣рд╛рдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдФрд░ рдЖрдкрдХреЛ
ret
рдирд┐рд░реНрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреВрд╕рд░рд╛ рдЧреИрдЬреЗрдЯ рднреАret
рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рд╢рд░реНрддреЗрдВ рд╣реЛрдВрдЧреА:
[r12 + rbx*8]
рдХреЛ рдПрдХ рдкрддрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдИ рдкрд╛рдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдмрд╕_init
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):рдпрджрд┐ _init
0x400560
рдкрд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП GEF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ рдФрд░[r12 + rbx*8]
рдХреЛ _init рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдкрддрд╛ рдмрдирд╛рдПрдВ:
rbp
рдФрд░rbx
рдХрд╛ рдорд╛рди рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдХреВрдж рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗрдХреБрдЫ рдЫреЛрдбрд╝реЗ рдЧрдП рдкреЙрдк рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП
RDI рдФрд░ RSI
rdi
рдФрд░ rsi
рдХреЛ ret2csu рдЧреИрдЬреЗрдЯ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рд╡рд┐рд╢реЗрд╖ рдСрдлрд╕реЗрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдирд╛:
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреГрд╖реНрда рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:
рдЙрджрд╛рд╣рд░рдг
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ syscall рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ write()
рдЬреИрд╕реА рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди rdx
рдФрд░ rsi
рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдорд╛рди рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЖрдк рдЙрди рдЧреИрдЬреЗрдЯреНрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХреЛрдИ рдирд╣реАрдВ рдкрд╛ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣рд╛рдВ ret2csu рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ:
рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ: рдкрд╣рд▓реЗ рдЬрд╛рджреБрдИ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреЙрдк рдХрд░реЗрдВ рдФрд░ rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), рдФрд░ r15 рдореЗрдВ рдбрд╛рд▓реЗрдВред
рджреВрд╕рд░реЗ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдЙрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреВрд╕рд░реЗ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЪреБрдиреЗ рд╣реБрдП рдорд╛рдиреЛрдВ рдХреЛ
rdx
рдФрд░rsi
(рдХреНрд░рдорд╢рдГ r14 рдФрд░ r13 рд╕реЗ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,r15
рдФрд░rbx
рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░[r15 + rbx*8]
рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рдордЭрд╛рддреЗ рд╣реБрдП рд╣реИ, рдФрд░ рдпрд╣ рдЕрдВрддрд┐рдо рд╢реЛрд╖рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЗрд╕рдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп RCE
рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди win
рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ (ROP рдЪреЗрди рдореЗрдВ win
рдХрд╛ рдкрддрд╛ stdin рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ r15 рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛) рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕рдХрд╛ рдорд╛рди 0xdeadbeefcafed00d
рд╣реИред
рдХреЙрд▓ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдФрд░ ret рддрдХ рдкрд╣реБрдБрдЪрдирд╛
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдЗрд╕ рдкреГрд╖реНрда рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдБ ret2csu рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рддреБрд▓рдирд╛рдУрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреЙрд▓ рдХреЗ рдмрд╛рдж ret
рддрдХ рдкрд╣реБрдБрдЪ рд░рд╣рд╛ рд╣реИ:
Why Not Just Use libc Directly?
рдЖрдорддреМрд░ рдкрд░ рдпреЗ рдорд╛рдорд▓реЗ ret2plt + ret2lib рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЙрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реАрдзреЗ libc рдореЗрдВ рдкрд╛рдП рдЧрдП рдЧреИрдЬреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, write()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрди рд╕рднреА рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрдЬреЗрдЯреНрд╕ рдЦреЛрдЬрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
Last updated