WMF 익스플로잇 검사 도구

Tags:

간단한 WMF exploit 검사 도구입니다.

아래의 소스 파일을 저장한다음에 윈도우의 경우엔

ruby 파일명.rb [wmf파일명] 

과 같이 하시면 되고, 리눅스라면

./파일명.rb [wmf파일명]

로 하면 됩니다. 제가 루비 초보라서 코드 작성은 이정도가 한계인 듯….
이 프로그램으로 검사해서 안전했다고 안전하다고 보장은 못합니다.
제가 아는 룰 한개만 넣었으니.

#!/usr/bin/ruby
# Simple WMF Exploit Detection

file_type = {
0 => “Memory”,
1 => “Disk”,
2 => “fjear”
}

if ARGV.length != 1
puts “USAGE: wmf_detect [file_to_detect]”
Kernel.exit
end

f = File.new(ARGV[0], “rb”)

print “File type: #{file_type[f.read(2).unpack(“v”)[0]]}\n”
print “Header size(9): ”

unless f.read(2).unpack(“v”)[0] == 9
print “Header size doesn’t match. Something went wrong!\n”
Kernel.exit
else
print “Confirmed\n”
end

print “Window Version Used: #{f.read(2).unpack(“v”)[0] == 0x0300 ? “Windows 3.0 or later” : “Unknown”}\n”
print “File Size: #{f.read(4).unpack(“V”)[0] * 2} bytes\n”
print “# of objects: #{num_records = f.read(2).unpack(“v”)[0]}\n”
print “Size of the largest record: #{f.read(4).unpack(“V”)[0]}\n”
print “Zero padding: ”

unless f.read(2).unpack(“v”)[0] == 0
print “Not a zero padding. Something went wrong!\n”
Kernel.exit
else
print “Confirmed\n”
end

puts “\nHere comes the #{num_records} records…\n\n”

infected = false

for i in 1..num_records
record_size = f.read(4).unpack(“V”)[0]
function_no = f.read(2).unpack(“v”)[0]

unless record_size – 4 ==0
f.read((record_size – 3) * 2) unless record_size – 3 < = 0 else param = f.read(2).unpack("v")[0] if function_no & 0x0026 == 0x0026 && param == 0x09 puts "INFECTED WMF!!!!!!" puts "-" * 50 puts "Record Size: #{record_size} bytes" puts "Function No: 0x#{function_no.to_s(16)}" puts "Param[0]: 0x#{param.to_s(16)}" puts "-" * 50 infected = true break else f.read((record_size - 4) * 2) unless record_size - 4 <= 0 end end end unless infected puts "This is a safe file" end puts "\nScanning done." f.close [/code]

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *