레이블이 hack인 게시물을 표시합니다. 모든 게시물 표시
레이블이 hack인 게시물을 표시합니다. 모든 게시물 표시

[컴] UFS vs eMMC

내장 메모리 스펙  / 플래시 메모리 스펙 / spec / specification

UFS vs eMMC

UFS(Universal Flash Storage) vs eMMC(embedded Multi-Media Card)

일단 UFC 나 MMC 나 전부 스마트폰등 모바일 기기에 들어가는(내장) 메모리에 사용하는 표준이다.

그래서 대체로 스마트폰에 쓰이지만 어디서나 이 표준을 구현해서 사용할 수는 있다.

여하튼 아래 도표를 보면 알 수 있듯이 이 표준을 속도별로 구분하면 eMMC 다음 버전이 UFC 가 되는 것이다. 물론 이것은 eMMC 표준이 더이상 발전을 안한다는 가정이 있다.
  • eMMC --> UFS 



출처 : ref. 1

eMMC

eMMC는 패키지이다. '컨트롤러'와 '낸드플래시 메모리' 를 함께 가지고 있다.
  • 컨트롤러
  • 낸드플래시 메모리


삼성전자는 2015년 2월 128GB UFS(Universal Flash Storage) 내장 메모리를 양산

UFS 2.0 interface

  • 국제 반도체 표준화 기구 ‘제덱(JEDEC)’의 최신 내장 메모리 규격
  • 커맨드 큐 : SSD에서 사용 중인 속도 가속 기능 ‘커맨드 큐(Command Queue)’가 적용
    커맨드 큐는 여러 개의 명령어를 동시에 처리할 수 있고 그에 따라 작업 순서도 변경할 수 있다.
    eMMC 5.1 에도 command queue 가 적용됐다.
  • LVDS(Low-Voltage Differential Signaling) 직렬 인터페이스 : 이로 인해 full duplex 양방향 통신이 가능하다.
    half duplex 는 무전기 같은 방식(한명이 이야기할 때 한명은 들어야 하고), full duplex 는 전화기 같은 방식으로 보면된다.(동시에 이야기하는)

See Also


  1. 소소한 일상의 공간 v2.0 :: eMMC의 발전과 UFS의 탄생

References

  1. 모바일 기기용 낸드플래시 메모리의 진화, eMMC부터 UFS까지 , 삼성 뉴스룸

[컴][웹] 개인정보보호 자율점검 가이드라인

웹 보안 / 사이트 보안 / 정보보안 / 시큐러티 / security / 해킹방지 / 해커

개인정보보호 자율점검 가이드라인

그저 참고 자료로 올려놓는다.




개인정보 파기



② 정보통신서비스 제공자등은 정보통신서비스를 1년의 기간 동안 이용하지 아니하는 이용자의 개인정보를 보호하기 위하여 대통령령으로 정하는 바에 따라 개인정보의 파기 등 필요한 조치를 취하여야 한다. 다만, 그 기간에 대하여 다른 법령 또는 이용자의 요청에 따라 달리 정한 경우에는 그에 따른다.

[컴] Spectre



Microarchitectural Side-Channel Attacks

이 구성요소들은 미래의 프로그램의 행동 예측을 통해 프로세서의 성능을 향상시킨다.
행동예측을 위해서 그 구성요소들은 과거 프로그램 동작과 관련된 state 를 유지한다. 그리고 미래 행동이 과거의 행동이랑 연관이 있거나 비슷할 것이라고 가정한다.

여러개의 프로그램들이 같은 하드웨어에서 동작할 때 (동시에 또는 time sharing 을 통해 ) 어느 한 프로그램에 의해 이뤄진 microarchitectural state 의 변화는 다른 프로그램에 영향을 준다. 결과적으로 이것이 한 프로그램에서 다른 프로그램으로의 의도치 않은 정보의 유출을 일으킬 수 있다.

과거의 작업들은 BTB, branch history, caches 을 통한 정보유출을 보여줬다. 여기서 우리는 Flush+Reload 와 그것의 변형인 Evict+Reload 를 사용해서 민감한 정보를 유출할 것이다.

이 기술들을 이용해서 공격자는 cache 에서 희생자(victim)가 공유한 cache line 을 추출할 수 있다.

희생자가 잠시 프로그램을 수행한 후에 공격자는 추출된 cache line(evicted cache line) 에 해당하는 주소에서 메모리를 읽는데 얼마나 시간이 걸리는지 측정하게 된다.

만약 victim 이, 모니터되고 있는 cache line 에 접근하면, 그 데이터는 cache 에 있게 되고, 접근은 빨라진다. 그렇지 않고, 만약 victim 이 그 line 에 접근하지 않았다면, read는 느리게 된다. 그렇기 때문에 access time 을 측정하는 것으로, 공격자는 victim 이 추출(eviction step)과 조사(probing step) 과정사이에서 monitored cache line 에 접근했는지 여부를 알 수 있다.

2개의 기술사이의 중요한 차이점은 cache 에서 monitored cache line 을 추출(evicting ) 할 때 사용되는 방법(mechanism) 이다.

Flush+Reload 기술에서는 공격자는 line 을 추출하기 위해 x86의 clflush 같은 기계어처럼 원래 그런 목적으로 만들어진 instruction을 사용한다.(dedicated machine instruction)

Evict+Reload 에서는 추출(eviction) 이 cache line 을 저장하고 있는 cache set 에서의 경합(contetion)을 만들어서 추출하게 된다. 즉, 다른 memory location 들을 접근해서 이 정보가 cache 로 들어오고 이전에 추출한 line 을 버리도록 만든다.



작성중...


See Also


References

  1. Meltdown and Spectre

[컴] Meltdown







요즘 CPU의 심각한 보안 구멍(security hole) 이 있다고 여기저기서 난리다. 그래서 내용을 좀 파보기로 했다.

일단 이 문제에 대해 자세한 설명을 해주는 page 는 아래와 같다.

크게 2개의 bug 가 보고 되었는데, meltdown 과 spectre 라 불린다.
  1. Meltdown
  2. Spectre
여기서는 Meltdown 리포트에 있는 글 가운데 몇개의 내용을 번역하고, 정리해봤다.


Meltdown

Out-of-order execution

Out-of-order execution 은 최적화 기술의 하나이다. 이 기술은 CPU core 의 모든 실행 단위(execution units) 에 대한 사용을 최대화 하기 위한 기술이다.(즉, execution unit 이 놀지않고 쉬지않고 일하도록 한단 이야기다.)

CPU 가 instruction들을 "순차적인 프로그램 순서(sequential program order)"로만 처리하는 것 대신에, 모든 필요한 resource(자원)가 갖춰지자마자 실행하게 된다. 순서를 벗어나서 실행을 하기 때문에 이름이 out-of-order execution 이다.

이러면 현재 동작에 의해 execution unit이 점유되어 있는 동안에도, 다른 execution unit 들은 다른 것들을 실행할 수 있다. 그래서 instruction들은 그들의 결과가 architectural definition을 따르는 만큼 병렬로 실행될 수 있다.

좀 더 쉽게 이야기하면, 원래 프로그램은 프로그램 내에서도 분리될 수 있는 부분이 있다. 예를 들면, 아래와 같은 코드가 있다면,
(1) c = a+b
(2) f = d+e
(3) h = c+f
(1) 과 (2) 는 아무런 연관성이 없기 때문에 병렬로 진행해도 된다. 만약 이것을 sequential program order 로 수행한다면, (1) 이후에 (2)가 진행되고, 그 후에 (3)이 진행될 것이다.

실제로,  out-of-order  execution을 지원하는 CPU 들은 추측해서 operation 을 수행하는 기능을 제공한다. 이 기능은 CPU가 instruction 이 필요해지고 commit되는 것인지 아닌지 대해 확실해 지기 전(즉, 결과를 확정짓기전에), 프로세서의 out-of-order logic 이 instruction들을 처리할 때까지는 수행된다.
In  practice,  CPUs  supporting  out-of-order  execution support  running  operations
speculatively to  the  extent that the processor’s out-of-order logic processes instruc-
tions before the CPU is certain whether the instruction will be needed and committed.

모든 이전의 instruction 들의 결과를 commit 하기전에 프로세서가 operation 을 수행하는 것을 여기서는 out-of-order execution 이라고 하자.


branch prediction units

branch prediction unit 들은 어떤 instruction 이 다음에 수행될 지에 대한 학습된 추측(educated guess) 을 얻게 된다. Branch predictor 들은 조건이 실제로 정해지기전에 어떤 branch 의 방향으로 갈 것인지를 정하기 위해 노력한다.

그래서 정해진 branch 에 있는 dependency 가 없는 instruction 들은 미리 수행되고, 만약 예측이 맞는다면 그대로 그 결과를 사용하게 된다.
만약 예측이 틀리면, reorder buffer 를 clearing 하고 unified reservation station 을 다시 초기화를 한다.

branch prediction 종류

  • static branch prediction
  • Dynamic branch prediction
  • One-level branch prediction 
  • neural branch prediction


