[목차]
1. 인코딩/디코딩에 대해서 (이론)
2. 인코딩/디코딩 프로그램 개발
* owasp-zap 툴 기능 확인
* hURL CMD 사용법 확인
* 참고 : apt-get install 오류 해결 방법
* enc.sh, dec.sh, edtools.sh 프로그램 만들기 (쉘 스크립트)
* edtools.py 프로그램 만들기 (python)
[인코딩/디코딩에 대해서]
인코딩 ≠ 암호화
[참고] 다음과 같은 사이트를 참고 하였다.
문자열 인코딩 종류(Character Encoding)
https://c0msherl0ck.github.io/character/post-character_encoding/
https://itstory.tk/entry/인코딩이란-ASCII-URL-HTML-Base64-MS-Script-인코딩
■ #인코딩(encoding)/디코딩(decoding)
정보의 형태나 형식을 변환하는 처리에 대해 표준화하고
보안, 처리 속도 향상, 저장 공간 절약 등의 목적으로 사용한다.
(출처:https://freestrokes.tistory.com/71)
내용에는 변화가 없다.
암호화로는 사용할 수 없다.
■ #문자열 인코딩/디코딩
인코딩(encoding) : 문자 코드를 기준으로 문자를 코드로 변환하는 것
디코딩(decoding) : 코드를 문자로 변환하는 것
■ #인코딩/디코딩의 종류
ASCII Encoding(128개 문자, 영만 표현 가능)
ANSI Encoding(ASCII 확장, Code Page 추가, 다양한 언어 표현 가능)
* ISO 8859-1
* CP949
Unicode Encoding
* UTF-8
* UTF-16
URL Encoding
Base64 Encoding
HTML Encoding
MS Script Encoding
■ #ASCII 인코딩
ASCII (American Standard Code for Information Interchange) : 미국 정보교환 표준 코드
1Byte 중 7bit를 이용해서 0 ~ 127 까지 128개이 문자를 구성한 코드
128개의 문자는 영어 알파벳 대문자, 소문자, 보조문자, 제어문자로 구성
영문 알파벳을 사용하는 대표적인 문자 인코딩 방법
[참고] ASCII Table
(예) man ascii
■ #ISO 8859-1
국제표준화기구에서 정의한 확장 ASCII 이며 서유럽에서 일반적으로 사용하는 문자들을 포함. ‘ISO Latin 1’ 이라고도 함.
■ #CP949
마이크로소프트에서 정의한 한글 문자 집합. EUC-KR에서 지원되는 한글 2350자 외에 나머지 8822자가 추가되었으며 Win95 한글판에 탑재되어 배포됨.
(예) C:> chcp
C:> chcp 437
C:> chcp 949
■ #UTF-8
하나의 문자를 1~4바이트의 가변길이로 표현. 1바이트 영역은 ASCII코드와 하위 호환되며 ASCII코드의 128개 문자 집합은 UTF-8과 동일하게 호환됨. (현재 인터넷에서 가장 많이 쓰이는 인코딩이며 뛰어난 크로스플랫폼 호환성도 갖고 있음.)
(예) IE(iexplore.exe) > 도구모음 > 보기 > 인코딩
■ #URL Encoding
Percent(%) Encoding (URL에 문자를 표현)
■ #HTML 인코딩
문제가 있을만한 문자들을 인코딩하여 안전하게 HTML 문서와 함께 사용하기 위해 사용
XSS(Cross Site Scripting)의 대응방안으로 사용
(예)
----------------------
공백 ->
< -> <
> -> >
& -> &
' -> '
" -> "
----------------------
■ #Base64 인코딩
2진 데이터를 ASCII 형태의 텍스트로 표현 가능
웹 인증 중 기본인증에 사용
끝 부분의 Padding(==)으로 식별 가능
64개의 문자 사용 (영문 대, 소문자, 숫자 , + , / )
데이터를 6bit 단위로 표현
[참고] BASE64 Table
BASE64 인코딩 순서
(ㄱ) 아스키 테이블 맵핑
(ㄴ) 2진수 변환
(ㄷ) 6bit 단위로 분할
(ㄹ) 10진수 변환
(ㅁ) BASE64 테이블 맵핑
(ㅂ) 패딩연산( 총 비트수 % 3 => 0 : 없음 / 1 : = / 2 : == )
■ #MS Script
Microsoft 에서 제공하는 인코딩 기법으로 IE에서만 사용가능
IE는 MS Script Decoder 를 가지고 있음
<script language="Jscript.Encode"> 를 명시하여 IE에게 알려주어야 함
범용성이 뛰어나지 않아 거의 사용하지 않는다.
■ 인코딩과 암호화의 차이점
인코딩/디코딩 :
암호화/복호화 :
■ URL을 메모장에 복사할 때 깨지는 이유
URL의 문자열 인코딩은 Percent Encoding 인데 반해, 메모장의 문자열 인코딩은 ANSI Encoding(윈도우 처음 설치 시 언어를 한글로 선택하면 기본 인코딩 방식이 CP949로 설정된다.)으로, 문자열 인코딩이 다르기 때문이다.
[인코딩/디코딩 프로그램 개발]
■ 사용 시스템
kali
■ 인코딩/디코딩 하는 프로그램 만들자
base64 encode/decode
url encode/decode
ascii encode/decode
html encode/decode
java script encode/decode
■ hURL
hexadecimal & URL encoder + decoder
(참고) 인코딩 디코딩 사이트 목록
(참고) 웹 취약점 스캐너
* burpsuite
* paros (# apt-get -y install paros)
* owasp-zap (# apt-get -y install zaproxy)
1. owasp-zap 툴 기능 확인
owasp-zap(OWASP Zed Attack Proxy) 실행
# owasp-zap &
Tools > Encode/Decode/Hash 선택
2. hURL CMD 사용법 확인
# apt-get -y install hurl
# hURL --help
3. 참고
#리눅스 apt-get install 오류/에러 처리 방법
#오류 전문
[root@kali /python]# apt-get -y install hurl
#E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 64361 (apt-get) #N: Be aware that removing the lock file is not a solution and may break your system. #E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? |
#해결 방안
1) 구동중인 프로세스 모두 종료
# killall apt apt-get
2) 구동중인 프로세스가 없다면
문제의 디렉토리를 하나씩 직접 삭제
# rm /var/lib/apt/lists/lock
# rm /var/cache/apt/archives/lock
# rm /var/lib/dpkg/lock*
# dpkg --configure -a
# apt update
4. enc.sh, dec.sh, edtools.sh 프로그램 만들기 (쉘 스크립트)
# vi enc.sh
#!/bin/bash
if [ $# -le 0 ] ; then echo "$0 <string>" exit 1 fi
echo "========== URL encoding ===========" hURL -U "$@" echo; echo
echo "========== BASE64 encoding ============" hURL -B "$@" echo; echo
echo "========== HTML encoding =============" hURL -H "$@" echo; echo |
#vi dec.sh
#!/bin/bash
if [ $# -le 0 ] ; then echo "$0 <string>" exit 1 fi
echo "========== URL encoding ===========" hURL -u "$@" echo; echo
echo "========== BASE64 encoding ============" hURL -b "$@" echo; echo
echo "========== HTML encoding =============" hURL -h "$@" echo; echo |
# vi edtools.sh
#!/bin/bash
MENU() { echo "============================================" echo " 1) Encoding 2) Decoding 3) Quit " echo "============================================" }
while true do MENU echo -n "Input your string(ex: \"string\") : " read LINE echo -n "Enter your choice(1|2|3) : " read NUM
case $NUM in 1) ./enc.sh $LINE;; 2) ./dec.sh $LINE;; 3) break ;; *) echo "Error: Command not found." esac done |
프로그램 구동 화면
============================================ 1) Encoding 2) Decoding 3) Quit ============================================ Input your string(ex: "string") : "hello world" Enter your choice(1|2|3) : 1 ========== URL encoding ===========
Original :: "hello URL ENcoded :: %22hello
========== BASE64 encoding ============
Original :: "hello base64 ENcoded :: ImhlbGxv
========== HTML encoding =============
Original :: "hello HTML ENcoded :: "hello
============================================ 1) Encoding 2) Decoding 3) Quit ============================================ Input your string(ex: "string") : "hello%20world" Enter your choice(1|2|3) : 2 ========== URL encoding ===========
Original :: "hello%20world" URL DEcoded :: "hello world"
========== BASE64 encoding ============
Original string :: "hello%20world" base64 DEcoded string :: ��e�m0��]
========== HTML encoding =============
Original :: "hello%20world" HTML DEcoded :: "hello%20world"
============================================ 1) Encoding 2) Decoding 3) Quit ============================================ Input your string(ex: "string") : "aGVsbG8gd29ybGQ=" Enter your choice(1|2|3) : 2 ========== URL encoding ===========
Original :: "aGVsbG8gd29ybGQ=" URL DEcoded :: "aGVsbG8gd29ybGQ="
========== BASE64 encoding ============
Original string :: "aGVsbG8gd29ybGQ=" base64 DEcoded string :: hello world
========== HTML encoding =============
Original :: "aGVsbG8gd29ybGQ=" HTML DEcoded :: "aGVsbG8gd29ybGQ="
============================================ 1) Encoding 2) Decoding 3) Quit ============================================ Input your string(ex: "string") : "<hello world>" Enter your choice(1|2|3) : 2 ========== URL encoding ===========
Original :: "<hello URL DEcoded :: "<hello
========== BASE64 encoding ============
Original string :: "<hello base64 DEcoded string :: ��^�Z
========== HTML encoding =============
Original :: "<hello HTML DEcoded :: "<hello
============================================ 1) Encoding 2) Decoding 3) Quit ============================================ Input your string(ex: "string") : 3 Enter your choice(1|2|3) : 3 |
# vi edtools2.sh (개선된 프로그램)
#!/bin/bash
MENU() { echo "=======================================================" echo " 1)Encoding 2)Decoding 3)Input String 4)Quit " echo "=======================================================" }
InputString() { echo -n "Input your string(ex: \"string\") : " read LINE }
NUM=0 export LINE= while [ $NUM != 4 ] do echo MENU if [ x"${LINE}" == x ]; then InputString fi echo -n "Enter your choice(1 | 2 | 3 | 4) : " read NUM
case $NUM in 1) ./enc.sh "$LINE" ;; 2) ./dec.sh "$LINE" ;; 3) InputString ;; 4) break ;; *) echo "Error: Command not found." esac done |
(참고)
[root@kali /python]# LINE=A
[root@kali /python]# echo $LINE
A
[root@kali /python]# echo X$LINE
XA
# edtool1.sh
#!/bin/bash
Menu() {
cat << EOF
=============================================
1)Encoding 2)Decoding 3)Quit
=============================================
EOF
}
#입력값은 $1 $2, 출력은 echo
InputString() {
echo -n "Input your string(ex: \"string\") : "
read LINE #LINE이란 변수에 넣었다
}
ERR() {
echo "[ WARN ] Wrong Options: Please input 1|2|3"
}
while true
do
echo
Menu
echo -n "Enter your choice (1|2|3) : "
read NUM
# echo $NUM
# read
if [ X"${LINE}" == X ] ; then # LINE이란 변수에 내용이 없으면
InputString
#read
fi
case $NUM in
1) ./enc.sh "$LINE" ;;
2) ./dec.sh "$LINE" ;;
3) break ;;
*) ERR ;;
esac
done
최종 완성 버전
# edtool2.sh
#!/bin/bash
Menu() {
cat << EOF
=============================================
1)Encoding 2)Decoding 3)Quit
=============================================
EOF
}
InputNumber() {
echo -n "Enter your choice (1|2|3) : "
read NUM
}
InputString() {
echo -n "Input your string(ex: \"string\") : "
read LINE #LINE이란 변수에 넣었다
}
ERR() {
echo "[ WARN ] Wrong Options: Please input 1|2|3"
}
while true
do
echo
Menu
InputNumber
case $NUM in
1) InputString
if [ X"$LINE" == X ] ; then #라인 변수에 내용이 없으면 거짓.
# echo $LINE
# else
echo "[ ERROR ] Must put string. (ex: Hello World)" && continue
fi
./enc.sh "$LINE" ;;
2) InputString
if [ X"$LINE" == X ] ; then #라인 변수에 내용이 없으면 거짓.
# echo $LINE
# else
echo "[ ERROR ] Must put string. (ex: Hello World)" && continue
fi
./dec.sh "$LINE" ;;
3) break ;;
*) ERR ;;
esac
done
5. edtools.py 프로그램 만들기 (Python)
위 최종본을 토대로 동일한 프로그램을 파이썬으로 제작
edtool.py
import os
import sys
menu = """
======================================
1) Encoding 2) Decoding 3) Quit
======================================"""
def main():
while True:
mychoice = menu_and_choice()
if mychoice == '1':
mystring = input_str()
if mystring is None:
continue
else:
hurlcmd(mystring, mychoice)
elif mychoice == '2':
mystring = input_str()
if mystring is None:
continue
else:
hurlcmd(mystring, mychoice)
elif mychoice == '3':
break
else:
print('[ Error ]: Your choice must be (1|2|3).')
def hurlcmd(string, choice):
if choice == '1':
ed_lists = ["-U", "-B", "-H"]
elif choice == '2':
ed_lists = ["-u", '-b', '-h']
else:
sys.exit("[ ERROR]: Incorrect Number.")
for op in ed_lists:
print("="*40)
cmd = 'hURL %s \"%s\"' % (op, string)
retval = os.system(cmd)
if retval != 0:
sys.exit("[ ERROR ]: %s" % cmd)
print("=" * 40)
def input_str():
line = input('Input your string(ex: "string"): ')
if not line:
print('[ ERROR ]: Must be string. (ex: "hello")')
line = None
return line
def menu_and_choice():
print(menu)
choice = input('Enter you choice (1|2|3): ')
return choice
if __name__ == '__main__':
main()
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day86: 공개 키 암호2 (이론) (0) | 2021.01.08 |
---|---|
정보보안 과정 Day85-1 : 무선 WEP 패킷 분석 / 공개 키 암호 (0) | 2021.01.07 |
정보보안 과정 Day84 : 파일 암호화 프로그램 제작 (0) | 2021.01.06 |
정보보안 과정 Day 83 : 암복호화 파일저장 및 통신2 (0) | 2021.01.05 |
정보보안 과정 Day 82 : 암복호화 파일저장 및 통신1 (0) | 2021.01.04 |