Skip to content

Commit 1120a22

Browse files
committed
test case for the dynmaic translator buffer issue
1 parent f010219 commit 1120a22

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

tests/regress/translator_buffer.py

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/python
2+
# By Mariano Graziano
3+
4+
from unicorn import *
5+
from unicorn.x86_const import *
6+
7+
import regress, struct
8+
9+
10+
class Emulator:
11+
def __init__(self, code, stack):
12+
self.mask = 0xFFFFFFFFFFFFF000
13+
self.unicorn_code = code
14+
self.unicorn_stack = stack
15+
self.mu = Uc(UC_ARCH_X86, UC_MODE_64)
16+
size = 1 * 4096
17+
self.mu.mem_map(code & self.mask, size)
18+
size = 1 * 4096
19+
self.mu.mem_map(stack & self.mask, size)
20+
self.set_hooks()
21+
22+
def set_hooks(self):
23+
self.mu.hook_add(UC_HOOK_MEM_WRITE, self.hook_mem_access)
24+
self.mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, self.hook_mem_invalid)
25+
self.mu.hook_add(UC_HOOK_MEM_FETCH_UNMAPPED, self.hook_mem_fetch_unmapped)
26+
27+
def hook_mem_fetch_unmapped(self, uc, access, address, size, value, user_data):
28+
next_ip = self.unicorn_code + size
29+
self.mu.reg_write(UC_X86_REG_RIP, next_ip)
30+
self.mu.mem_write(next_ip, "\x90")
31+
self.mu.reg_write(UC_X86_REG_RIP, address)
32+
return True
33+
34+
def hook_mem_invalid(self, uc, access, address, size, value, user_data):
35+
return True
36+
37+
def hook_mem_access(self, uc, access, address, size, value, user_data):
38+
return True
39+
40+
def emu(self, size):
41+
ip = self.mu.reg_read(UC_X86_REG_RIP)
42+
try:
43+
self.mu.emu_start(ip, ip + size, timeout=10000, count=1)
44+
except UcError as e:
45+
print("Error %s" % e)
46+
47+
def write_data(self, address, content):
48+
self.mu.mem_write(address, content)
49+
50+
51+
class Init(regress.RegressTest):
52+
def init_unicorn(self, ip, sp, counter):
53+
print "[+] Emulating IP: %x SP: %x - Counter: %x" % (ip, sp, counter)
54+
E = Emulator(ip, sp)
55+
E.write_data(ip, "\x90")
56+
E.write_data(sp, self.generate_value(counter))
57+
E.mu.reg_write(UC_X86_REG_RSP, sp)
58+
E.mu.reg_write(UC_X86_REG_RIP, ip)
59+
E.emu(1)
60+
61+
def generate_value(self, counter):
62+
start = 0xffff880026f02000
63+
offset = counter * 8
64+
address = start + offset
65+
return struct.pack("<Q", address)
66+
67+
def runTest(self):
68+
global mu
69+
ips = list(range(0xffffffff816a9000, 0xffffffff816af000, 0x1))
70+
sps = list(range(0xffff88001b800000, 0xffff88001b801000, 0x1))
71+
j = 0
72+
for i in ips:
73+
j += 1
74+
index = ips.index(i)
75+
self.init_unicorn(i, sps[index], j)
76+
77+
if __name__ == '__main__':
78+
regress.main()

0 commit comments

Comments
 (0)