GottaFix cho WannaCrypt?


109

Cảnh báo

Các câu trả lời cho bài kiểm tra thử thách này cho một phiên bản cụ thể của bản vá giúp ngăn chặn các cuộc tấn công của WannaCrypt / WannaCry. Tùy thuộc vào hệ điều hành của bạn, bạn có thể có một bản vá khác nhau. Cách tốt nhất để bảo vệ chính bạn là đảm bảo PC của bạn được cập nhật đầy đủ và cẩn thận khi mở tệp đính kèm và liên kết web.


Giới thiệu

Tôi thích nghĩ rằng các lập trình viên vốn là những người tốt, ngay cả khi một số người không tốt , vì vậy hãy giúp mọi người đảm bảo rằng họ được bảo vệ với bản vá MS17-010 .

Thử thách

Thách thức của bạn là viết một chương trình hoặc hàm đầy đủ trả về một giá trị trung thực hoặc falsey tùy thuộc vào việc bản vá MS17-010 được cài đặt trên hệ điều hành hiện tại.

Đầu vào và đầu ra

Đầu vào: Không yêu cầu đầu vào

Đầu ra: Giá trị trung thực hoặc falsey (Cho biết được sử dụng cho từng trường hợp). Một lỗi / ngoại lệ có thể được coi là một giá trị falsey.

Quy tắc

  • Mã của bạn sẽ chạy (và xuất chính xác) trên ít nhất một hệ điều hành windows có sẵn bản vá, nhưng không phải chạy trên mọi hệ điều hành (Vui lòng nêu rõ mọi giới hạn).
  • Áp dụng sơ hở tiêu chuẩn
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

3
Hmm, một câu hỏi .. Liên quan đến các giá trị trung thực / falsey, là một lỗi được phép là giá trị falsey, và trung thực như một sự trở lại thực tế, hay điều này không được phép?
Kevin Cruijssen

3
@KevinCruijssen Tôi rất vui khi coi lỗi là một giá trị sai. Tôi nghĩ đó là một chỉ báo rõ ràng rằng bản vá không được cài đặt.
Notts90

12
Nếu người dùng bỏ lỡ bản vá này nhưng cài đặt bản vá sau, họ vẫn sẽ được bảo vệ để điều này có thể mang lại kết quả âm tính giả cho một số người dùng.
Ian Miller

2
@MichealJohnson không chắc chắn nên khuyến khích mọi người đăng mã trình bày cách khai thác lỗ hổng.
Notts90

7
Là sự lây nhiễm của máy chủ lưu trữ là một giá trị falsey hợp lệ? Nó rõ ràng sẽ có điểm trên
Nic Robertson

Câu trả lời:


158

PowerShell 2.0, 24 20 16 byte

hotfix KB4012212

-4 byte nhờ @whthing bằng cách loại bỏ -id.
-4 byte nhờ @ DankoDurbić bằng cách thay đổi get-hotfixthành hotfix.

KB4012212là bản vá cho Windows 7. Điều này có thể được thay thế bằng bất kỳ mã KB nào từ trang được liên kết của bản vá .

Sẽ trả về thông tin Nguồn , Mô tả , HotFixID , InstalledByInstalledOn khi nó được cài đặt là giá trị trung thực và sẽ báo lỗi nếu không thể tìm thấy nó dưới dạng giá trị falsey.

Dưới đây là một ví dụ về cả đầu ra trung thực và falsey (vì vậy KB4012212được cài đặt trên máy của tôi, nhưng KB4012215không phải):

nhập mô tả hình ảnh ở đây


82
câu trả lời trên PPCG có thực sự hữu ích cho mục đích thực tế không? Tôi rất ấn tượng.
John Dvorak

1
Bạn không cần chỉ định id Get-HotFix KB4012212cũng sẽ hoạt động. (Chỉ thử nghiệm với PSv4). Nhưng tôi đồng ý với Jan Dvorak, tôi không nghĩ đầu ra xác nhận thách thức.
bất cứ điều gì

