Forum | | | | | Hallo Profaner..
Hat mal jemand Lust zu testen, ob [...] unter XP generell gefixt ist?
- Einen Service zu programieren ist dafür nicht unbedingt nötig, normales Programm mit RUN AS (auch mit PrivAktivate möglich) als Admin starten und das Angreiferprogramm in einem Account mit eingeschränkten Rechten ausführen. - In das Hauptprogramm einen Timer einfügen (muß natürlich ein Fenster haben). - Im Angreiferprogramm eine Prozedur schreiben, die eine Messagebox ausgibt, die Proc aber nicht ausführen lassen. - Mit ProcAddr die Adresse der Prozedur ermitteln. - Mit PostMessage (oder vielleicht SendMessage) WM_TIMER mit der Adresse der Prozedur vom Angreiferprogramm an das Hauptprogramm senden.
Klapp das???
|
| | | | |
| | | Hey, keine Kommentare? Kein Interesse, das mal zu testen??
Ich übersetze mal: Laut des Artikels ist es möglich, mit der Message WM_TIMER ein Programm, das einen Timer benutzt und ein eigenes Fenster hat, dazu zu bewegen, eigenen Code auszuführen. Laufen diese Programme auf einem anderen Account als auf meinem (z.B. als interaktiver Service), würden diese Programme mit den Rechten dieses anderen Accounts ausgeführt werden. Man loggt sich quasi als Gast ein, sendet an das Handle des Hauptfensters eines laufenden Virenscanners oder einer Firewall eine WM_TIMER Message und kann sich dann über eine selbstgeschriebene PROC Administratorprivilegien verschaffen. Führt das nicht die gesamte Windows Sicherheit ins Absurde? |
| | | | |
| | | Habe den Artikel auch nur überflogen - aber auch so verstanden wie Du AH.
Ich schreibe grade am ACP der ODoku - ich müsste nochmal genau lesen ob hierbei auch die ProcAddr externer Progs mgl. ist - oder nur die ProcAddr eigener Procs.
Salve. |
| | | | |
| | Frank Abbing | Hi,
ich habs getestet. Zumindest unter XP Home wird nicht die Prozedure des Zielprogramms im Quellprogramm ausgeführt! Stattdessen wird das Quellprogramm immer wieder gestartet!!!
Im Anhang meine beiden Testprogramme. Zum Testen das Quellprogramm zuerst starten und laufen lassen. Dann das Zielprogramm starten. Normalerweise müsste sich jetzt - so Andreas recht hat - im Quellprogramm jede Sekunde eine Messagebox öffnen. Bei mir ist das nicht so. Bin mal gespannt, wie sich das mit anderen Windowsversionen verhält... |
| | | | |
| | | Selbes bei mir: xph,xpp!
Bestimmt irgend solch ein kumulatives Update
Vorrausgesetzt natürlich Franks Demo entspricht dem Behaupteten.
Salve, |
| | | | |
| | Frank Abbing | Hab versucht die Prozedur-Adresse über tmprc und über wTimerID (aktuelle Fassung) zu übergeben. Beides das gleiche Ergebniss... Hier die Quellcodes:
Quelle: KompilierenMarkierenSeparieren.386 ; minimum processor needed for 32 bit
.model flat, stdcall ; FLAT memory model & STDCALL calling
option casemap :none ; set code to case sensitive
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
include D:PROGRAMMEmasm32includedebug.inc
includelib D:PROGRAMMEmasm32libdebug.lib
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
.data
szDisplayName db "Quellfenster mit Timer",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
timer dd 0
testit db "Test",0
.code
start:
invoke GetModuleHandle, NULL ; provides the instance handle
mov hInstance, eax
invoke GetCommandLine ; provides the command line address
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax ; cleanup & return to operating system
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
szText szClassName,"Generic_Class"
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc ; address of WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ; instance handle
mov wc.hbrBackground, COLOR_BTNFACE+1 ; system color
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName ; window class name
invoke LoadIcon,hInst,500 ; icon ID ; resource icon
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW ; system cursor
mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc ; register the window class
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN ; get screen width in pixels
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN ; get screen height in pixels
invoke TopXY,Wht,eax
mov Wty, eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax ; copy return value into handle DWORD
invoke LoadMenu,hInst,600 ; load resource menu
invoke SetMenu,hWnd,eax ; set it to main window
invoke ShowWindow,hWnd,SW_SHOWNORMAL ; display the window
invoke UpdateWindow,hWnd ; update the display
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ; get each message
cmp eax, 0 ; exit if GetMessage()
je ExitLoop ; returns zero
invoke TranslateMessage, ADDR msg ; translate it
invoke DispatchMessage, ADDR msg ; send it to message proc
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.if uMsg == WM_COMMAND
.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"Assembler, Pure & Simple"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
.endif
.elseif uMsg == WM_TIMER
.if wParam!=111
invoke SetTimer,hWnd,111,1000,wParam
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension
return sDim
TopXY endp
; ########################################################################
end start
Ziel: KompilierenMarkierenSeparieren.386 ; minimum processor needed for 32 bit
.model flat, stdcall ; FLAT memory model & STDCALL calling
option casemap :none ; set code to case sensitive
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
include D:PROGRAMMEmasm32includedebug.inc
includelib D:PROGRAMMEmasm32libdebug.lib
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
.data
szDisplayName db "Zielfenster ohne Timer",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
timer dd 0
testit db "Test",0
fname db "Quellfenster mit Timer",0
cname db "Generic_Class",0
.code
start:
invoke GetModuleHandle, NULL ; provides the instance handle
mov hInstance, eax
invoke GetCommandLine ; provides the command line address
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax ; cleanup & return to operating system
timerproc proc
invoke MessageBox,0,addr testit,addr testit,64
ret
timerproc endp
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
szText szClassName,"Generic_Class"
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc ; address of WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ; instance handle
mov wc.hbrBackground, COLOR_BTNFACE+1 ; system color
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName ; window class name
invoke LoadIcon,hInst,500 ; icon ID ; resource icon
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW ; system cursor
mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc ; register the window class
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN ; get screen width in pixels
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN ; get screen height in pixels
invoke TopXY,Wht,eax
mov Wty, eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax ; copy return value into handle DWORD
invoke LoadMenu,hInst,600 ; load resource menu
invoke SetMenu,hWnd,eax ; set it to main window
invoke ShowWindow,hWnd,SW_SHOWNORMAL ; display the window
invoke UpdateWindow,hWnd ; update the display
invoke FindWindow,addr cname,addr fname
.if eax!=0
invoke SendMessage,eax,WM_TIMER,addr timerproc,addr timerproc
.endif
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ; get each message
cmp eax, 0 ; exit if GetMessage()
je ExitLoop ; returns zero
invoke TranslateMessage, ADDR msg ; translate it
invoke DispatchMessage, ADDR msg ; send it to message proc
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.if uMsg == WM_COMMAND
.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"Assembler, Pure & Simple"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension
return sDim
TopXY endp
; ########################################################################
end start
|
| | | | |
| | CB | XP Pro SP2: selbes Resultat wie bei Frank. |
| | | | |
| | | Ich habe die Sache mal mit einer anderen Message und innerhalb eines lokalen Prozesses getestet. Dabei wird wirklich die angegebene Adresse angesprungen.
Zum Glück geht das also doch nicht so einfach: Jeder Prozess hat ja (wenn ich es richtig verstanden habe) seine privaten Adressbereich. Eine ermittelte Adresse bezieht sich also ja immer nur auf den aktuellen Prozess. Damit der Prozess, den ich attackieren will, weiß welche Adresse er anspringen soll, wird man wohl etwas untersuchen, mappen und rechnen müssen. In dem Artikel ist ja auch von einem Debugger die Rede... |
| | | | |
| | Jörg Sellmeyer | Bei mir passiert gar nix. Win98SE / XProfan9 |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 21.05.2005 ▲ |
| |
| | | Hallo Jörg...
Kann auch nicht, Adresse paßt nicht. |
| | | | |
| | Frank Abbing | Hi,
> Kann auch nicht, Adresse paßt nicht.
Die Adresse passt schon. Habe das überprüft. Das Sourceprogramm erhält tatsächlich genau die Adresse. Nur biegt Windows beim Installieren des Timers unter XP die Adresse um auf den Startpunkt des eigenen Programms. Unter 98 wird der Timer dagegen anscheinend gar nicht gestartet. |
| | | | |
| | | Hallo Frank...
Ich vermute mal, das die Adresse , die man da bekommt, ein virtuelle Adresse ist, die immer auf den aktuellen Prozess bezogen ist. (Sehe ich das richtig? Mit deinen MASM Kenntnissen wirst du das auf jedenfall besser wissen als ich.) Ich vermute, das man zuerst einmal die reale Adrese der Prtozedur im Speicher haben muß. Danach könnte man evtl. die erhaltene Adresse auf den zu attackierenden Prozeß umrechnen, dessen reale Speicheradresse man dazu aber auch erst einmal kennen müßte. Wie siehst du das?
Ach ja..., die Message EM_SETWORDBREAKPROC soll ebenfalls dazu genutzt werden können, fremden Code anzuspringen - mit der läßt sich das evtl. besser testen. |
| | | | |
|
AntwortenThemenoptionen | 8.448 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |
|