별이의 IT이야기/파이썬 공부하기(초급)

파이썬을 이용한 문자열 인코딩 디코딩 응용 실습 (I)

별이세상 2020. 1. 15. 17:20
반응형

오랜만에 파이썬 강좌를 하려고 합니다.

최근에 모바일 보안 강의를 하고 이런 내용도 같이 공부하면 좋지 않을까 생각이 들기도하고

제가 만드는 과정들이 있어서 정리하는 차원에서 기록을 남겨 봅니다.

 

이글을 보시는 분들께 도움이 되었으면 하는 마음 으로 하나씩 수행하며, 정리를 해보았습니다.

시작하겠습니다.

보통의 경우 파이썬을 배울때 책을 사서 하나 하나씩 배웁니다.

다음과 같이 이렇게요.

a = 1
a 엔터
=> 1
b="새로운 보안세계에 오신것을 환영합니다."
b 엔터
새로운 보안세계에 오신것을 환영합니다.

이렇게 배우는것이 더 많은 도움이 되지만 요즘은 굉장히 기술이 빠른시대이죠.

그래서, 저는 그렇게 공부하면 재미가 없어서 진짜 필요한 부분만 찾아서 공부하는 스타일입니다.

다음과 같이 새로운 접근법을 소개시켜드리고자 합니다.

우선 제가 생각 한 부분은 공격관점에서 쓸수 있는 인코딩에 대해 정리해드리고자 합니다.

금일 정리할 내용은 특정 문자열이 이렇게 인코딩 되면 어떻게 변환이 되고

디코딩 되면 어떤식으로 변환되는지 살펴 보려고 합니다.

>>> a= u"새로운".encode("UTF-8")
>>> a
'\xec\x83\x88\xeb\xa1\x9c\xec\x9a\xb4'

=> 좀더 이해를 시켜드리기 위해 설명을 드리면 다음과 같습니다.
[해설] a라는 변수에 인코딩하여 UTF8인 HEX code로 변환하는 것입니다.
유니코드인 문자열("새로운") =>  \xec\x83\x88\xeb\xa1\x9c\xec\x9a\xb4 (hex코드로 변환됨)
* 주의 할점은 인코딩시에 꼭 문자열 앞단에 u를 꼭 넣으셔야 정상적으로 실행이 됩니다.
>>> b= u"AI 보안 세계에".encode("UTF-8")
>>> b
'AI \xeb\xb3\xb4\xec\x95\x88 \xec\x84\xb8\xea\xb3\x84\xec\x97\x90'

[해설] b라는 변수에 인코딩하여 UTF8인 HEX code로 변환하는 것입니다.
유니코드인 문자열("AI 보안 세계에") => AI \xeb\xb3\xb4\xec\x95\x88 \xec\x84\xb8\xea\xb3\x84\xec\x97\x90 (hex코드로 변환됨)
* 주의 할점은 인코딩시에 꼭 문자열 앞단에 u를 꼭 넣으셔야 정상적으로 실행이 됩니다.

>>> c= a= u"오신것을 환영합니다.".encode("UTF-8")
>>> c
'\xec\x98\xa4\xec\x8b\xa0\xea\xb2\x83\xec\x9d\x84 \xed\x99\x98\xec\x98\x81\xed\x95\xa9\xeb\x8b\x88\xeb\x8b\xa4.'

유니코드인 문자열("AI 보안 세계에") => AI \xeb\xb3\xb4\xec\x95\x88 \xec\x84\xb8\xea\xb3\x84\xec\x97\x90 (hex코드로 변환됨)
[해설] c라는 변수에 인코딩하여 UTF8인 HEX code로 변환하는 것입니다.
* 주의 할점은 인코딩시에 꼭 문자열 앞단에 u를 꼭 넣으셔야 정상적으로 실행이 됩니다.

>>> print = a+b+c
SyntaxError: invalid syntax

[해설] 잘못된 문법이라고 나오는 이유는 문자열의 내용이 있는 경우에는 " 가 있어야한다.
>>> print "a+b+c"
a+b+c

[해설] 정상적으로 a+b+c를 출력하였으나 문자인줄 알고 그냥 print 함수 안에 있는것을 바로 실행한 케이스이다.

>>> a=chr("\xec\x83\x88\xeb\xa1\x9c\xec\x9a\xb4")

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in 
    a=chr("\xec\x83\x88\xeb\xa1\x9c\xec\x9a\xb4")
TypeError: an integer is required

>>> a = chr(\xec\x83\x88\xeb\xa1\x9c\xec\x9a\xb4)
SyntaxError: unexpected character after line continuation character

[해설] "새로운에 대한 문자열을 알고 싶어서 수행 한 결과 타입에러와 문법구조상의 오류 메시지가 나온것을 확인하였음
.
>>> d = chr(0xec)
>>> e = chr(0x83)
>>> f = chr(0x88)
>>> print d+e+f

[해설] "새"를 하나씩 쪼개서 실행을 하면 "새" 라는 문자열을 볼수 있음
>>> print "\xec\x83\x88\xeb\xa1\x9c\xec\x9a\xb4"+"AI \xeb\xb3\xb4\xec\x95\x88 \xec\x84\xb8\xea\xb3\x84\xec\x97\x90" + "\xec\x98\xa4\xec\x8b\xa0\xea\xb2\x83\xec\x9d\x84 \xed\x99\x98\xec\x98\x81\xed\x95\xa9\xeb\x8b\x88\xeb\x8b\xa4."
새로운AI 보안 세계에오신것을 환영합니다.

[해설] 실제 인코딩되었던 헥사코드를 프린트하면 위의 내용과 같이 "새로운 AI보안 세계에 오신것을 환경합니다" 라는 문구가 나옴


이런식으로 변환하여 난독화된 악성코드를 뿌릴수 있다는것을 알아둘 필요가 있음

 

실제 수행했던 화면은 다음과 같습니다.

출처: 정훈보안연구소

 

실습을 하시면서 참고하시면 좋은 사이트를 공유 합니다.

https://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=0x

https://www.key-shortcut.com/en/writing-systems/%ED%95%9C%EA%B5%AD-korean-script/hangul-characters-2