문제 : HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가

 

간단하게 C드라이브를 CD-Rom으로 인식시키는 문제이다.

 

문제만 봤을 때는, GetDriveTypeA 함수 실행 시 해당 경로의 드라이브가 C드라이브인 경우의 RETN 값과 CD-Rom  일때의 RETN 값이 다르다는 것을 추측할 수 있다.

 

문제와 함께 제시된 실행 파일을 실행시켜 본다.

여기서 확인을 누르면

CD-Rom 드라이브가 아니라고 출력한다.

 

디버거로 분석하기 전에 프로그램의 기본 정보를 알아보기 위해 STUD_PE 프로그램으로 열어보았다.

32bit 프로그램이고,

UPX 패킹이 되어있지 않음을 알 수 있다.

 

UPX 패킹이 되어있는 프로그램의 경우

저기 CODE, DATA, .idata, .reloc 부분이 전부 UPX0, UPX1로 덮혀져 있다.

UPX로 패킹되어 있는 프로그램의 섹션 예시

이제 이 프로그램을 Olly-Dbg로 열어본다.

전체 프로그램의 어셈블리 코드이다.

 

사용되는 함수는 MessageBoxA와 GetDriveTypeA 이렇게 두 종류가 있다.

 

MessageBoxA : 개발자가 출력하고자 하는 문자열을 보여주는 함수

GetDriveTypeA : 해당 드라이브의 타입에 따라 RETN 값을 보내줌.

 

우리가 봐야할 함수는 GetDriveTypeA이다.

 

대부분의 함수의 리턴 값(RETN)은 EAX 레지스터에 저장된다.

 

그러므로 GetDriveTypeA 까지 실행시키고 그 다음의 EAX 값을 보기 위해

CALL GetDriveTypeA 함수 다음 라인에 BP(BreakPoint, F2)를 걸고 실행(Run, F9)시켜 보았다.

 

현재 CALL 이후 INC 명령어를 실행시키기 직전의 상황.

 

이 상태에서 EAX 값을 본다.

 

EAX = 00000003이다.

 

어셈블리 코드를 쭉 보면, 어디서 이 00000003이 CD-Rom이 아니라고 판별하는지 알 수 있다.

 

GetDriveTypeA 함수가 끝난 후,

 

INC ESI

DEC EAX

JMP 00401021 : 의미없는 코드

INC ESI

INC ESI

DEC EAX

CMP EAX, ESI

JE 0040103D

 

요약하면, ESI를 3번 +1 하고, EAX를 2번 -1 한다.

이후에 ESI와 EAX가 같으면(JE, Jump Equal)

0040103D("Ok, I really think that your HD is a CD-ROM! :P" - 성공 메시지)로 점프

 

즉, 우리가 CD-ROM으로 인식시키기 위해서는 CMP 위치에서 EAX와 ESI을 동일한 값으로 맞춰주면 된다.

 

그럼 다시, CMP 부분에 BP를 걸고 F9를 눌러서 BP 위치까지 실행을 시킨다.

현재 BP(CMP) 대기 중인 상황.

 

여기서 Register 값을 보자.

ESI는 3이고, EAX는 1이다.

하지만 이 값들은 ESI를 +3한 값이고, EAX를 -2한 값이다.

 

EAX와 ESI가 같아야 CD-Rom으로 인식되기 때문에,

ESI와 EAX는 현재 2만큼 값이 차이나고 있으므로 EAX에 +2를 해주어야 CMP 부분에서 3으로 같아지게 된다.

 

앞에서 GetDriveTypeA의 리턴 값이 EAX=3이었기 때문에

GetDriveTypeA의 리턴 값이 EAX=5가 된다면 프로그램은 C드라이브를 CD-Rom으로 인식할 것으로 추측할 수 있다.

저 부분에 BP를 걸고 F8로 step over한 후에,

 

EAX의 값을 5로 수정해 준다.

EAX를 더블클릭 하면 수정할 수 있음.

 

추가적으로, ESI 부분이 지금 00401000으로 잡혀있는데,

이 상태에서는 CMP EAX, ESI 부분이 우리가 원하는 상태로 제대로 실행되지 않는다.

그러므로 ESI도 0으로 바꿔준다.

최종적으로 변경된 레지스터 상태.

 