6
Không hoạt động nếu bạn đã sẵn sàng tiếp theo hàng tháng hoặc sau đó, vì những cái này thay thế cho nhau.
Sumyrda

6
@ Notts90 Có, nhận xét có ý nghĩa như một gợi ý cho những người dùng thử mã và nhận được âm bản giả.
Sumyrda

10
Chỉ cần hotfix KB4012212là đủ. Trong Powershell bạn không cần phải viết get-.
Danko Durbić

43

Batch / Windows CMD, 31 29 28 23 byte

wmic qfe|find "4012212"

-1 byte nhờ @SteveFest bằng cách thay đổi findstr 4012212thành find "4012212".
-5 byte nhờ @BassdropCumberwubwubwub bằng cách xóa list.

Giải trình:

wmic          Windows Management Instrumentation Command-line
qfe           Quick Fix Engineering
|find "..."   Looks for the string in the complete output

Xuất ra một số thông tin bản vá nếu nó được cài đặt, hoặc không có gì khác.
Trong ảnh chụp màn hình bên dưới, bản vá 4012212được cài đặt, và 4012215không.

nhập mô tả hình ảnh ở đây


5
điều này sẽ gặp vấn đề khi 40 triệu cập nhật xuất hiện
John Dvorak

1
sử dụng findthay vì findstr, nó tiết kiệm 3 byte
stevefestl

2
Không hoạt động nếu bạn đã sẵn sàng tiếp theo hàng tháng hoặc sau đó, vì những cái này thay thế cho nhau.
Sumyrda

2
@Sumyrda thách thức là kiểm tra bản vá cụ thể này, nó không phải kiểm tra các bản vá thay thế.
Notts90

1
find "4012212"cũng hoạt động với -1 byte, wmic qfe|find "4012212"dường như cũng hoạt động nhưng có lẽ tôi đang thiếu một cái gì đó ở đó?
Bassdrop Cumberwubwubwub

20

Bash + Cygwin (Hoặc WSL), 21 byte

Câu trả lời này chủ yếu bị đánh cắp từ câu trả lời của Kevin . Vì vậy, ném một upvote theo cách đó cũng nếu bạn nghĩ rằng điều này xứng đáng một.

wmic qfe|grep 4012212

Cygwin có quyền truy cập vào các lệnh Windows ngoài coreutils. Chúng tôi có thể sử dụng coreutils grepthay vì Windows findvì vậy chúng tôi không cần sử dụng dấu ngoặc kép. 2 byte được lưu vì điều này.


1
Ồ, vâng, nó ngắn hơn của tôi; Tôi đã không chọn người dùng MS tốt để đánh cắp!
Aaron

2
Ai đó đã chỉnh sửa phần này để bao gồm "Hoặc WSL" mà tôi đoán là đúng nhưng trước tiên bạn phải sửa đổi đường dẫn.
Thuyền trưởng Man

17

Powershell 5.1, 245 212 207 byte

$S=New-Object -ComObject Microsoft.Update.Session;$T=$S.CreateUpdateSearcher();$H=$‌​T.GetTotalHistoryCo‌​unt();$p=0;$T.Query‌​History(0,$H)|ForEa‌​ch-Object -Process{if($_.Title -like"*KB4013429*"){$p=1;}};echo $p;

-33 byte nhờ @KevinCruijssen xóa khoảng trắng và thay thế đúng và sai bằng 1 và 0.

-5 byte nhờ @KevinCruijssen rút ngắn tên biến

Rõ ràng là sẽ không giành được bất kỳ giải thưởng nào, nhưng tập lệnh powershell này sẽ kiểm tra nhật ký lịch sử Microsoft Update cho KB4013429 (một trong những bản vá được liệt kê trên liên kết ) nó có thể được thay thế bằng bất kỳ bản vá nào. Tôi nghĩ rằng tôi sẽ đăng nó vì nó đáng tin cậy hơn một chút nếu bản vá đã được thay thế bằng bản sau.


