En faite le probleme de ta technique c que si tu mappes une page writeable a cet endroit, tu va rendre le système vulnérable à toutes les attaques userland.
Voici comment NtWriteVirtualMemory check un pointeur :
Dump de NtWriteVirtualMemory():
and [ebp+ms_exc.disabled], 0
mov eax, _MmUserProbeAddress
cmp ebx, eax
jnb loc_5257A0
loc_505FD0:
mov eax, [ebx]
[..]
loc_5257A0: ; le mauvais cas ou l’adresse pointe dans le kernel space
mov dword ptr [eax], 0
jmp loc_505FD0
kd> dd nt!MmUserProbeAddress L 1
80557bb4 7fff0000
Quand on regardes ca, on comprend d’abord pas vraiment pourquoi dans le mauvais cas il essaie d’ecrire 0 a MmUserProbeAddress et continue …
C’est tout simplement pour lever une exception catch plus loin (pour return un status d’access denied).
Alors si la page en question est writeable, l’exception n’est pas leve et on peut ecrire en ring0 … on imagine la suite facilement ;).
Donc okay mais attention, pas writeable.
2.
texane | novembre 12th, 2007 at 17:17
Salut,
Pour shadow Walker, la technique me plaisait pas mal aussi (apres avoir lu le dernier MISC d ailleurs) et j avais commence a coder un truc (ca marchouille pas top, mais au moins y a une base): https://blog.kaneton.org/bin/view/Blog/Articles
Plus precisement la technique de shadow walker consiste a desynchro les tlbs en fonction de l operation d acces a la memoire. Ca tue bien mais y a quand mm qques soucis.
Aussi pour le coup d ajouter un mapping a la main, fais gaf aux PDEs qui contiennent des entrees mappant directement 4Mo(donc pas de PTE, les larges pages), sinon tu vas canner le systeme.
Ah non pas de cross-post, son système de commentaires est cassé
—————————–
Asirra validation failed!
ticket =
start ASIRRAVALIDATION ir=
cd ir data=
cd ir data=
start RESULT ir=1
cd ir 1 data=Fail
end Resource id #55
cd ir 0 data=
cd ir 0 data=
start DEBUG ir=
cd ir data=exceptions.Exception: invalid ticket format
end Resource id #55
cd ir 0 data=
end Resource id #55
XML:
Fail
exceptions.Exception: invalid ticket format
—————————–
5.
admin | novembre 12th, 2007 at 21:57
@newsoft
Vi je connaissais, j’ai le code sur mon ordi.
@texane
J’ai regardé ton code aussi, on sent une certaine touche « linuxienne ». Je le garde, merci :]
@mxatone
Bien vu ! J’avais complétement oublié que cette page servir à généré une exception. Je voudrais juste préciser que cecelle-ci est levée uniquement si l’argument optionnel du pointeur NumberOfBytesWritten est présent. Dans ce cas il y un check :
PAGE:004AF9E4 8B 5D 18 mov ebx, [ebp+ReturnLength]
PAGE:004AF9E7 85 DB test ebx, ebx ; si ebx!=0 on saute, si =0 argument non présent, ptr NULL
PAGE:004AF9E9 0F 85 D0 65 05 00 jnz loc_505FBF
PAGE:00505FBF loc_505FBF: ; CODE XREF: NtWriteVirtualMemory(x,x,x,x,x)+5Ej
PAGE:00505FBF 83 65 FC 00 and [ebp+ms_exc.disabled], 0
PAGE:00505FC3 A1 B4 FE 48 00 mov eax, _MmUserProbeAddress
PAGE:00505FC8 3B D8 cmp ebx, eax
PAGE:00505FCA 0F 83 D0 F7 01 00 jnb loc_5257A0 ; si ebx > eax on jmp
PAGE:005257A0 loc_5257A0: ; CODE XREF: NtWriteVirtualMemory(x,x,x,x,x)+5663Fj
PAGE:005257A0 C7 00 00 00 00 00 mov dword ptr [eax], 0 ; !! EXCEPT !! gérée par un try{}except
PAGE:005257A6 E9 25 08 FE FF jmp loc_505FD0
Je pense qu’il est possible de desactiver/reactiver les protection mémoire avec VirtualProtect pour écrire rapidement dans la page (code dans une critical section) et remettre la proctection en écriture après.
6.
texane | novembre 12th, 2007 at 22:28
je dirais plutot linuxien, te fie pas au pseudo
7.
b0l0k | novembre 16th, 2007 at 22:59
Yo ivan,
Toujours des idées venu d’ailleurs toi, tu mange du pain perdu avec tes chocapicz pour penser a la page perdu ? =>[]
Serieusement, encore un article clair et fun. Pour shadow walker, ce qui a été dommage c’est que la technique n’a pas eu grand succes non plus.
Bon je viendrai sur IRC quand la vue d’un ordinateur ne me donnera plus des nausées
Continue comme ca
@newsoft: ah le serveur microsoft devait pas etre en forme ( c’est rare ca ! ) quand t’as essayé de post un comment. Enfin :< toute facon c’est a l’abandon !
Je n’ai en effet rien vu qui puisse se prendre au second degré
:-/
Fin bon , j’arrete de polluer le blog d’Ivanov
12.
lethys | novembre 21st, 2007 at 17:54
/me déprime alors vient pourrir tes commentaires ! Je pensais trouver un pti ea games mais pour ça je suppose qu’il faudrait voir les fichiers cachés du repository …
[...] Pour comprendre comment fonctionne la protection en non-execute des pages, il faut d’abord savoir comment fonctionne la translation d’adresses virtuelles en adresses physiques, pour cela je vous invite à relire ce post. [...]
[...] avons une nouvelle table : classiquement nous avions sans PAE une page directory, une page table (PDE/PTE rappelez vous) et nous pouvions pointé l’octet en mémoire physique ; maintenant nous avons une page [...]
14 Comments
1. mxatone | novembre 12th, 2007 at 15:40
En faite le probleme de ta technique c que si tu mappes une page writeable a cet endroit, tu va rendre le système vulnérable à toutes les attaques userland.
Voici comment NtWriteVirtualMemory check un pointeur :
Dump de NtWriteVirtualMemory():
and [ebp+ms_exc.disabled], 0
mov eax, _MmUserProbeAddress
cmp ebx, eax
jnb loc_5257A0
loc_505FD0:
mov eax, [ebx]
[..]
loc_5257A0: ; le mauvais cas ou l’adresse pointe dans le kernel space
mov dword ptr [eax], 0
jmp loc_505FD0
kd> dd nt!MmUserProbeAddress L 1
80557bb4 7fff0000
Quand on regardes ca, on comprend d’abord pas vraiment pourquoi dans le mauvais cas il essaie d’ecrire 0 a MmUserProbeAddress et continue …
C’est tout simplement pour lever une exception catch plus loin (pour return un status d’access denied).
Alors si la page en question est writeable, l’exception n’est pas leve et on peut ecrire en ring0 … on imagine la suite facilement ;).
Donc okay mais attention, pas writeable.
2. texane | novembre 12th, 2007 at 17:17
Salut,
Pour shadow Walker, la technique me plaisait pas mal aussi (apres avoir lu le dernier MISC d ailleurs) et j avais commence a coder un truc (ca marchouille pas top, mais au moins y a une base): https://blog.kaneton.org/bin/view/Blog/Articles
Plus precisement la technique de shadow walker consiste a desynchro les tlbs en fonction de l operation d acces a la memoire. Ca tue bien mais y a quand mm qques soucis.
Aussi pour le coup d ajouter un mapping a la main, fais gaf aux PDEs qui contiennent des entrees mappant directement 4Mo(donc pas de PTE, les larges pages), sinon tu vas canner le systeme.
3. newsoft | novembre 12th, 2007 at 21:08
Il y a aussi un vieux PoC appelé CRCVert :
http://www.vinay-mahadik.info/ReverseEngineering/crcVert/
Je cross-poste chez b0l0k
4. newsoft | novembre 12th, 2007 at 21:10
Ah non pas de cross-post, son système de commentaires est cassé
—————————–
Asirra validation failed!
ticket =
start ASIRRAVALIDATION ir=
cd ir data=
cd ir data=
start RESULT ir=1
cd ir 1 data=Fail
end Resource id #55
cd ir 0 data=
cd ir 0 data=
start DEBUG ir=
cd ir data=exceptions.Exception: invalid ticket format
end Resource id #55
cd ir 0 data=
end Resource id #55
XML:
Fail
exceptions.Exception: invalid ticket format
—————————–
5. admin | novembre 12th, 2007 at 21:57
@newsoft
Vi je connaissais, j’ai le code sur mon ordi.
@texane
J’ai regardé ton code aussi, on sent une certaine touche « linuxienne ». Je le garde, merci :]
@mxatone
Bien vu ! J’avais complétement oublié que cette page servir à généré une exception. Je voudrais juste préciser que cecelle-ci est levée uniquement si l’argument optionnel du pointeur NumberOfBytesWritten est présent. Dans ce cas il y un check :
Je pense qu’il est possible de desactiver/reactiver les protection mémoire avec VirtualProtect pour écrire rapidement dans la page (code dans une critical section) et remettre la proctection en écriture après.
6. texane | novembre 12th, 2007 at 22:28
je dirais plutot linuxien, te fie pas au pseudo
7. b0l0k | novembre 16th, 2007 at 22:59
Yo ivan,
Toujours des idées venu d’ailleurs toi, tu mange du pain perdu avec tes chocapicz pour penser a la page perdu ? =>[]
Serieusement, encore un article clair et fun. Pour shadow walker, ce qui a été dommage c’est que la technique n’a pas eu grand succes non plus.
Bon je viendrai sur IRC quand la vue d’un ordinateur ne me donnera plus des nausées
Continue comme ca
@newsoft: ah le serveur microsoft devait pas etre en forme ( c’est rare ca ! ) quand t’as essayé de post un comment. Enfin :< toute facon c’est a l’abandon !
@ la prochaine !
8. Babewn | novembre 17th, 2007 at 18:00
@ texane :
« je dirais plutot linuxien, te fie pas au pseudo »
le « ne » n’a rien a voir avec ton genre (ni meme ton nombre )
UNE touche , donc linuxienNE
un genre linuxien , une touche linuxienne
la faute aurait ete d’ecrire une touche linuxien …
@Ivanlef0u :
Bien bien mon petit.
(j’comprend rien mais ca fait leet de te feliciter avec une petite tape bienveillante dans le dos :p )
9. texane | novembre 17th, 2007 at 22:11
@Babewn: oula, on ne t a pas nourri au second degre toi… en meme temps c’est sur qu on n’est pas sur le blog de Pivot
10. Taron | novembre 17th, 2007 at 23:12
sale Gauss ?
11. Babewn | novembre 18th, 2007 at 20:58
Je n’ai en effet rien vu qui puisse se prendre au second degré
:-/
Fin bon , j’arrete de polluer le blog d’Ivanov
12. lethys | novembre 21st, 2007 at 17:54
/me déprime alors vient pourrir tes commentaires ! Je pensais trouver un pti ea games mais pour ça je suppose qu’il faudrait voir les fichiers cachés du repository …
13. Ivanlef0u’s Blog &r&hellip | février 4th, 2008 at 00:30
[...] Pour comprendre comment fonctionne la protection en non-execute des pages, il faut d’abord savoir comment fonctionne la translation d’adresses virtuelles en adresses physiques, pour cela je vous invite à relire ce post. [...]
14. Volatility : Extraction o&hellip | mai 10th, 2010 at 09:47
[...] avons une nouvelle table : classiquement nous avions sans PAE une page directory, une page table (PDE/PTE rappelez vous) et nous pouvions pointé l’octet en mémoire physique ; maintenant nous avons une page [...]
Trackback this post