주소 공간 Address Spaces


translation table

각 프로세스들을 독립적으로 하기위해서 CPU들은 가상메모리 공간(virtual address spaces)을 제공한다. virtual address 들은 물리적인 memory 주소로 번역(translate)된다.

virtual address spaces 들은 page 들의 집합(set)들로 나눠진다. "multi-level page translation table"을 통해서 이 page set들은 은 물리적인 메모리에 mapping 된다.

translation table 들은 가상주소에서 물리적주소로의 mapping 을 정의한다. 또한 readable, writeable, executable, user-accessible 같은 권한 체크(privilege check)를 수행할 때 사용되는 protection property 들을 정의한다.
  • virtual address --> physical address
  • protection property
특별한 CPU register 에 최근에 사용된 translation table 이 저장되어 있다. process 마다 virtual address space 를 구현하기 위해서 context switch 마다 OS 는 next process의 translation table address리 이 register 로 가져온다.

이 덕에 각 process는 그들의 virtual address space 에 속해있는 data 에만 접근할 수 있다. 이것은 해당하는 translation table들의 user-accessible property 를 disable 하는 방법을 통해서 OS 에 의해 수행된다.


kernel address space

kernel address space 는 kernel 의 사용만을 위한 memory mapped 만을 가지고 있는 것이 아니라 user page 들에 대한 operation 들을 수행한다. 즉, data 를 그곳에 write 할 수 있다. 결과적으로, 모든 물리적 memory 는 일반적으로 kernel 에 mapped 된다.

리눅스OS X 에서 이것은 direct-physical map을 통해서 이뤄진다. 즉, 모든 물리적인 메모리는 직접적으로 이미 정의된 virtual address 에 mapped 된다.

윈도우에서는 direct-physical map 대신에 paged pools, non-paged pools, system cache 라고 불리는 것들을 이용한다. 이 pool 들은 kernel memory space 에 있는 virtual memory 영역들이다. 이 virtual memory 영역들은 물리적인 페이지들을 virtual address 들에 mapping 해준다. virtual address 들은 memory 에 남거나 (non-paged pool) 또는 copy 가 이미 disk 에 저장됐기 때문에 memory 에서 지워질 수 있다.(paged pool) system cache 는 모든 file-backed page들의 mapping들을 포함한다. 이 memory pool들은 일반적으로 물리적 메모리의 많은 부분(large fraction) 을 모든 process의 kernel address space로 map 한다.


ASLR

memroy corruption 버그들은 종종 특정 data 의 주소들의 지식을 요구한다. memory corruption bug 들을 이용한 공격들을 지연시키기 위해서 non-executable stacks 와 stack canaries 가 와 함께 address space layout randomization(ASLR) 이 소개됐다.

  • non-executable stacks
  • stack canaries
  • address space layout randomization(ASLR)

kernel 을 보호하기 위해 KASLR 은 모든 boot 에서 드라이버가 위치하는 곳에 대한 offset들을 randomize 한다. kernel data 구조의 위치를 추측하게 만들기 때문에 결과적으로 공격을 하기 어렵게 한다.

side-channel attack

그러나 side-channel attack 들은 kernel data 구조들의 특정 위치를 알 수 있게 해주거나 자바스크립트에서 ASLR 을 무력화 시킨다. 소프트웨어의 버그와 이 주소들의 지식은 높은 권한의 코드 수행을 가능하게 해준다.


Cache attack

보통 CPU 들은 cache 를 가지고 있다. 우리가 거의 상식적으로 알고 있듯이 cache 는 자주쓰는 내용을 저장해 놓고, 빠르게 불러오는 용도의 저장소라고 할 수 있다.
Address space translation tables 들도 memory 에 저장되면서 동시에 regular cache 들에 cached 된다.

Cache side-channel attacks 은 cache 들로 인해 생기는 시간차(timing differences)를 이용한다.

예제, toy example

아래의 코드를 보자.
raise_exception();
// the line below is never reached
access(probe_array[data * 4096]);

이 코드에서 access(probe_array[data * 4096]); 부분은 실제로 수행될 수 없다. 일단은 앞에 raise_exception() 에서 프로그램이 종료되기 때문이기도 하고, raise_exception() 이 없다고 해도 이부분은 OS 에서 exception 으로 처리해서 이론적으로는 접근할 수 없다.

그런데, out-of-order exception 때문에 CPU 는 아마 이미 위의 코드에 해당하는 모든 instruction 들을 수행했을 것이다. 왜냐하면, exception 코드와 access(probe_array[data * 4096]); 코드는 dependency 가 없기 때문이다.

이것은 register 나 memory 로 load 되지 않았기 때문에 크게 문제되지 않지만, 미세구조적인 부작용(microarchitectural side effect)이 있다.

out-of-order execution 를 수행하는 동안에 참조되어지는 memoryregister 에 fetch 되고, 또한 cache 에 저장된다. 만약 out-of-order execution 이 버려져야 하면, register 와 memory 에 있는 내용들은 commit 되지 않는다. 그럼에도, cached 된 내용은 cache 에 그냥 남아 있게 된다.

Flush+Reload 로 "특정 memory 위치가 cache 됐는지 여부"를 알아낼 수 있는데, 이 방법을 통해 이 microarchitectural side-channel attack 의 효과를 크게 할 수 있다.

access(probe_array[data * 4096]); 는 probe_array를 data 값에 따라 4096 byte(4kB) 간격으로 접근하게 된다. 그래서 data 의 값으로 부터 memory page 까지의 injective mapping 이 있다. 즉 2개의 값은 같은 page 로 접근이 되지 않는다. 결과적으로 만약 page의 cache line 이 cached 되면 우리는 data 의 값을 알 수 있다.
(역자: 이것에 대한 좀 더 이해하기 쉬운 설명은 ref. 3을 확인하자. ref. 3 의 설명은 data 의 값은 cache된다 하더라도 user 가 접근할 수 없기에, data 을 주소를 가리키는 index 로서 사용해서 data 가 array 의 어떤 부분을 가리키는지를 확인하므로써 data 의 값을 판단한다고 한다.)

prefetcher는 page 범위들을 넘어서 data 를 접근할 수 없기 때문에, 다른 페이지들로 펼치는 것은 prefetcher 에 의한 false positive (틀렸는데 맞다고 하는 경우)들을 없애준다.




Meltdown


Meltdown(멜트다운) 은 2개의 빌딩 블럭들을 합쳐 놓은 것이다.
먼저 공격자는 CPU 가 transient instruction sequence(일시적으로 머무르는 명령어 순서) 를 실행하게 한다. 이 transient instruction sequence는 물리적인 메모리 어딘가에 저장해 놓은 "접근할 수 없는 비밀 값(inaccessible secret value)" 을 사용한다.

transient instruction sequence 은 은신처의 송신기처럼 동작해서 결국에 공격자에게 이 비밀값을 넘겨주게 된다.

Meltdown 은 3가지 단계로 구성된다.

Step 1

공격자가 접근할 수 없는 특정 메모리 위치의 내용이 register 로 load 된다.

원래 user application 의 virtual address 에도 kernel memory 의 내용이 mapping 된다. 그러나 user 의 권한으로 이 부분을 접근하면, OS 는 exception 을 발생시킨다.
여기서 meltdown 은 out-of-order execution 취약점을 이용한다.

Step 2

transient  instruction 은 register 의 비밀내용을 바탕으로 cache line 에 접근한다.

Step 3

공격자는 Flush와 Reload 를 이용해서 자신이 접근할 cache line을 정할 수 있게 된다. 그래서 결국 선택된 메모리 위치에 저장된 비밀을 접근할 수 있게 된다.

여러 메모리 위치(memory location) 에 대해 이 방법을 반복해서 사용하므로써 공격자는 물리적인 메모리 전체와 kernel memory 를 dump 할 수 있다.



See Also

  1. CPU.fail
  2. 멜트다운과 스펙터가 울린 경보음··· 하드웨어 취약점 33가지 살펴보기 - CIO Korea, 2020-01-11 

References

  1. 인텔 CPU 보안 무엇이 문제?...패치하면 성능 저하도, 동아사이언스
  2. Meltdown and Spectre
  3. https://pgr21.com/pb/pb.php?id=freedom&no=75348

[컴] 플래시 메모리 SLC, MLC, TLC

간단한 정리 SLC, MLC, TLC / 플레쉬 / 플래쉬 / nand flash /  메모리 / erase

간단한 flash memory 동작

쓰고, 지우기

셀에 전자를 채워넣고, 채워진 전자를 빼내는 방식을 하는 것이 우리가 흔히 아는 write, erase 가 된다.

읽기

  1. 채워진 전자의 양에 따라 자기장의 크기가 달라지는데, 이것에 의해 그 밑을 지나는 N 채널의 전도폭이 변한다.
  2. 이 N채널의 전도폭의 차이로 인해 전하량에(전류값에) 차이가 발생
  3. 이 전하량을 읽어서 어디부터 어디까지는 0으로, 어느값부터 어느값까지는 1로 구분한다.

SLC, MLC, TLC 의 cell

SLC 는 cell 하나에 2의 state 만 표현하는 것이다. 즉 전자가 채워져 있으면 1로 보고, 비워져 있으면 0으로 보면 된다.
MLC 는 cell 하나에 전자가 채워진 양에 따라 4가자의 state 를 표현하게 된다. 전자가 1/3 정도 채워지면 01, 2/3 정도 채워지면 10, 3/3 채워지면 11, 비워져 있으면 00 으로 보게 된다.
TLC 는 cell 하나에서 8가지 state 를 표현한다. MLC 와 마찬 가지로 1/7 정도 채워져 있으면 001, 2/7 정도 채워져 있으면 010, … 그래서 7/7 차면, 111 이 된다.

ECC 코드

위에서 한 이야기 처럼 SLC 보다 MLC, TLC 는 전자를 세밀하게 조절해야 한다. 그래야 하나의 cell 에서 여러가지를 표현할 수 있다. 그런데 이렇게 세밀하게 조절하면 필연적으로 간섭이 발생한다. 그래서 MLC, TLC 들은 확실히 SLC 보다 error 가 많다. 그래서 이 에러를 줄이기 위해 ECC(Error correcting code) 를 크게 줄 수 밖에 없다. 그래서 MLC, TLC 가 SLC 의 2배 용량이 되지 못하고, 성능도 좋지 못한 이유다.

산화막

cell 에 전자를 가두고, 흘려버리기 위해 산화막을 사용하는데, 이 녀석을 전자가 계속 왔다갔다 하다 보면 전자가 이 산화막에 조금씩 쌓이게 된다. (대충 철에 자력이 걸려서 철이 자석이 되는 것을 상상하면 된다.)

이렇게 되면 이 산화막을 통과하는 양이 줄어들거나 할 텐데, SLC 는 state 간의 전압차가 커서 어느정도 전하량이 줄어들어도 인식하는데 큰 문제가 없지만, MLC 나 TLC 는 state 간의 전압차가 크지 않아서 전압이 미세하게 틀어져도 잘못된 값으로 write / erase 될 수 있다.

그래서 MLC, TLC 의 수명이 SLC 에 비해 떨어진다.그래서 이것을 극복하기 위해 spare 영역, over provisioning 부분을 추가해 놓는다.

from: 전기 On·Off 썸타는 반도체, 스마트폰의 ‘줄기세포’

적층구조

위 그림 설명의 GATE 가 최초에는 ‘floating gate’ 라는 이름으로 ’도체’를 사용했다. 그래서 그 안으로 (-)전자를 끌어드렸다. 이 도체 floating gate의 상태가 변하고 1, 0 을 표시하게 된다. 위 그림의 스위치 on/off 를 보면 될 것 같다. 

SLC 는 이것을 채우고 비우는 것으로 1, 0 을 표시하는 것이고, MLC 는 이 floating gate 가 비어있으면 00, 1/3정도 채운것을 01, 2/3 채우면, 10, 3/3 을 채우면 11 이 된다.

그런데 공정이 미세해지면서 cell 간의 간섭을 줄이기 위해 ’부도체’로 바꿨다. ’부도체’는 말그대로 ’전자’가 흐르지 않는다. 그래서 구멍(trap)이 많은 부도체(실리콘 나이트라이드)를 이용해서 그 구멍에 전하를 저장하게 한다. (치즈를 연상하면 된다.)

from : [플래시메모리, 어디까지 알고 있니] 플래시메모리 No.1 역사의 시작 | 삼성반도체
[그림.2] from: https://www.samsungsemiconstory.com/m/434

이제 이것을 세로로 세운다. 위 그림(그림. 2)과 아래 그림(그림. 3)을 참고하자. 이렇게 세워서 양쪽으로 이 것을 붙이는 구조를 만들었다. 이것이 ‘3D V-NAND’ 이다. 이렇게 양쪽으로 붙이게 되면서 이것을 원형으로 만들어 사용하게 됐다. 그림2 그림을 보면 짐작이 가지만 이것이 요즘 ’구멍’을 얼마나 더 깊게 뚫을 수 있느냐를 이야기하는 것의 핵심일 것이다. 이 구멍을 뚫어야 control gate 안에 반도체Floating Gate 를 집어넣을 수 있을테니 말이다.

[K-반도체, 도전과 응전] ①누가 한국 반도체산업을 위협하나 - 오피니언뉴스 낸드 플래시 기술의 핵심은 저장공간을 높게 쌓은 뒤 전류가 흐르는 구멍(hole)을 한 번에 뚫는 ‘싱글스택(Single stack)’ 기술이다. 삼성전자는 128단 낸드플래시에도 싱글스택을 적용했다. SK하이닉스는 128단 최초 양산시 더블 스택을 적용했다. 100층 빌딩을 지을 때 한 번에 쌓아 올리기 않고 50층씩 두개를 연이어 쌓은 셈이다. 싱글스택은 더블스택보다 회로가 간단해 속도가 빠르다. 생산공정도 간단하다. 성능은 높은데 생산비용은 덜 드는 것이다.

포브스는 마이크론의 176단 낸드 출시를 전하면서 “마이크론 관계자가 176단 낸드가 88단을 두번 쌓은 ’더블스택’이라고 언급했다”고 밝혔다. 영미권 전자 전문지 아난드테크(anandtech), 익스트림 테크(Extreme Tech), 퍼드질라(fudzilla) 등은 모두 마이크론 사의 176단 낸드플래시가 “88단을 두번 쌓은 제품”이라고 분석하며 “새로운 기술이 아니다”고 덧붙였다.

from: https://m.blog.naver.com/shakey7/221416796692

References

[컴] 비트코인의 hash 알고리즘

비트코인 해쉬 알고리즘  / 해시 알고리즘 / bitcoin hash funciton

Bitcoin

비트코인관련 흥미로운 글이 있어서 정리 해 놓는다.

  • Bitcoin 에서 사용하는 hash function 은 SHA-256 이다.
  • Bitcoin 은 security 를 위해 SHA-256 을 두번 사용한다.(double-SHA-256)
  • 어떤 hash 값을 찾느냐 하면, 연속된 0 으로 된 hash 값을 찾아야 한다.
  • hash function 은 원래 예측안되는 random 값을 결과로 주며, 역으로 추측할 수 없는 특성때문에 특정 hash 값을 찾으려면 원하는 hash 값이 나올때까지 input 을 계속 변경하는 수밖에 없다.
  • 현재(2017년 12월)는 연속된 0이 약 17개 정도 있는 hash 값을 발견해야 한다. 이것의 확률은 1/140,000,000,000,000,000,000 정도라고 한다.


  • 비트코인 블럭 샘플
  •  hash function 의 input 으로 주면 연속된 0 을 가진 hash값(block hash) 가 나오게 된다.
  • hash input 은 아래 값들을 모아서 만들어진다.
    • version
    • previous block hash(reversed)
    • Merkle root(reversed)
    • timestamp
    • bits
    • nonce
  • 비트코인 블럭 샘플의 값을 가지고 테스트 해보면 이미 채굴된 값이라서 당연히 연속된 0이 나오지만, 대부분의 경우는 그렇지 않다. 그 경우에는 nonce 나 다른 부분의 값을 변경하면서 연속된 0 이 나오는 input 을 찾아야 한다.


SHA-256 해쉬 알고리즘

  • SHA256 hash algorithm 은 512bits 를 input 으로 받는다.
  • 그래서 결과로 256-bit 을 내어준다.
  • SHA 256 은 간단한 작업을 64번 반복해서 output 을 만든다.
  • 이 간단한 작업을 그림으로 표현하면 아래와 같다.

1 round

잘보면 대충 알 수 있는데, 일단 A,B,C,D,E,F,G,H 는 각 하나당 4byte(32bit) 로서 총 64 byte를 보여준다. 한 round 를 수행하면, ABCDEFG 가 오른쪽으로 움직이고, H 만 여러가지 계산을 거쳐서 A의 자리로 가게 된다. 자세한 설명은 아래 링크들을 참고하자.


scrypt hash algorithm

  • 하드웨어로 구현이 어렵도록 디자인된 hash algorithm
  • Litecoin / Dogecoin 등의 가상화폐가 사용한다.






[컴] https 패킷 캡쳐하기



Wireshark 에서 https 패킷 decrypt 하기

chrome/firefox 에서 SSLKEYLOGFILE에 key log 들을 저장해 준다. 그래서 이것을 이용해서 wireshark (1.6 이상 버전)에서 https packet을 decrypt할 수 있다.[ref. 1]


SSLKEYLOGFILE 변수지정


  1. 먼저 SSLKEYLOGFILE 변수를 지정하자
  2. 그리고 firefox/chrome을 restart 하자.
  3. 그리고 https request 를 하면
  4. 지정한 곳에 log 가 만들어지는 것을 확인할 수 있다.


제어판 > 시스템 > 고급시스템 설정 > 환경변수 > 새로만들기
  • SSLKEYLOGFILE=c:\a\sslkeylog.log



그림에는 철자가 틀렸다

Wireshark 에서 설정(Preference)으로 가자.

  • preferences > Protocol > SSL > (Pre)-Master-Secret log filename 에 c:\a\sslkeylog.log




References

  1. NSS Key Log Format - Mozilla | MDN
  2. Decrypting TLS Browser Traffic With Wireshark – The Easy Way! | Jim Shaver
  3. CertSimple | Wireshark 2 is the simplest way to inspect HTTPS on your Mac


[컴] ffmpeg 으로 video container 변경


ffmpeg 으로 video container 변경

FFmpeg download for windows

아래경로에서 ffmpeg 의 binary 를 다운로드 할 수 있다. 보통 .zip 으로 되어 있다. 이 안에 bin folder 에 ffmpeg.exe 가 있다.




video file 에서 transcoding 없이 container 만 변경할 때

03.mkv 를 03-01.mp4 로 변경하는 명령어이다. -c copy 를 하면 mkv 의 내용을 그냥 그대로 mp4 로 copy 한다.(transcoding 없이)
c:\..> ffmpeg.exe -i 03.mkv -c copy 03-01.mp4


다른 기능들

ref. 2 를 보면 아래와 같은 내용을 확인할 수 있다.

  • 1. Cut video file into a smaller clip
  • 2. Split a video into multiple parts
  • 3. Convert video from one format to another
  • 4. Join (concatenate) video files
  • 5. Mute a video (Remove the audio component)
  • 6. Extract the audio from video
  • 7. Convert a video into animated GIF
  • 8. Extract image frames from a video
  • 9. Convert Video into Images
  • 10. Merge an audio and video file
  • 11. Resize a video
  • 12. Create video slideshow from images
  • 13. Add a poster image to audio
  • 14. Convert a single image into a video
  • 15. Add subtitles to a movie
  • 16. Crop an audio file
  • 17. Change the audio volume
  • 18. Rotate a video
  • 19. Speed up or Slow down the video
  • 20. Speed up or Slow down the audio



References

  1. How to change the container of a video (without re-encoding) using FFmpeg command line - Quora
  2. Useful FFmpeg Commands For Converting Audio & Video Files

[컴][LLVM] Visual Studio 에서 Clang tool 빌드 하기



Clang 의 AST 이용하기

c:\> clang hello.c
를 하면, a.exe 를 만들어 낸다. 우리는 이런 실행파일을 원하는 것은 아니다. clang 내부에서 쓰는 AST 자료를 사용할 것이다.
source code 가 있다면 CLang 이 preprocessor 를 실행해서 이 source code 를 parse 해서 AST(Abstract Syntax Tree) 를 만든다.[ref. 1]

이 AST 를 얻기위해서 아래처럼 하면 AST 를 console 에 뿌려준다.
c:\> clang -Xclang -ast-dump -fsyntax-only hello.c

이 AST 를 이용해서 source code 를 다루는 이유는 source code 자체에 대한 분석이 용이하기 때문이다. AST 를 보면 대략 알겠지만, 각 code 가 어떤 의미를 갖는지에 대한 정보를 다 만들어준다.(예를 들면, 함수인지 여부, 변수인지 여부 등등)



The Clang AST




CLang interface

CLang 에서 AST 를 이용할 수 있게 3가지 interface 를 제공하는데, "CLang 문서" 에서 대해 말해준다.

  1. LibClang : 대부분 Clang 을 쓴다면 이녀석을 사용하게 될 것이라고 한다. 다른 Clang 의 interface 는 LibClang 을 쓰지 말아야할 이유가 있을 경우에 사용하라고 한다.
    참고로 LibClang 은 AST 의 full control 을 제공하지 않는다.
  2. Clang Plugins : compile 할 때 만드는 AST 에 어떤 추가적인 작업을 넣고 싶을 때 이 interface 를 사용하면 된다.
  3. LibTooling : C++ interface 이다. ref. 1 에서는 이 LibTooling 이 처음에 사용하기에 가장 적합하다고 이야기한다.
개인적으로는 ref. 1 의 설명이 더 이해하기 좋다.






Visual Studio 에서 Clang tool 만들기

일단 위의 글(ref. 3)의 code 를 가지고 작업을 해보자.



Visual Studio project file 만들기

source 와 CMakeLists 만들기

아래처럼 구조를 만든다. 여기서 아마도 반드시 폴더 이름을 extra 로 해야할 것이다.

<llvm>\tools\clang\tools\extra
                   + CMakeLists.txt
                   + \loop-convert
                                  + CMakeLists.txt
                                  + LoopConvert.cpp

<llvm>\tools\clang\tools\CMakeLists.txt 에 아래와 같은 code 가 기본으로 들어가기 때문이다.
add_llvm_external_project(clang-tools-extra extra)

<llvm>\tools\clang\tools\extra\CMakeLists.txt
add_subdirectory(loop-convert)

<llvm>\tools\clang\tools\extra\loop-convert\CMakeLists.txt
set(LLVM_LINK_COMPONENTS support)

add_clang_executable(loop-convert
  LoopConvert.cpp
  )
target_link_libraries(loop-convert
  clangTooling
  clangBasic
  clangASTMatchers
  )

<llvm>\tools\clang\tools\extra\loop-convert\LoopConvert.cpp
// Declares clang::SyntaxOnlyAction.
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
// Declares llvm::cl::extrahelp.
#include "llvm/Support/CommandLine.h"

using namespace clang::tooling;
using namespace llvm;

// Apply a custom category to all command-line options so that they are the
// only ones displayed.
static llvm::cl::OptionCategory MyToolCategory("my-tool options");

// CommonOptionsParser declares HelpMessage with a description of the common
// command-line options related to the compilation database and input files.
// It's nice to have this help message in all tools.
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);

// A help message for this specific tool can be added afterwards.
static cl::extrahelp MoreHelp("\nMore help text...");

int main(int argc, const char **argv) {
  CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
  ClangTool Tool(OptionsParser.getCompilations(),
                 OptionsParser.getSourcePathList());
  return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>().get());
}


cmake-gui.exe

이 상황에서 linux 의 경우는 CMake 를 하면 될 것인데, VS 에서는 일단 필자는 cmake-gui.exe 를 이용했기 때문에, .proj 만 하나 따로 생성 하는 법을 모른다. ^^;;; 그래서 모든 .proj 를 다시 만드는 법을 택했다.(참고-LLVM 을 Windows Visual Studio Community 2015에서 build)

대신에 기존의 path 이름을 임시로 변경해 놓고 -> 새롭게 만들고 -> 필요한 부분만 옮겨놓고 -> 이름을 바꾸는 방식을 택했다.

그렇게 얻고나서 필요한 부분만 기존의 .sln/.proj 있는 곳을 copy 해주면 된다. 그러니까 여기서는 아래 부분이 되겠다. 아래 그림에서 왼쪽패널이 새롭게 만든것이고, 오른쪽으로 copy 한 것이다.
  • <llvm>\build\tools\clang\tools\extra\




project 추가

이렇게 하고, 다시 .sln 이 있는 곳의 folder 이름을 변경해 주고, LLVM.sln 을 열었다. 그리고 나서 아래처럼 solution explorer 에서 project 를 add 해주면 된다.



exe 위치

loop-convert 의 build 가 끝나면 아래 위치에서 exe 를 확인할 수 있다.
  • <llvm>\build\Debug\bin\loop-convert.exe

exe실행


f:\>c:\a\programming\llvm\llvm\build\Debug\bin\loop-convert.exe test.cpp --

이러면 test.cpp 를 분석해준다.

뒤에 "--" 표시는 "--" 뒤에 오는 "compiler 에 대한 추가적인 옵션"들을 사용해라. 라는 뜻이다. 즉 위의 경우는 아무런 옵션도 사용하지 않겠다는 뜻이 된다.

"--" 가 없는 경우에 compiler option 을 compilation database 에서 가져오게 된다.





이방법을 이용해서 ref. 2 의 예제를 한번 따라해 보면 될 듯 하다. 참고로  ref, 2 의 소스코드는 옛버전의 llvm 소스를 바탕으로 해서, 몇가지 수정해야 돌아간다.


References






[컴][컴파일러] LLVM 을 Windows Visual Studio Community 2015에서 build






LLVM 을 Windows Visual Studio Community 2015에서 build

여기 내용은 ref. 1의 내용을 직접 해보면서 정리한 내용이다. 정확한 내용은 ref. 1을 보자.

여기서 ref. 1 과 다른 부분은      을 이용해서 표시했다.

LLVM 을 구성하는 3가지 project

  1. LLVM Suite : 다음 것들을 포함한다.
    1. assembler, 
    2. disassembler, 
    3. bitcode analyzer, 
    4. bitcode optimizer
    5. basic regression tests : CLang 과 LLVM tools 의 테스트에 사용할 수 있다.
    6. LLVM 을 사용하는 데 필요한 tools / libraries/ header files
  2. CLang : C, C++, Object-C, Object C++ 의 "소스코드"를 CLang 이 compile 해서 LLVM bitcode 를 만들어 준다.

    source code ---> LLVM bitcode 를 하는데, 이것을 위한 tool 이 CLang 이다.

  3. Test Suite : Windows 에서 실행되지 않는다.