이후 실행해보면

정상적으로 C드라이브를 CD-Rom으로 인식하게 된다.

'보안 & 모의해킹 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L04 풀이  (0) 2019.07.01
[CodeEngn] Basic RCE L03 풀이  (0) 2019.07.01
[CodeEngn] Basic RCE L02 풀이  (0) 2019.07.01
Posted by NDC :

 SPPNet : Spatial Pyramid Pooling 

in Deep Convolutional Networks for Visual Recognition


SPPNet

 

가장 큰 장점

1. R-CNN은 이미지 한 장당 수천 번의 CNN을 수행함(Time-Consuming).

이미지 안에서 bounding box Selective Search 방법을 사용.

반면에 SPPNet은 딱 한 번 CNN을 수행함(one-pass).

ImageFeature Map에서 어떤 위치에 해당하는 정보를 뽑아냄.

 

2. SPPNet은 이미지의 Scale(확대/축소), Size(크기), Aspect Ratio(종횡비)에 영향을 받지 않음.

 

기존의 CNN의 입력

무조건 고정 크기가 입력됨.

: Fully Connected Layer 때문이다(fixed-length Vector가 필요함).

 

Crop(자르기) : 전체 객체가 들어가지 않는 경우가 발생.

Warp(줄이거나 늘리기) : 원하지 않는 왜곡이 발생.

 

사실, Convolution Layer에는 고정 크기의 입력이 필요하지 않음.

 

BoW(Bag of Words) 기법의 확장


 [Box of Words]


1. Feature Extracting

2. Clustering : K-Means 알고리즘 사용, Codeword 찾아냄

3. Codebook Generation

4. Image Representation : Histogram화 시킴(bin 개수 = Codeword 개수)

5. Learning and Recognition : SVM 등의 방법으로 분류


R-CNN 방법과 SPPNet 방법


[R-CNN]


R-CNNImage 영역(Selective Search 방법으로 수천 개를 만듦.)을 추출하고 Warp 시킴.

원하지 않는 왜곡(Unwanted geometric distortion)이 발생함.

이후 추출한 영역을 CNN으로 학습시킴.

매우 느리다(time-consuming).

 

[Spatial Pyramid Pooling]


SPPNet Convolution 마지막 층에서 나온 Feature Map을 분할하여 평균을 내고 

고정 크기로 만들어버림.

→ '06년 발표된 Spatial Pyramid Matching 방법에서 나옴.    


[Spatial Pyramid Matching]


분할 방법은 “fast” mode of Selective Search

[논문 : “Segmentation as selective search for object recognition,” in ICCV, 2011.]

마지막 Pooling LayerSPP(Spatial Pyramid Pooling)로 대체함.

+ 내부적으로 Global Max Pooling 사용.

분할하는 크기만 동일하면 어떤 Size, Scale, Aspect Ratio를 가진 이미지가 와도 똑같은 크기의 

Vector가 출력됨.(이후 FC Layer에 입력으로 들어감.)

분류기 : 이진 선형 SVM


[Spatial Pyramid Pooling Network Architecture]

 

분할 크기(4-level Spatial Pyramid)

50 bins : {6x6, 3x3, 2x2, 1x1} 12,800-dimension(256x50) representations

30 bins : {4x4, 3x3, 2x2, 1x1}

→ stride를 각각의 크기 별로 따로 적용함.



SPP Layer의 출력

(K * M)-dimensional Vector (K는 마지막 Feature Mapdimension, Mbin의 크기)

 

Training

Single-size training : 224x224 size로만 학습, {3x3, 2x2, 1x1} SPP 사용.

2. Multi-size training : 180x180 and 224x224 두 종류를 학습.

180-Network224-Network의 출력은 동일하다.

? 나누고, 평균을 구해서 뽑기 때문.

Network Switching 방법? Epoch 1180-Network, Epoch 2224-Network... 반복!

 

실험 네트워크


[Test Network Architecture : 1. ZFNet, 2. AlexNet, 3. Overfeat Architecture]


ZFNetAlexNetConvolution Layer5

Overfeat 구조는 FC Layer1x1 Convolution으로 이해한 구조.

Sliding Window 개념 적용 가능, 연산량 감소 but 정확도는 높지 않음.

 

