|
| 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