'xor'에 해당되는 글 1건

  1. 2016.08.12 Red_Message :: Python + PyQT 이용한 Xor 디코더 제작

안녕하세요. Message입니다.

webhacking.kr 문제를 풀이하다보니, 디코딩이 필요한 문제가 있었습니다.

결과적으로 해당 문제는 XOR 디코딩이 정답이 아니었지만요

평소에 간단한 도구는 직접 코딩해서 사용하는게 좋다고 생각해왔는데

생각만 하면 평생 안할거 같은지라...

이참에 GUI 기반의 간단한 XOR 디코딩 툴을 파이썬으로 제작하는 과정을 포스팅 하려고 합니다.

 

GUI부분은 PyQt4를 이용하였습니다.

RiverBank : PyQt4 Download : https://riverbankcomputing.com/software/pyqt/download

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 제작과정

------------------------------------------------------------------------------------------------------------------------------------------

 

1) PyQT4 + QT Designer

저도 파이썬으로 GUI 기능을 구현하는것은 처음이라 이것저것 알아봤더니

PyQT4를 많이 쓴다고 하길래 일단 써보기로 했습니다.

PyQT4를 설치하면 Qt Designer 라는 프로그램을 사용하여 아래와 같이 디자인을 할 수 있습니다.

아래와 같이 기초적인 디자인을 끝냅니다.

 

 

2) Python 코드로 변환

QT Deginer으로 대략적인 디자인을 완성하면,

C:\Python27\Lib\site-packages\PyQt4\uic 폴더의 pyuic.py 을 이용하여 파이썬 코드로 변환이 가능합니다.

ex) C:\Python27\Lib\site-packages\PyQt4\uic> python pyuic.py  -x message.ui  -o message.py

혹시 모듈 에러가 나시면, 파이썬과 PyQT가 64비트인지 확인하세요,

저의 경우 Python 2.7 - 32bit로 설치되어 있어서 오류가 났더랬습니다.

 

성공하면 아래와 같이 기본적인 코드가 생성되니 매우 편리합니다.

이제 필요한 부분을 수정하거나, 추가해주면 됩니다.

 

 

3) List +Model 구현

Xor 디코딩한 결과값을 Gui 로 넘겨서 Lit로 구현해야 하는데,

PyQT에서 좋은 예제 소스를 제공해주고 있습니다.

Window키를 눌러 시작메뉴에서 생성된 폴더를 살펴보면 Examples and Demos 를 발견할 수 있습니다.

 

 

Demo를 실행시키면 아래와 같이 샘플의 분류가 나옵니다. 제가 참고한 부분은 Item View 입니다.

 

각자가 필요한 부분이 있겠지만, 제가 리스트를 구현하는데 필요한 부분은

Basic Sort/Filter Model 이라는 샘플에서 찾을 수 있었습니다.

 

해당 샘플에서 리스트를 QStandardItemModel 모델을 이용하여 구현하였는데,

많은 예제 소스들이 트리구조가 없어도 Qtree를 이용한 부분이 의아하긴 했지만, 완성된 소스가 유용했습니다. 

아래의 레퍼런스를 참고하여 리스트 Row 값 추가, 삭제, 초기화 등을 구현했습니다.

URL : file:///C:/Python27/Lib/site-packages/PyQt4/doc/html/qstandarditemmodel.html

 

4) Xor 연산

현재 구현하고 있는 탭의 가장 중요한 기능입니다. 바로 Xor 연산이죠.

처음에는 아래와 같이 했더니, XOR Key 값의 범위가 1byte(0~255) 까지만 연산이 되더군요

  for i in range(0, len(text)):     

     result = ord( text[i] ) ^ key  

그래서 쉬프트연산자 [ >> ] 를 이용하여 Key 값을 Low, High로 나누어

범위를 2byte(0x00 ~ 0xFFFF) 까지 확장했습니다.

 keyLow = 0x00FF & key           

 keyHigh = (0xFF00 & key) >> 8

보통 XOR 디코딩이 필요할 경우, Key값이 그리 크지 않은 경우가 많으니 어느정도 커버가 될겁니다.

  result = ord( text[i] )     ^  key_low  

  result = ord( text[i+1] ) ^  key_high 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 마무리

------------------------------------------------------------------------------------------------------------------------------------------ 

 

Ver 1.0

일단 지정된 범위까지 Xor 디코딩을 해주는 부분과, ASCII + Unicode를 모두 표현해주는 기능까지는 완성됐습니다.

ASCII 값의 범위(0~127)가 넘어가는 경우에는 그냥 공백으로 나오길래

Hex 값을 보여주는 툴들을 참고하여 "." 으로 대체했습니다.

 

지금은 Red_Seek 이 바쁘지만,

나중에 시간이 생기면 기능도 보완하고, 새로운 기능은 탭을 늘려나가면서 추가하면 좋을 것 같습니다.

만드는게 생각보다 간단해서 초보인데도 불구하고 2~3일 정도 노력하니 콘솔창을 탈출하는게 성공했네요!

탭을 늘리거나 다른 툴을 제작할때도 좋은 발판이 될 것 같습니다.

 

Ver 1.1

BASE64 인코딩이나 디코딩이 여러번 중첩되는 경우

놓치는 부분을 최소화 하기 위해 , XOR 연산처럼 횟수를 지정하여 볼 수 있는 탭을 추가했습니다.

 

posted by Red_Message