Improves Accuracy 



1. Multi-level Pooling

{6x6, 3x3, 2x2, 1x1}{4x4, 3x3, 2x2, 1x1}의 차이는 거의 없다.

하지만, SPP를 사용한 것과 사용하지 않은 것은 확실한 차이가 있다.

(50 bin pyramid : 34.98/14.14, no-SPP : 35.99/14.76)

 

2. Multi-size Training(그림 참조)

Multi-size SPPNet(Overfeat-7) : 29.68%

Single-size SPPNet : 30.36% / no-SPP : 32.01%


3. Full-image Representations



 다중 조합 뷰가 싱글 Full-Image 뷰보다 더 좋은 경우도 있음.

(We find that the combination of multiple views is substantially better than the single full-image view.)

 

하지만 여전히 Full-Image View는 장점이 있는데

1. 수십 개의 뷰를 조합한 경우에도 추가적인 두 개의 전체 이미지 뷰에서 약 0.2%의 성능 향상이 있음.

2. 전체 이미지 뷰는 원래의 방식과 동일하다.

3. 응용 프로그램에서 이미지 자체를 표현하는 것을 요구할 수 있음.

Detection Result



Positive Sample vs Negative Sample(Data Labeling) 


[Positive Sample and Negative Sample]


positive sample : ground-truth(=GT) Sample을 사용.

negative sample : positive sample과 최대 30% 겹치는 Sample을 사용(IOU 측정법).


[Intersection over Union]


Result 



Conclusion

- SPPNet은 다른 크기, 다른 사이즈, 다른 종횡비를 다루기 위한 유연한 방법이다.

ClassificationDetection에서 높은 정확성, 특히 DNN 기반의 Detection을 크게 빠르게 해줌.



Posted by NDC :


MobileNet v2 : Inverted residuals and linear bottlenecks



MobileNet V2

 

이전 MobileNet 일반적인 Conv(Standard Convolution)이 무거우니 이것을 Factorization

Depthwise Separable Convolution(이하 DSC)을 사용

 

사용한 기법들

1. Depthwise Separable Convolution

2. Inverted Residuals

 


Depthwise Separable Convolution

방식 : Standard ConvolutionSeparate Depthwise Conv. + Pointwise Conv.

 

1) Depthwise Convolution : kernelwidth * height * depth=1 로 설정하고

입력 이미지의 각 Channel 마다 별개로 Convolution 실시

(각 채널마다 독립적으로 Convolution)

 

2) Pointwise Convolution : kernelwidth=1 * height=1 * depth 로 설정하고

Convolution 실시(Network in Network 논문의 1 by 1 convolution과 동일)

 


기존 Convolution Layer의 연산량

DKDKMNDFDF

 

DSC(Depthwise Separable Convolution) Layer의 연산량

DKDKMDFDF + MNDFDF

= DFDFM(DKDK + N)

 

Standard Convolution보다 8~9배 수준의 속도 향상을 가져옴.

 

(추가 1. Batch Normalization 대신 Fused Batch Normalization 사용이 더 좋다.)



Linear Bottlenecks

방식: Residual Learning 방식을 통해 네트워크를 깊게 구성할 경우, 연산량이 많이 늘어나게 된다.

1 by 1 Convolution을 활용해 채널 수를 감소시킴.

(Residual Learning? : 학습을 위한 Weight Layer를 거친 후에, 초기 Input의 값을 더해주는 형태)

 

1) 일반적인 방식

일반적인 3*3 convolution 실시

 

2) Bottleneck 방식

1 by 1 convolution으로 채널 수를 줄이고 3 by 3 convolution을 실시 다시 1 by 1 convolution으로 채널 수를 복구시킴.



Q. Inverted Residual 인가?

A. 기존의 bottleneck(C)은 채널 감소 학습(DSC) 채널 복구 방식이지만,

Inverted Residual(D)은 채널 증가 학습(DSC) 채널 감소 방식이다(Inverted .)

 

Input DataOutput Data의 크기가 작기 때문에 메모리 효율적이다.



Network Architecture





 

1) 19개의 Layer로 구성되어 있음.

2) building block1번 이상의 동일 구조의 반복으로 되어 있다.(parameter n 참조)

 

Posted by NDC :