13
Xin chào, chào mừng đến với PPCG! :) Vì câu hỏi này được gắn thẻ code-golf, ý tưởng là hoàn thành thử thách trong càng ít byte càng tốt. Tôi biết câu trả lời của bạn có thể sẽ không thắng được và bạn đã sử dụng một phương pháp hoàn chỉnh hơn tôi đã làm, nhưng bạn vẫn có thể đánh vào câu trả lời hiện tại của mình bằng cách xóa các khoảng trắng không cần thiết và sử dụng 1/ 0thay vì true/ false. Như thế này: $S=New-Object -ComObject Microsoft.Update.Session;$Se=$S.CreateUpdateSearcher();$Hc=$Se.GetTotalHistoryCount();$p=0;$Se.QueryHistory(0,$Hc)|ForEach-Object -Process{if($_.Title -like"*KB4013429*"){$p=1;}};echo $p;( 212 byte )
Kevin Cruijssen

2
Ồ, và một điều nữa bạn có thể chơi golf mà tôi chỉ nhận thấy bây giờ: Tốt nhất là luôn luôn sử dụng tên biến / phương thức / tên ký tự đơn. Vì vậy, bạn có thể thay đổi Hcthành HSethành T(hoặc một chữ cái khác bên cạnh Hhoặc Smà bạn đã sử dụng) để lưu thêm 5 byte. :)
Kevin Cruijssen

2
Bạn có thể vượt qua $H trực tiếp thay vì lưu trữ trong? Ngoài ra %{ }?{ }thay vì ForEach-Objectif. Khá chắc chắn rằng bạn chỉ có thể xuất ra đường ống chứ không phải tiếng vang vì bạn chỉ nên có một kết quả khớp và tôi nghĩ rằng điều đó sẽ được tính là sự thật dựa trên OP
Pinkfloydx33

16

C #, 178 143 141 134 byte

_=>new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='KB3150513'").Get().Count>0;

Biên dịch đến Func<int, bool>nơi mà đầu vào không được sử dụng.

Đã lưu 35 byte với sự trợ giúp của @Ryan
Đã lưu 2 byte nhờ @KevinCruijssen
Đã lưu 7 byte nhờ @ErikKarlsson

Phiên bản được định dạng:

System.Func<int, bool> f = _ =>
    new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'")
                         .Get().Count > 0;

không if(h["HotFixID"]=="KB4012212")return 1>0;return 1<0;giống như return h["HotFixID"]=="KB4012212"?
Julian Wolf

@JulianWolf Không bởi vì cái sau sẽ chỉ kiểm tra mục đầu tiên quay trở lại trong khi kiểm tra trước trên mỗi lần lặp.
TheLethalCoder

1
Bạn có thể thêm một mệnh đề where trong truy vấn ManagementObjectSearcher và thêm một mệnh đề ở countcuối câu .get()không? Như thế này : _=>{if (new System.Management.ManagementObjectSearcher("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'KB3150513'").Get().Count > 0)return 1>0;return 1<0;};. Để lưu 4 byte
Ryan

5
+1 Vì không ở trong ngôn ngữ kịch bản lệnh shell.
Hjulle

2
Erik Karlsson (người không có đủ đại diện để bình luận) đã đề xuất trong một chỉnh sửa để lưu 7 byte bằng cách thay thế SELECT HotFixIDbằng SELECT *.
Martin Ender

14

Cygwin, 31 byte

Chỉ để chơi nổi loạn