directory 구조 / tool chain 등에 대한 추가적인 정보는 ref. 2 에서 알 수 있다.


필요 조건

  • Visual Studio 2015 가 구동될 수 있는 system.
  • 대략 3GB 이상의 HDD :  The LLVM source tree +  object files + libraries + executables 
  • Visual Studio 2015 버전 이상의 Visual Studio : 여기선 Visual Studio 2015 Community 를 사용할 것이다.
  • CMake build system : 아래 "CMake 설치" 참조
  • LLVM test 를 실행하기 위해서 python 2.7 이상이 필요
  • GnuWin32 tools
  • LLVM source tree 의 path 에는 space 가 있으면 안된다.


소스 받기

svn 으로 되어 있다. svn 을 설치하기 귀찮은 관계로 여기서는 git 을 이용한다.
c:\a\programming\llvm> git clone http://llvm.org/git/llvm.git
c:\a\programming\llvm> cd tools
c:\a\programming\llvm\tools> git clone http://llvm.org/git/clang.git
  • 소스를 받는데에만 약 95분정도가 소요됐다.(llvm source : 60분 / clang source : 35분)
  • 빠르게 하려면 한번에 받아서 unzip 하는 것이 나을 듯 하다.




Visual Studio 2015 실행

Visual C++ toolchain 이 필요해서 미리 한번 실행해서 tool chain 을 설치해야 한다.
12시 51분에 시작






CMake 설치

https://cmake.org/download/ 에서 download 하면 된다. 여기서는
  • cmake-3.7.1-win64-x64.msi
를 사용했다.


CMake 실행

이제 CMake GUI를 실행해 보자.

  • c:\Program Files\CMake\bin\cmake-gui.exe

절차

  1. Where is the source code : llvm 을 download 받았던 path, 즉, .git 이 있는 그 folder 를 지정해 준다.
  2. Where to build the binaries : 이것은 CMake 로 만들어질 output file 이 어디에 두느냐 이다. 여기서는 binary 를 만드는 것은 아니고, sln file 등을 만들어준다.

    불확실하지만, path 는 llvm source root 안으로 잡아야 한다. 외부로 잡았었는데, *GenRegisterInfo 가 include 되는 곳에서 error 가 발생했다.(그런데 뭔가 필자의 설정 문제 같기도 해서 잘 모르겠다.)
  3. Configure : configure 버튼을 누르면 가운데 화면에 빨간색 바탕으로 변수들이 나온다. 이 변수들의 설정을 원하는대로 변경하고, Generate 버튼을 누르면 .sln + .proj 파일들이 만들어진다. ref. 1 의 이야기로는 default 값으로 generate 해도 별 문제 없다고 한다.

    이 때 CLANG_* 변수들이 보인다면, CLANG 에 대한 project 도 같이 만들어진다. 보이지 않는다면, clang source 가 없는 것일 것이다.
  4. CMAKE_INSTALL_PREFIX : 이 값은 LLVM 을 compile 해서 나오는 binary 를 저장할 path 를 지정해 주는 것이다. default 는 그림과 같다.
  5. Generate : 이것을 누르면 .sln + .proj 파일들을 만들어준다.




clang source 없이 llvm source 만 설정했을 때

clang source 를 추가했을 때


LLVM.sln

이제 LLVM.sln 을 열자. "where to build the binaries" 를 "c:\a\programming\llvm\llvm\build\" 로 설정했다면 아래 경로에 LLVM.sln 이 있다.
  • c:\a\programming\llvm\llvm\build\LLVM.sln


Build

모든 project 를 build 하려면, "ALL_BUILD" 또는 "INSTALL" 을 Build하면 된다.

참고로, clang source 는 llvm 을 이용하기 때문에 2개의 source 가 같은 시점이어야 한다. 내 경우는 llvm 만 먼저 설치후에 나중에 며칠 지나서 clang source 를 받아서 build 했는데, 그랬더니 struct 등이 맞지 않아서 error 가 많이 났다.

INSTALL 은 ALL_BUILD 를 실행하고, libs, header 등도 같이 CMAKE_INSTALL_PREFIX 폴더에 copy 해 준다.



compile 시간

  • CPU : i3-2100 CPU@3.10GHz
  • RAM : 8GB
  • DISK : SATA3(6Gb/s), 7200RPM, 16MB
  • compile 시간 : 
    • 약 65분(CLang 을 제외한 경우), 
    • CLang 을 포함하면 최소 2시간정도



INSTALL

기본적으로 아래 경로에 실행파일이 만들어진다.
  • <.sln file directory>\Debug\bin
만약 install 을 실행한 경우라면, 위의 path 에서 만들어진 binary file 들은 CMAKE_INSTALL_PREFIX 에 정의한 path 로 복사된다.
  • c:\Program Files (x86)\LLVM




See Also

  1. Clang Tutorial Part I: Introduction | Bits, Bytes, Boos


References

  1. Getting Started with the LLVM System using Microsoft Visual Studio — LLVM 4.0 documentation
  2. Getting Started with the LLVM System — LLVM 4.0 documentation



[컴][보안] 서버의 key 관리 어느것이 나을까?







DB 의 field 값 암호화

갑자기 서버가 사용하는 DB 에 user 의 어떤 key 를 저장할 때(예를 들면 특정사이트의 password 같은) 어떤 식으로 저장하는 것이 해킹에 안전할까에 대한 궁금증이 들었다.

그래서 조금 찾아보니 아래에 어느정도 잘 답변해준 자료가 있었다.


여기서 이야기 하려고 하는 것은 당연히 crypt/decrypt 가 되는 암호화를 이야기 하려 한다. hash 같은 방식은 여기서 사용하지 않는다. 왜냐하면 암호화 한 내용을 다시 복호화해서 사용해야 하는 상황이기 때문이다.

여하튼 짧은 보안에 대한 지식을 가지고, 어떤 식으로 key 를 관리하는 것이 좋은 지에 대해 한 번 생각해 보자.

키 관리 key management

symmetric / asymmetirc

개인적으로 symmetric 을 쓰려고 한다. asymmetric 은 key 를 주고받아야 하는 경우가 아니라면 굳이 사용할 이유는 없다고 생각된다. 암호화 수준도 대체로 symmetric 이 우수하다고 하며, key 를 따로 관리해야 하는 것도 부담이다.(혹시 이밖의 의견이 있다면 댓글을 부탁합니다.)

key 관리 key management

결국 이 암호화의 핵심은 key 를 hacker 에게 어떻게 노출시키지 않을 수 있는가 인 듯 하다. 그러기 위해서는 일단 key 를 어디에 숨겨야 한다. 그럼 key 를 숨기기위해 또 암호화를 할까? 그것은 그냥 절차(process)만 길게 만드는 것일 뿐, 보안에 더 도움이 되지 않는다.

보통은 이 key 를 hacker 가 알아내기 힘든 어떤 값으로 정하는 쪽을 택하는 듯 하다.

hacker 가 가져가기 힘든 것

hacker 가 알아내기 힘든 곳이란 것은 자신의 컴퓨터가 hacking 되었을 때를 가정하면 파악할 수 있다.

보통 자신의 server 의 admin 계정이 hacking 당하는 등의 일이 발생하면, hacker 는 계속 그 컴퓨터를 사용하기 보다는 서버의 정보를 자신의 local 로 옮기는 행위를 할 가능성이 크다.

왜냐하면 hacking 이 발각되면, admin 비밀번호를 당연히 바꿀 것이고, 다시 hacking 을 해서 정보를 가져오려면 또 오랜 수고가 필요할 테니 말이다.

그래서 결국 여기서 "hacker 가 알아내기 힘든 곳"이란 결국 hacker 가 가져갈 수 없는 어떤 것이 된다. 대부분은 network를 통해 가져갈 수 있으니, 그 이외의 것을 고려하면 된다.

Hardware

그래서 가장 좋은 것은 encryption key 로 h/w 정보를 이용하는 것이다. 물론 쉽게 알아낼 수 있는 것은 좋은 생각이 아니다.(예를 들면 mac address)

그래서 ref. 1 에서 이야기하는 것처럼 외부에 장착된 security module 같은 것은 더없이 좋다. 아니면 TPM chip 같은 것을 이용하는 것도 좋다.

물론 여기에도 한계는 있을 수 있다. hacker 들이 이것을 이미 알고 들어왔다면, security module 을 hacking 하는 시도를 하던지 TPM chip 의 정보등은 해킹을 시도할 수 있다.

login 정보

os 의 login 정보를 key 로 이용할 수 있다. 하지만 이것은 linux 에서 어떤 식으로 가능한지는 잘 모르겠다. windows 는 이런 API 를 제공한다. 이것을 활용한 예는 chrome 에서 볼 수 있다. 아래 글을 참고하자.

server 시작시 key 입력

