Skip to content

Commit 08adcce

Browse files
committedSep 5, 2024·
Add sigreturn_frame_x64
1 parent 0b89b2b commit 08adcce

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed
 

‎ptrlib/pwn/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .dynlink import *
22
from .fsb import *
33
from .fuzz import *
4+
from .rop import *

‎ptrlib/pwn/rop/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .srop import *

‎ptrlib/pwn/rop/srop.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from ptrlib.binary.packing.pack import p64
2+
from ptrlib.binary.packing.flat import flat
3+
4+
def sigreturn_frame_x64(uc_flags: int = 0, uc_link: int = 0,
5+
ss_sp: int = 0, ss_flags: int = 0, ss_size: int = 0,
6+
r8: int = 0, r9: int = 0, r10: int = 0,
7+
r11: int = 0, r12: int = 0, r13: int = 0,
8+
r14: int = 0, r15: int = 0, rdi: int = 0,
9+
rsi: int = 0, rbp: int = 0, rbx: int = 0,
10+
rdx: int = 0, rax: int = 0, rcx: int = 0,
11+
rsp: int = 0, rip: int = 0, eflags: int = 0,
12+
cs: int = 0x33, gs: int = 0, fs: int = 0, pad0: int = 0,
13+
err: int = 0, trapno: int = 0, oldmask: int = 0,
14+
cr2: int = 0, pfpstate: int = 0, reserved: int = 0,
15+
mask: int = 0, fpstate: int = 0,):
16+
"""Create sigreturn frame for x64
17+
"""
18+
return flat([
19+
uc_flags, uc_link, ss_sp, ss_flags, ss_size,
20+
r8, r9, r10, r11, r12, r13, r14, r15,
21+
rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip,
22+
eflags, cs | (gs << 16) | (fs << 32) | (pad0 << 48),
23+
err, trapno, oldmask, cr2, pfpstate, reserved, mask, fpstate
24+
], map=p64)

‎tests/pwn/test_srop.py

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import inspect
2+
import os
3+
import random
4+
import unittest
5+
from logging import FATAL, getLogger
6+
7+
from ptrlib import sigreturn_frame_x64, u16, u64
8+
9+
10+
class TestSROP(unittest.TestCase):
11+
def setUp(self):
12+
getLogger("ptrlib").setLevel(FATAL)
13+
14+
def test_srop_x64(self):
15+
(uc_flags, uc_link, ss_sp, ss_flags, ss_size,
16+
r8, r9, r10, r11, r12, r13, r14, r15,
17+
rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip,
18+
eflags, err, trapno, oldmask, cr2, pfpstate,
19+
mask, fpstate) = (random.randrange(0, 1<<64) for _ in range(30))
20+
gs = random.randrange(0, 1<<16)
21+
fs = random.randrange(0, 1<<16)
22+
23+
srop = sigreturn_frame_x64(
24+
uc_flags=uc_flags, uc_link=uc_link,
25+
ss_sp=ss_sp, ss_flags=ss_flags, ss_size=ss_size,
26+
r8=r8, r9=r9, r10=r10, r11=r11, r12=r12, r13=r13, r14=r14, r15=r15,
27+
rdi=rdi, rsi=rsi, rbp=rbp, rbx=rbx, rdx=rdx, rax=rax,
28+
rcx=rcx, rsp=rsp, rip=rip, eflags=eflags, err=err,
29+
trapno=trapno, oldmask=oldmask, cr2=cr2, pfpstate=pfpstate,
30+
mask=mask, fpstate=fpstate, gs=gs, fs=fs
31+
)
32+
33+
self.assertEqual(u64(srop[0x00:0x08]), uc_flags)
34+
self.assertEqual(u64(srop[0x08:0x10]), uc_link)
35+
self.assertEqual(u64(srop[0x10:0x18]), ss_sp)
36+
self.assertEqual(u64(srop[0x18:0x20]), ss_flags)
37+
self.assertEqual(u64(srop[0x20:0x28]), ss_size)
38+
self.assertEqual(u64(srop[0x28:0x30]), r8)
39+
self.assertEqual(u64(srop[0x30:0x38]), r9)
40+
self.assertEqual(u64(srop[0x38:0x40]), r10)
41+
self.assertEqual(u64(srop[0x40:0x48]), r11)
42+
self.assertEqual(u64(srop[0x48:0x50]), r12)
43+
self.assertEqual(u64(srop[0x50:0x58]), r13)
44+
self.assertEqual(u64(srop[0x58:0x60]), r14)
45+
self.assertEqual(u64(srop[0x60:0x68]), r15)
46+
self.assertEqual(u64(srop[0x68:0x70]), rdi)
47+
self.assertEqual(u64(srop[0x70:0x78]), rsi)
48+
self.assertEqual(u64(srop[0x78:0x80]), rbp)
49+
self.assertEqual(u64(srop[0x80:0x88]), rbx)
50+
self.assertEqual(u64(srop[0x88:0x90]), rdx)
51+
self.assertEqual(u64(srop[0x90:0x98]), rax)
52+
self.assertEqual(u64(srop[0x98:0xa0]), rcx)
53+
self.assertEqual(u64(srop[0xa0:0xa8]), rsp)
54+
self.assertEqual(u64(srop[0xa8:0xb0]), rip)
55+
self.assertEqual(u64(srop[0xb0:0xb8]), eflags)
56+
self.assertEqual(u16(srop[0xb8:0xba]), 0x33)
57+
self.assertEqual(u16(srop[0xba:0xbc]), gs)
58+
self.assertEqual(u16(srop[0xbc:0xbe]), fs)
59+
self.assertEqual(u16(srop[0xbe:0xc0]), 0)
60+
self.assertEqual(u64(srop[0xc0:0xc8]), err)
61+
self.assertEqual(u64(srop[0xc8:0xd0]), trapno)
62+
self.assertEqual(u64(srop[0xd0:0xd8]), oldmask)
63+
self.assertEqual(u64(srop[0xd8:0xe0]), cr2)
64+
self.assertEqual(u64(srop[0xe0:0xe8]), pfpstate)
65+
self.assertEqual(u64(srop[0xe8:0xf0]), 0)
66+
self.assertEqual(u64(srop[0xf0:0xf8]), mask)
67+
self.assertEqual(u64(srop[0xf8:0x100]), fpstate)

0 commit comments

Comments
 (0)
Please sign in to comment.