grep KB4012212 "$WINDIR"/*e.log

mã trả về sẽ là 0 nếu bản vá đã được áp dụng hoặc 1 nếu không có.

Đã thử nghiệm trong Windows 7 với Cygwin 2.6.0


Điều này sẽ làm việc nếu bạn loại bỏ KB?
TheLethalCoder

@TheLethalCoder Tôi không chắc, và tôi không nghĩ mình có thể tìm ra. Câu trả lời của tôi bắt nguồn từ ryan và cả hai chúng tôi đều tìm kiếm văn bản trong WindowsUpdate.log khổng lồ chứa nhiều hơn tên KB, tôi không cá là số không thể xuất hiện trong một bối cảnh khác
Aaron

Đủ công bằng Tôi không biết đủ về những gì bạn đang làm do đó câu hỏi không phải là một gợi ý :)
TheLethalCoder

3
Điều này sẽ hoạt động nếu bạn loại bỏ KBvì nó dường như không 4012212có trong bất cứ thứ gì ngoại trừ đường dẫn. Bạn cũng có thể lưu 1 byte nếu bạn chỉ xóa K vì bạn sẽ không tìm thấy B4012212ngẫu nhiên nếu không có đường dẫn.
Còi báo

4
@Sirens Tôi không tự tin về việc chỉ kiểm tra số, tôi sẽ sợ khớp 1) số byte được chuyển, 2) cập nhật, báo cáo sự kiện và công việc UID hoặc 3) mã hex (và các mã khác). Chỉ xóa cái Kđầu tiên có vẻ hợp lý, nhưng sau đó B...trở thành đại diện hex hợp lệ, có thể tạo xung đột với UID và mã hex
Aaron

12

PowerShell v4, 64 byte

HotFix|? HotFixID -m "401(221[2-7])|(2598)|(2606)|(3198)|(3429)"

Kiểm tra tất cả các giới thiệu KB bằng RegEx (hiện bạn có hai vấn đề)


3
Chào mừng đến với trang web! Câu trả lời đầu tiên tốt đẹp!
lập trình

7

Batch / Command Prompt, 27 25 byte

systeminfo|find "4012212"

Nếu KB4012212 được tìm thấy đầu ra đó, nếu không, không có gì được xuất ra.

Cảm ơn @Kevin vì đã lưu 2 byte :)


1
Tôi nghĩ bạn có thể loại bỏ khoảng trắng xung quanh đường ống: systeminfo|find "4012212"cho -2 byte.
Kevin Cruijssen

5

Powershell 2.0, 142 byte

  • Trả về 0 cho "false", không được vá "<0 cho" true ", đã được vá.

Bên dưới chứa tất cả KB từ tháng 3, nhưng nhu cầu được mở rộng với tháng 4, tháng 5 KB vì mỗi lần thay thế tất cả trước đó.

(Get-HotFix | where HotFixID -match "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count

Tôi không chắc chắn, nhưng tôi nghĩ bạn có thể thay đổi (Get-HotFix | wherethành (HotFix|where(khoảng trắng bị xóa và Get-bị xóa.
Kevin Cruijssen

3

Powershell 5.1 134 byte

Giống như Mark Pippin nhưng đã thay đổi Get-Hotfix thành Hotfix và ở đâu? tiết kiệm 8 byte

(HotFix | ? HotFixID -match 
 "4012598","4012216","4012213","4012217","4012214","4012215","4012212","4013429","4012606","4013198").Count

Tôi không thể lấy số byte thấp hơn câu trả lời của Kevin


1
Bạn có thể xóa các khoảng trắng xung quanh đường ống: (HotFix|? HotFixID ...cho -2 byte.
Kevin Cruijssen

2

DISM , 40 byte

dism/online /get-packages|find "4012212"

Giải trình:

dism             Deployment Image Servicing and Management command-line
/online          Look at current running PC's Operating System
/get-packages    Display some basic information about all packages in the image
|find "..."      Looks for the string in the complete output

Xuất ra danh tính gói nếu nó được cài đặt, hoặc không có gì khác.
Trong ảnh chụp màn hình bên dưới, bản vá 4012212được cài đặt, và 4012215không.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.