개인적으로는 이녀석이 쉽게 구현해서 사용할 수 있고 꽤 괜찮은 안전 수준을 제공해 줄 듯 하다. ref. 1 에서 memory dump 로 가져갈 수 있다고 하지만, 입력한 key 의 hash 값을 사용한다면 더욱 안전한 상태가 가능할 듯 싶다.

하지만 관리자가 계속 머리에 key를 가지고 있어야 하는 것은 부담이다.

다른 서버에 저장

개인적으로 이것도 나쁜 생각은 아니라고 생각된다. 하지만, 그 key 를 저장하는 서버가 충분히 secure 할 필요는 있다. 쉽게 뚤리는 곳이라면 hacking 도 쉽게 이뤄질 수 있으니, 순간적으로 key 가 탈취당하지 않았다고 생각할 수 있지만, 바로 hacking 해서 가져갈 수도 있다.

하지만 일단 또다른 hacking 을 해야 한다는 부담감이 있어서 단념하게 될 가능성도 크다.

같은 서버에 다른 곳에 저장

가장 쉽게 생각할 수 있는 부분인 듯 하다. 그저 network 로 정보만 가져가는 경우라면 다행이겠지만, admin 계정등을 해킹해서 들어온 경우라면, 큰 의미없는 보관이 될 듯 하다.

개인적은 결론

일단 개인적으로 자금이나 machine 의 상황으로 h/w 를 이용하는 것은 쉬운일이 아니라고 생각된다. 그런면에서는 조금 번거롭지만, 암호를 잘 기억해서 server 를 띄울때 typing 하는 것이 가장 합리적인 방법이 아닐까 생각된다.

References

  1. key management - Where to store a key for encryption? - Information Security Stack Exchange

[컴] Visual Studio 2015 Community 개인적인 단축키 세팅



이글은 그냥 개인적으로 필요한 세팅을 정리해 놓는다.

Visual Studio 2015 를 python 의 debugger 로 쓰려고 하는데, 단축키가 달라서 개인적으로 몇가지를 조정했다.


Shortcuts

Ctrl+Q( Quick launch) 에서 keyboard 를 치면
Options > Environment > Keyboard 로 갈 수 있다. 거기서 아래 부분을 수정했다.
이탤릭체는 그냥 적어놓는 기능이다.

  • Edit.FindNext : F4
  • Edit.FindNextSelected : Shift + F4 (cursor 가 있는 곳의 symbol 을 찾기)
  • Edit.FindPrevious : F3
  • Edit.FindPreviousSelected : Shift + F3 (cursor 가 있는 곳의 symbol 을 찾기)
  • Edit.FindAllReferences : alt + F7 (reference 된 곳들을 찾아준다.)
  • Edit.QuickFindSymbol :  (정의 된 곳들을 solution 내 에서 찾아준다.)
  • Edit.GoToDefinition : ctrl + b
  • View.ClassViewGoToSearchCombo : ctrl + R (file 내의 symbol 을 찾기에 좋다.)
  • View.NavigateBackward : alt + 왼쪽화살표
  • View.NavigateForward : Text Editor  / alt + 오른쪽화살표
  • Windows.SolutionExplorerSearch : ctrl + p (solution 내 모든 파일)
  • Edit.CommentSelection : ctrl + /
  • Edit.UncommentSelection : ctrl + shift + /
  • Edit.NextBookmarkInDocument : F2
  • Edit.PreviousBookmarkInDocument : Shift + F2
  • Edit.ToggleBookmark : ctrl + F2




여러 단어 한번에 선택하기, multi selection

sublime text 등에서 ctrl + d 를 이용하면 같은 단어를 select 해준다. 이것을 가능하게 해주는 extension 이다. 설치하고 Visual Studio 를 restart 하면 된다.



한번에 여러 line 선택, vertial selection

alt 를 누르고, 마우스를 drag 해서 여러 line 을 한번에 선택할 수 있다. 하지만 이 extension 으로 multi selection 을 안된다. 이녀석은 MixEdit 를 설치했다면 굳이 설치 하지 않아도 좋을 듯 하다.


메인 메뉴 숨기기


그리고 메인메뉴(main menu bar)를 안보이게 하고 싶어서 아래 plug in 을 설치했다. plugin 을 설치하고 restart 를 하면 된다.

[컴][웹][보안] HTML5 Canvas fingerprinting

HTML5 Canvas fingerprinting 원리 / 캔버스 지문채취 원리 / 브라우저에서 트래킹하는 방법/ 이미지 픽셀로 컴퓨터 구분하는 방법


HTML5 Canvas fingerprinting 

우리가 인터넷을 사용할 때마다 우리를 tracking 하는 기술들이 많이 있다. 이 post 에서는 canvas fingerprinting(캔버스 지문채취) 라는 기술에 대해서 간략히 알아보자.

ref. 1 에 가면 현재 자신의 browser 로 fingerprinting 을 한 내용을 보여줄 것이다. 그리고 이것이 어떻게 동작하는 지를 알려준다.

ref.1 에서 설명을 잘해 주고 있어서 ref.1 의 내용 중 일부를 번역했다.

아래의 글은 ref.1 의 내용을 번역한 것이다.

Canvas 2D context 를 사용한다면, 특히 WebGL profiling 을 사용한다면 비디오 adapter 를 구분할 수 있다.  일반적인 font 를 rendering 할 때 그래픽 카드 드라이버마다 다른 영향을 준다.
이렇게 만든 화면은 memory 상에 있게 되는데, 이 화면을 toDataURL() 함수를 이용해서 추출한다. toDataURL() 함수가 binary image 파일을 base64-encoding 된 문자열로 변환해서 보여준다.
그래서 이 string 을 MD5 hashing 을 할 수도 있고, PNG file 마지막에서부터 16 ~12 byte 에 있는 IDAT chunk 로 부터 CRC checksum을 추출할 수도 있다.
이것이 Canvas Fingerprint 가 된다고 한다.

실제로 구현된 모습은 ref. 1 에서 확인할 수 있다. 아래는 javascript code 이다.

