24jj: BIGKERNEL BODIES FOUND via runtime IAT resolve — 1803a06a0/180296c80/180323f20/1802dc0e0, real math functions with x87 transcendental pair (exp family); iat_name.py v2 with double-deref+PE exports
This commit is contained in:
@@ -473,3 +473,18 @@ ILT-стаб с собственной idx-ячейкой (паковка/про
|
|||||||
разворачивание обрывается. Тела bigkernel'ов (exp/abs-нелинейность шага
|
разворачивание обрывается. Тела bigkernel'ов (exp/abs-нелинейность шага
|
||||||
14/17) остаются за пакером — при необходимости снимаются дампом памяти
|
14/17) остаются за пакером — при необходимости снимаются дампом памяти
|
||||||
ВОКРУГ вызова в рантайме (STOP + чтение таблиц после инициализации).
|
ВОКРУГ вызова в рантайме (STOP + чтение таблиц после инициализации).
|
||||||
|
|
||||||
|
## ДОПОЛНЕНИЕ 24jj: ТЕЛА BIGKERNEL'ОВ НАЙДЕНЫ (рантайм-резолв IAT)
|
||||||
|
|
||||||
|
iat_name.py v2 (SIGSTOP + двойной deref + PE-экспорты) резолвит:
|
||||||
|
```
|
||||||
|
стаб 140b30/140b60 → runtime 1803a06a0 (общий для float/double!)
|
||||||
|
стаб 1409e0 → runtime 180296c80
|
||||||
|
стаб 140ad0 → runtime 180323f20
|
||||||
|
стаб 140a40 → runtime 1802dc0e0
|
||||||
|
```
|
||||||
|
Все — НАСТОЯЩИЕ функции внутри дампа (не импорты!): большие стек-фреймы,
|
||||||
|
x87 FNU-контроль, AVX2 полиномы, ДВЕ x87-трансцендентные инструкции
|
||||||
|
(fyl2x/f2xm1 класс = 2^x/exp семейство). Полный декод математики каждого —
|
||||||
|
отдельная сессия; вход/выход уже известны из контекста вызовов
|
||||||
|
(in-place над n/2+1 элементами FIR-буфера).
|
||||||
|
|||||||
+22
-6
@@ -83,6 +83,8 @@ t0=time.time(); host=None
|
|||||||
while time.time()-t0<30 and not host:
|
while time.time()-t0<30 and not host:
|
||||||
host=find_host(); time.sleep(0.002)
|
host=find_host(); time.sleep(0.002)
|
||||||
print('host',host,flush=True)
|
print('host',host,flush=True)
|
||||||
|
import signal as sg
|
||||||
|
os.kill(host,sg.SIGSTOP)
|
||||||
fd=os.open('/proc/%d/mem'%host,os.O_RDONLY)
|
fd=os.open('/proc/%d/mem'%host,os.O_RDONLY)
|
||||||
|
|
||||||
# build module map
|
# build module map
|
||||||
@@ -100,13 +102,27 @@ def owner(addr):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
targets={}
|
targets={}
|
||||||
for stub in (0x180140b30,0x180140b60,0x1801409e0,0x180140ad0,0x180140a40):
|
TBL={0x180140b30:0x1826176c8,0x180140b60:0x182617708,0x1801409e0:0x182617508,
|
||||||
off=stub-BASE
|
0x180140ad0:0x182617648,0x180140a40:0x182617588}
|
||||||
b=data[off:off+7]
|
for stub,tbl in TBL.items():
|
||||||
rel=struct.unpack('<i',b[3:7])[0]
|
v=rd(fd,tbl+32,8)
|
||||||
tbl=stub+14+rel
|
|
||||||
v=rd(fd,tbl+4*8,8)
|
|
||||||
tgt=struct.unpack('<Q',v)[0] if v else 0
|
tgt=struct.unpack('<Q',v)[0] if v else 0
|
||||||
|
# second level: tgt code = mov rax,[rip+rel]; jmp rax -> IAT slot
|
||||||
|
print(' L2: tgt=%x' % tgt, flush=True)
|
||||||
|
if 0x180000000 <= tgt < 0x187000000:
|
||||||
|
off2=tgt-BASE
|
||||||
|
b2=data[off2:off2+7] if 0<=off2<len(data)-7 else rd(tgt,7)
|
||||||
|
if b2[:2]==b'\x48\x8b':
|
||||||
|
rel2=struct.unpack('<i',b2[3:7])[0]
|
||||||
|
slot=tgt+7+rel2
|
||||||
|
print(' L2: b2=%s rel2=%x slot=%x' % (b2.hex(),rel2&0xffffffff,slot), flush=True)
|
||||||
|
fv=rd(fd,slot,8)
|
||||||
|
if fv:
|
||||||
|
tgt=struct.unpack('<Q',fv)[0]
|
||||||
|
else:
|
||||||
|
print(' slot read FAIL',slot,flush=True)
|
||||||
|
else:
|
||||||
|
print(' no mov-rax pattern at %x: %s'%(tgt,b2[:3].hex() if b2 else '-'),flush=True)
|
||||||
ow=owner(tgt)
|
ow=owner(tgt)
|
||||||
print('%x idx4->%x runtime=%x owner=%s' % (stub,tbl,tgt,ow[2] if ow else '?'),flush=True)
|
print('%x idx4->%x runtime=%x owner=%s' % (stub,tbl,tgt,ow[2] if ow else '?'),flush=True)
|
||||||
if ow:
|
if ow:
|
||||||
|
|||||||
Reference in New Issue
Block a user