[목차]

 

 

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에 문자를 표현)

(예)https://itstory.tk/entry/%EC%9D%B8%EC%BD%94%EB%94%A9%EC%9D%B4%EB%9E%80-ASCII-URL-HTML-Base64-MS-Script-%EC%9D%B8%EC%BD%94%EB%94%A9

 

 

 

■ #HTML 인코딩

문제가 있을만한 문자들을 인코딩하여 안전하게 HTML 문서와 함께 사용하기 위해 사용

XSS(Cross Site Scripting)의 대응방안으로 사용

(예)

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

공백  ->   

<      ->  &lt

>      ->  &gt

&      ->  &amp;

'        ->  &apos;

"        ->  &quot;

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

 

 

 

■ #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로 설정된다.)으로, 문자열 인코딩이 다르기 때문이다.

(예)https://itstory.tk/entry/%EC%9D%B8%EC%BD%94%EB%94%A9%EC%9D%B4%EB%9E%80-ASCII-URL-HTML-Base64-MS-Script-%EC%9D%B8%EC%BD%94%EB%94%A9

 

 

 

 


 

 

 

 

[인코딩/디코딩 프로그램 개발]

 

 

 

■ 사용 시스템

kali

 

 

■ 인코딩/디코딩 하는 프로그램 만들자

base64 encode/decode

url encode/decode

ascii encode/decode

html encode/decode

java script encode/decode

 

 

■ hURL

hexadecimal & URL encoder + decoder

 

 

(참고) 인코딩 디코딩 사이트 목록

https://chp747.tistory.com/40

 

 

(참고) 웹 취약점 스캐너

* 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()

 

 

728x90

+ Recent posts