// Text with lowercase/uppercase/punctuation symbols
var txt = "BrowserLeaks,com <canvas> 1.0";
ctx.textBaseline = "top";
// The most common type
ctx.font = "14px 'Arial'";
ctx.textBaseline = "alphabetic";
ctx.fillStyle = "#f60";
ctx.fillRect(125,1,62,20);
// Some tricks for color mixing to increase the difference in rendering
ctx.fillStyle = "#069";
ctx.fillText(txt, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
ctx.fillText(txt, 4, 17);


converse 를 이용해서 video 카드 특성을 알아보는 법

ref. 2 에 보면 html 의 canvas 와 js 를 이용해서 어떤 식으로 video 카드의 특징을 파악하는 지 알 수 있다.

ref.2 에서는 font-smoothing 기능을 지원하는지 여부를 알아보는 함수를 보여주는데, 원리는 간단하다.

canvas 2D context 를 이용해서 그 안에 검정색의 문자를 하나 넣는다. 그러면 video card 가 그것을 rendering 할 텐데, 이 rendering 된 결과의 pixel 들을 확인하는 것이다. 그래서 검은색이 이외의 색(예를 들면 회색) 이 있다면, 이것은 font-smoothing 이 적용돼서 흐릿한 색이 들어간 것일 테니, 이런 경우라면, graphic card 가 font-smoothing 을 사용한다고 보는 것이다.



기타

이외에도 browser 를 통해 많은 정보를 가져갈 수 있는데 이런 방법들은 아래 source 에서 확인할 수 있다. 대략 보면 DOM 의 navigator 정보를 많이 이용하는 듯 하다.



Reference

  1. HTML5 Canvas Fingerprinting : further reading 에서 더 많은 자료를 확인할 수 있다.
  2. How to Detect Font-Smoothing Using JavaScript


[컴][그래픽] Bitmap 포맷 정보

비트맵 분석 / 비트맵 정보 / 비트맵 포맷


Bitmap format

1 pixel 의 검은색 bit map(24bit) 에 대한 hex code

42 4D 3A 00 00 00 00 00 00 00 36 00 00 00 28 00
00 00 01 00 00 00 01 00 00 00 01 00 18 00 00 00
00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00

file size
reserved(not used yet)
file 의 시작위치에서부터 실제data 위치
-----------------
bitmap header size – 각 bitmap variants 마다 size가 다르다. 제공하는 기능이 다르기 때문이다. Windows는 40byte의 size를 쓴다. Bitmap header size 는 지금 이 header size 를 포함해서 40-byte 이다. 즉, 위 그림에서 0x 28 00 00 00 부터 40-byte이다.
width in pixels
height in pixels
-----------------
planes
bits per pixel
compression
-----------------
bitmap data size
hresolution (pixel per meter)
vresolution (pixel per meter)
-----------------
colors
important colors
-----------------
실제 data, 한 pixel 당 3-byte(24bit) 사용.

Bitmap data 분석시



Bitmap 의 저장은 빨간색으로 표시된 왼쪽 아래에서부터 한 줄씩 저장하게 된다.


Null-byte padding

한 line 이 4-byte 로 나누어 떨어지지 않으면, 4의 배수로 맞추기 위해 null-byte를 추가한다.
예를 들면,
가로 5-pixel 의 bitmap 을 24-bit로 저장한다면,
가로줄 하나는
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
이렇게 된다. 이러면 가로줄 하나는 15-byte 가 된다. 그럼 4-byte로 나누어 떨어지지 않는다. 그래서bitmap 으로 저장하게 되면
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
이렇게 00(null-byte) 을 붙여서 4-byte로 나누어 떨어지게 한다.
If the number of bytes matching a horizontal line in the image is not divisible by 4, the line is padded with null-bytes.


Reference

  1. http://atlc.sourceforge.net/bmp.html
  2. http://en.wikipedia.org/wiki/Windows_bitmap




[컴][용어] Proof-of-work 란?

일의 증명 / what is proof of work


Proof-of-work 가 무엇일까? bit coin 문서를 보면 proof-of-work 의 이야기가 많이 나온다. 그래서 proof-of-work 에 대한 정의에 대해 살펴보자. 대부분 ref. 1 을 보고 필자가 이해한 바를 정리한 내용이다.



Proof-of-work system

proof-of-work 는 핵심은 비대칭성이다.[ref. 1] 이것은 한쪽은 시간이 오래 걸리고, 다른쪽은 시간이 별로 안걸리는 것을 이야기 한다.

쉬운 예로 어떤 왕이 "저 산을 이쪽에서 저쪽으로 옮겨라"라고 지시했다고 하자. 이 경우에 산을 옮기기 위해 신하들은 엄청나게 오랫동안 일을 하지만, 왕은 산이 옮겨진 것을 확인하는 것으로 간단하게 신하들이 고생했다는 것을 파악할 수 있다.

proof-of-work 에서 client 

proof-of-work 시스템을 번역하면 "일의 증명" 시스템이라고 할 수 있겠다. ref. 1 에서 Proof-of-work 의 예로 CAPTCHA 를 들고 있다. (CAPTCHA 에 대한 설명은 생략한다.)

우리도 이 CAPTCHA 를 가지고 proof-of-work 가 어떤 역할을 하는지 보자.

CAPTCHA 의 대표적인 예로 "이미지로된 영문자"가 있다. CAPTCHA의 "이미지로 된 영문자"는 정상적인 모양이 아니라 조금 비틀어져 있다.

이렇게 조금 비틀어진 이미지로 된 영문자는 컴퓨터의 입장에서 바로 인식할 수 없다. 흔히 이야기하는 image processing 을 해서 비로서 컴퓨터 입장에서 "문자"로 인식한다. 이 분야를 OCR(optical character recognition) 이라 하는데 이 OCR 이라는 것이 그렇게 훌륭하지 않아서 조금만 정자(正字) 에서 벗어나면 인식률이 크게 떨어진다. 결국 이 CAPTCHA 를 컴퓨터가 제대로 읽어드리기 위해서는 이런 비틀어진 이미지에 대한 처리를 해줘야 하는데, 이것은 작업이 빠르게 되지 않는다. 비틀어진 글자들이 어떤 pattern 을 가지고 있는지도 알 수 없으며, pattern 이 없기 때문에 여러가지 경우를 고려해야만 한다. 여하튼 이런 이유로 CAPTCHA 의 글씨는 사람은 빠르게 처리할 수 있지만, 컴퓨터는 시간이 오래걸리게 된다.

만약에 login 과정에 CAPTCHA 를 사용하는 시스템이 있다고 하자. 이 때 만약 누군가가(컴퓨터이든, 사람이든) CAPTCHA 를 통과해서 시스템에 들어오면, 이 통과해서 들어온 녀석은 무조건 login 을 정상적으로 했다고 인정해 준다.

사람이 아닌 컴퓨터가 통과하는 것은 해킹이기 때문에 허락하면 안되는 것 아니냐라고 생각할 수 있다. 하지만 컴퓨터로 통과하려면 이 CAPTCHA 를 처리하는 작업을 하고 들어와야 하는데, 이 CAPTCHA 를 처리하는 시간이,장비나 알고리즘마다 틀릴 수 있지만, 몇시간이상 걸릴 것이다. 이것이 한번의 login 시도만 할 경우에는 해볼만 할 지 모르겠지만, 해커의 입장에서는 비용이 많이 든다. 고작 login 시도 한 번을 위해 몇시간을 투입할 수는 없다. 이것을 병렬로 돌린다고 해도, 여러대의 컴퓨터를 소유해야 하고, 전기도 사용해야 해서 비용 대비 효율이 떨어진다.

즉 "login 시도"를 컴퓨터로 자동화 해도, 원하는 만큼의 속도를 얻기가 힘들다는 이야기다. 보통 컴퓨터로 자동화 하는 이유가 빠르게 여러 번 시도해서 login 을 성공하려는 것인데, 그런 일을 어렵게 한다는 것이다.

이러한 판단을 해커가 하게 된다면, 해커는 굳이 CAPTCHA 를 뚫으려 하지 않는다. 차라리 그 시간에 CAPTCHA 가 없는 곳을 공격하거나, 아니면 사람을 사용해서 일일이 시도하거나, CAPTCHA 를 우회할 방법을 고민할 가능성이 크다.

이렇게 해커에게 이 시스템을 공격하는 것은 돈도, 시간도 많이 드는 작업이라는 것을 알려서, 대부분의 해커가 포기하게 만드는 것이 Proof-of-work 의 목적이다.

proof-of-work 의 server

다시 CAPTCHA 로 돌아가자. server 쪽에서 이 녀석이 CAPTCHA 의 인증을 할 땐 간단히 확인해 줄 수 있다. 자신이 제시한 이미지가 어떤 값을 가지고 있는지 미리 알기 때문에 client 에서 입력한 값과 자신이 입력한 값을 비교해 주기만 하면 된다. 즉 server 는 매우 빠르게 증명해 줄 수 있어서 비용이 거의 들지 않는다.

이래서 server 쪽은 큰 부담없이 CAPTCHA 를 사용할 수 있다.


protocol 종류

이 proof-of-work 의 protocol 에는 2가지 종류가 있다.[ref. 1] 이 protocol 은 ref. 1 의 variants 에 있는 그림을 확인하자.
  1. Challenge-response protocol : CAPTCHA 처럼, 
    1. 요청자(requester)가 문제(challenge) 를 요구하고, 
    2. 제공자(provider)가 문제를 골라서 주면, 
    3. 요청자가 문제를 풀고 수신자에게 주면, 
    4. 수신자가 그 문제를 확인해서 증명하는 방법
  2. Solution-verification protocol : bitcoin 등에서 처럼 요청자가 문제를 요구하는 것이 아니라, 이미 나와 있는 문제들을 푸는 것이다. 이 때 제공자는 어떤 문제를 풀었는지도 확인하고, 답도 확인해야 한다. 이런 scheme 중 하나가 bitcoin 등의 unbounded probabilistic iterative procedures 이다.


비트코인의 작업 증명

  • 실제적으로는 검사하기는 쉬우나, 풀어내기는 어려운 것을 PoW라 한다.
  • 이것을 이용해서 bitcoin 에서는 하나의 어려운 문제에 대한 해답을 얻으면(CPU 능력을 소모) , 블록체인 원장(ledger)에 새로운 block을 더할 수 있도록 한다.
  • 네트워크안의 모든 node(컴퓨터들)가 문제를 풀게 된다.
  • 이 때 가장 빨리 풀어낸 node 가 코인으로 보상을 받게 된다. 이과정을 채굴(mining) 이라고 한다.
  • 이것이 consensus mechanism 이 된다. 즉, 이녀석이 많은 작업증명을 해결했다는 것은 곧 CPU 자원을 가장많이 사용한 녀석이기 때문에 이녀석의 ledger 를 채용한다는 동의를 해준다.(컨센서스 알고리즘 참고 자료 :  Raft 알고리즘)
  • 이렇게 cpu 의 소모가 많아서 쉽게 조작하지 못한다. 대체로 악의적인 유저가 cpu 를 소모해서 ledger의 내용을 고치는 것보다는 mining 을 하는 것이 cpu 소모가 적다. 이것이 blockchain 이 pow 를 이용하는 이유 중 하나다.



Reference

  1. Proof-of-work system - Wikipedia, the free encyclopedia
  2. 창시자의 무더기 트윗이 의미하는 이더리움 블록체인의 미래 - CIO Korea, 2018.08.23

[컴][웹] ssl 에서 공격

ssl attack / 보안 공격 / 해커 공격 / https 공격 방법



SSL 공격 과 관련된 자료

https 를 사용하는데, 그래서 해킹관련 자료를 조금 찾아봤다. 1번째 자료가 개괄적으로 설명을 잘 해놓은 듯 하다. 2번째 자료는 그림자료가 있어 이해하는 데 도움이 된다.

  1. 오픈웹 관련: SSL과 관련된 공격들…
    • MITM
    • SSL Strip
    • IDN
  2. MITM 에 대한 방법, 그림 : http://kimdongwook.tistory.com/entry/SSL-MITM


https 를 http로 연결해서 공격

공격 중에 http 가 같이 열려 있는 경우에 대한 공격들이 있다. http 가 열려있는 경우 강제로 https를 http 로 연결 시키는 공격이 있다. 여기를 참고하자. 동영상을 볼 수 있다.



[컴][보안] 패스워드 보안 - password hash function

패스워드 해쉬 함수 /


password hash function

패스워드 관련 암호화 자료를 찾다가 좋은 자료를 찾았다. 아래에 password hash function 과 관련된 전반적이고 자세한 이야기, 이슈등을 정리해서 잘 알려주고 있다.



결론

결론적으로 위의 글에서 추천하는 방법은 아래 2가지 이다.

  1. bcrypt
  2. PBKDF2 

안드로이드에서 PBKDF2 사용




Asymmetric  < symmetric

Asymmetric 암호화보다는 symmetric 암호화가 훨씬 secure 하다고 한다.




[컴] 공유캐쉬

shared cache /



예전에 잡다한 것들을 정리했던 empas 블로그가 있었는데, 이녀석이 자꾸 인수되면서 내 계정을 찾는 기간을 놓쳐 버렸다. ㅜ.ㅜ 현재 zum 에 있는데, 계정은 찾아줄 수 없고, 삭제는 가능하다고 한다. 그래서 조금씩 글들을 옮겨 놓으려 하고 있다.


작성일 : 2008-04-26

공유캐쉬

false sharing 에 관한 글(http://minjang.egloos.com/1094099)을 보다가 참조사이트를 따라 갔더니 multi-core system 에서 공유 캐쉬를 잘 활용하는 방법에 대한 글이였다. 그저 개인적인 호기심에 한 번 보기 시작하고 정리를 했더니 번역이 되어 버린 듯 하네.

내가 정리한 내용은 그다지 충실하지 않으니 관심이 있으시면 아래 링크를 가서 보는 것이 좋을 듯 하다.



Software Techniques for Shared-Cache Multi-Core Systems

프로그램적으로 multicore processor 를 잘 사용하는 법.

processor affinity

이것은 어떤 core에 어떤 thread 를 할당할 것인가에 관한 얘기다.

data의 공유없이 그저 각자의 일을 하는 thread들은 (contention-only threads) cache 를 share하지 않는 core에 넣어야 하고, 어떤 data를 공유하는 thread 들(data-sharing threads) 은 cache를 share 하는 곳에 넣어야 한다.

만약 정말 밀접하게 연관되어 있는 thread 들이라면(closely tied to each other) 같은 core 안에 놓는 것이 data를 공유할 때 cache miss 가 적게 발생해 훨씬 빠르다.


cache blocking technique. (data tiling)

하나의 data set 이 있고, 이것의 size가 cache 의 size 보다 크고 이 data set을 사용하는 loop 이 있다. 이 때 A라는 작업(operation)에서 data set 을 전부 한 번씩 처리하고 나서,
다시 처음부터 data set을 처음부터 건드리면서 B라는 작업을 한다면 계속해서 cache miss가 날 것이다. 이것을 줄이기 위해 일단 cache size 만큼 data를 불러서 A, B operation 을 끝내고, 그 다음 data를 불러서 다시 A, B operation 을 하는 방식을 하면 cache miss를 줄일 수 있다. 이것이 cache blocking technique의 한 방법이다.

예제 : ref. 1 의 example


Hold approach

이것은 shared L2 cache에서 shared data 를 L2 cache에 계속 업데이트 하는 것을 낭비라 생각하고 이를 필요할 때만 update를 하는 식으로 바꾸는 것을 말한다.

이것을 구현하는 방법중 하나는 modified data가 shared copy에 update가 될 때까지 tracking 을 위한 private data copy를 갖고 있는 것이다.

이것의 실질적인 사용은 OpenMP* reduction clause(http://blog.empas.com/i5on9i/25398368) 를 이용하는 것이다.

예제 : ref. 1 의 example


Delayed approach

만약 Thread 0 가 사용한 data를 Thread 1 에서 사용하는 routine을 가진 program이 있다고 하자.
Thread 0 은 core 0 에서 사용되고, Thread 1 은 core 1 에서 동작하고 있다.
그러면,

  1. Thread 0 가 data를 memory에서 L1 cache로 받아와서 data를 수정한다.
  2. Thread 0 가 일을 끝내고 나서 data를 건드려도 좋다고 Thread 1 한테 신호를 보낸 것이다.
  3. Thread 1은 L2 cache를 뒤져볼 것이다. 근데 아직 data가 L1 cache에서 L2 cache로 안넘어갔다.
  4. 그러면 core 1에서는 cache miss 가 발생하고나서 data가 L2 cache 로 evicted 될 것이다.
  5. Thread 1 이 L2 cache에서 data를 가져올 것이다.

이 과정에서 data가 L2 cache로 evicted 될 때까지 signal 을 보내는 것을 늦추는 것이다.

그러면 Thread 1 이 signal 을 받는 순간에 이미 data가 L2 cache로 넘어왔기 때문에
cache miss 가 아닌 cache hit가 될 것이다.

예제 : ref. 1 의 example


false sharing

이것은 cache-coherency protocol 로 인해 발생한다.

cache는 보통 block 단위로 data를 가져오는데 이것을 cache-line이라고 한다.

우연하게 이 block 에 thread 0 에서 쓰는 data도 있고, thread 1 에서 쓰는 data도 있다면
양쪽의 L1 cache 는 서로 같은 내용의 cache-line을 가지고 있다.
이 때 한쪽에서 data를 고치게 되면 cache-line 전체가 고쳐진것으로 인식하고,
다른 한 쪽의 cache-line이 이제 쓸모없음을 알려서 cache-coherency를 유지한다.

이런 cache-coherency 때문에 공유되지 않는 data지만 같은 block 안에 묶여서
계속 cache miss가 발생한다. 이것이 false sharing 이다. 보다 자세한 내용은 "art.oriented : 정답: 다음 코드의 문제점은 false sharing" 를 보자.



Trackback




Reference

  1. software techniques for shared-cache multi-core system




[컴][자바] 소스 deobfuscating

난독화 / 역난독화 / reverse obfuscated code / dex decompiler / 안드로이드 코드 난독화



DeObfuscating

요새 안드로이드 project 가 gradle 로 넘어간 덕분인지, obfuscate 한 code 들이 많이 보인다. 이런 code 들은 아무래도 분석하기가 어려워 진다.
이런 녀석들에 대해 deobfuscating tool 들이 존재한다. 물론 이 녀석들이 정확히 obfuscated 이름을 원래대로 돌려주지는 못하지만, 아주 좋은 hint 를 주고 JDO 같은 경우는 원하는 이름으로 변화해 준다.

JDO

가장 대표적인 tool 로 JDO 가 있다. 간단하고, class 이름을 원하는 이름으로 바꿀 수 있는 기능을 제공한다. gui 가 그리 화려하지는 않지만 가장 필요한 기능을 가지고 있는 듯 하다.

그냥 모든 class 를 load 해서 Deobfuscate 버튼을 누르면, a, b 등으로 되어 있는 녀석 앞에 prefix 로 class, var 등을 붙여준다.


Decompiler

이제 deobfuscated 된 class 를 가지고 기존의 decompiler 를 이용하면 된다. 개인적으로 jd-gui 를 많이 활용했는데, 더이상 update 가 안되는 느낌이었고, 간혹 decompile 이 안되는 녀석들이 있었는데, stackoverflow 에서 아래 decompiler 를 새로 찾았다.
위의 site 에서 procyon 을 사용하는 gui 몇개를 소개해 주고 있다. 대체로 나쁘지 않지만, 개인적으로 jd-gui 가 제일 편한 느낌이다.

개인적인 의견

JDO 를 사용하고, 그것을 jd-gui 로 열어서 보는 등의 방법을 사용하면 될 듯 하다.

추가로, jd-gui 에서 src 를 저장할 수 있게 해주는데, 이녀석을 저장해서 IDE 에서 열어서 봐도 좋을 듯 하다.


See Also




[컴][리눅스] linux, 안드로이드 소스 검색 방법

linux 소스 검색 빠르게 하기 / linux source repository / linux 소스 빠르게 찾는 방법 / linux source cross referencing / linux code on the web / 안드로이드 소스 검색 방법



리눅스 소스 검색

리눅스 코드를 인터넷에서 뒤져볼려고 찾다보니, 아주 좋은 방법을 소개해준 post 가 있었다.
  • Searching the Linux Source Tree in 0.5 Seconds 

local 에서 search 하는 법에서 부터 github 에 이르기 까지 다양한 방법을 이야기 해 준다.


github

개인적으로 web 에서 보고 싶어 하기 때문에 github 에서 해주는 것이 마음에 든다. github 를 들락날락하면서도 linux source 가 여기에 있는지는 처음알았다. ^^;;;


LXR

개인적으로 LXR 로 된 녀석을 좋아하는데, 아래 사이트에서 찾을 수 있다.
상단 오른쪽에 잘 보면 검색 메뉴도 있다.




안드로이드 소스 검색

LXR