1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import struct, sys
VA = int(sys.argv[1], 16)
N = int(sys.argv[2], 16) if len(sys.argv) > 2 else 0x800
f = open("/proc/kcore","rb")
hdr = f.read(64)
e_phoff = struct.unpack_from("<Q", hdr, 0x20)[0]
e_phentsize = struct.unpack_from("<H", hdr, 0x36)[0]
e_phnum = struct.unpack_from("<H", hdr, 0x38)[0]
segs = []
for i in range(e_phnum):
f.seek(e_phoff + i*e_phentsize)
ph = f.read(e_phentsize)
p_type, p_flags, p_offset, p_vaddr, p_paddr, p_filesz, p_memsz = struct.unpack_from("<IIQQQQQ", ph, 0)
if p_type == 1:
segs.append((p_vaddr, p_memsz, p_offset))
for v, sz, off in segs:
if v <= VA < v+sz:
f.seek(off + (VA - v))
d = f.read(min(N, v+sz-VA))
sys.stdout.write(d.hex())
break
|