Search
Duplicate

[12기][유니코드][박상준] 과제 제출합니다.

취약점 분석 트랙 박상준

문제

BOM 없이 마구 저장된 텍스트를 읽어보자.
context.enc
5.0KB

첨부

decoded.txt
4.3KB
현대 사회에서는 컴퓨터와 인터넷이 우리의 일상생활과 사회 전반에 깊은 영향을 미치고 있습니다. 그러나 이러한 기술적 발전은 동시에 새로운 위협을 야기하고 있는데, 그 중 하나가 악성코드입니다. 악성코드는 사이버 범죄자들이 시스템에 침투하거나 개인 정보를 탈취하는 등의 악의적인 목적으로 개발한 프로그램입니다. 이번 블로그에서는 악성코드의 종 류와 작동 원리, 그리고 대응 방안에 대해 살펴보겠습니다. ▶ 악성코드의 종류 - 바이러스 (Virus): 파일에 첨부되어 전파되며 다른 파일에 복제하여 실행될 때 컴퓨터 시스템을 감염시킵니다. - 웜 (Worm): 네트워크를 통해 자동으로 전파되는 악성코드로 네트워크의 취약점을 이용하여 시스템에 침투합니다. - 트로이목마 (Trojan horse): 유용한 기능을 가장한 악성 프로그램으로 사용자가 실행하는 순간 시스템에 침투하 여 제어권을 탈취하거나 정보를 수집합니다. - 랜섬웨어 (Ransomware): 파일을 암호화하고 사용자의 파일 또는 시스템에 대한 액세스를 차단한 후 금전적인 요구를 하는 악성코드입니다. - 스파이웨어 (Spyware): 사용자의 개인 정보를 수집하거나 시스템의 동작을 감시하는 악성 프로그램입니다. - 애드웨어 (Adware): 광고를 표시하거나 사용자의 검색 기록을 수집하는 악성 프로그램입니다. - 키포거 (Keylogger): 사용자의 키 입력을 기록하여 비밀번호나 금융 정보 등을 수집하는 악성코드입니다. - 봇넷 (Botnet): 여러 대의 컴퓨터를 제어하고 통제할 수 있는 악성코드의 그룹입니다. 주로 DDoS 공격에 사용됩 니다. - 루트킷 (Rootkit): 시스템 내에서 은밀하게 동작하여 감지되지 않도록 하는 악성코드입니다. - 스크립트 기반 악성코드 (Script-based malware): JavaScript, VBScript, PowerShell 등 스크립트 언어를 이용 하여 작성된 악성코드입니다. - 파일리스 맬웨어(Fileless Malware): 파일리스 맬웨어는 디스크에 파일을 작성하지 않고 시스템의 메모리에 직접 존재하여 작동하는 악성 소프트웨어입니다. 이는 탐지와 제거가 어려울 수 있습니다. ▶ 악성코드의 작동원리 - 침투: 악성코드는 다양한 수단으로 시스템에 침투합니다. 이메일 첨부 파일, 소프트웨어 다운로드, 피싱 등이 주요한 침투 경로입니다. - 복제와 전파: 악성코드는 시스템 내에서 자신을 복제하고 전파하는 기능을 가지고 있습니다. 이를 통해 다른 사용자나 시스템으로 악성코드를 전파할 수 있습니다. - 악의적인 행위: 악성코드는 다양한 악의적 행위를 수행합니다. 파일 손상, 개인 정보 탈취, 시스템 마비 등을 일으킬 수 있으며, 랜섬웨어의 경우 파일 암호화와 금전적 요구가 주요한 특징입니다. ▶ 악성코드에 대한 대응방안 - 보안 소프트웨어: 최신의 안티바이러스 및 방화벽 소프트웨어를 사용하여 악성코드를 탐지하고 차단할 수 있습 니다. - 업데이트: 운영 체제와 소프트웨어를 최신 버전으로 유지하여 악성코드에 대한 취약점을 최소화합니다. - 신뢰할 수 있는 소스: 소프트웨어 및 파일을 신뢰할 수 있는 웹 사이트나 공급자로부터 다운로드합니다. - 사용자 교육: 정기적인 보안 교육을 통해 사용자들에게 악성코드를 인식하고 대응하는 방법을 가르칩니다. - 백업: 중요한 파일을 정기적으로 백업하여 랜섬웨어 공격 시 데이터를 복구할 수 있도록 준비합니다. 악성코드는 현대 사회에서 심각한 보안 위협으로 작용하고 있습니다. 따라서 우리는 악성코드에 대한 이해와 대 응 방안을 갖추는 것이 중요합니다. 보안 소프트웨어의 사용, 시스템 및 소프트웨어 업데이트, 신뢰할 수 있는 소스와의 상호작용, 사용자 교육 및 파일 백업은 악성코드에 대항하기 위해 필수적인 요소입니다. 우리 모두가 안전한 디지털 환경을 만들기 위해 보안에 주의를 기울여야 합니다.
XML
복사

본문

소감

수업 시간에 배운 유니코드를 바로 적용해볼 수 있어서 유익했습니다.
이렇게 많은 인코딩/디코딩이 있는줄 몰랐는데 많은걸 배워갑니다.
인코딩/디코딩에서 Little Endian/BIg Endian이 있는걸 알게 되어 많이 얻었습니다.
수업시간에 말씀하신 것처럼 좀 더 실력있는 개발 실력을 갖기 위해서는 문자열을 자유자재로 다룰 수 있어야된다는 것이 과제를 하면서 확실히 와닿았습니다.
앞으로는 윈도우 프로그래밍 처럼 WCHAR MBS TCS 쓰는 환경에서도 부담감 없이 접근할 수 있게 된 것 같아 뿌듯합니다

solve.py

1.
인코딩 종류가 달라져도 결국엔 개행을 기준으로 문장을 해석하기 때문에 개행 단위로 파싱
2.
디코딩
→ 파싱된 개행 단위로 모든 디코딩 방식 적용해봄
3.
적당한 디코딩 방식 선택 :
→ 다양한 방식으로 디코딩한 문자열 중에서 특수문자를 제거하고 같은 이상한 한글이 포함되면 Except
4.
적당한 디코딩 방식 선택 - 2:
정상적인 문자열 → 특수 문자가 적음, 비정상적인 문자열 → 특수문자 많음. 특수문자를 제거했을 때 길이가 긴 것이 정상적인 문자열이고 정상적인 문자열이 나오는 디코딩 방식 선택.
5.
예외처리
→ 하지만 예외가 있었음. 개행단위로 Parsing 하는 과정에서 전의 \n의 널 바이트들이 들어가는 경우가 있었음. 그래서 예외적으로 idx 1번째 줄과 idx 20번째 줄은 오프셋을 직접 맞춰줘서 디코딩 진행함.
with open("./context.enc","rb") as f: data = f.readlines() with open("./context.enc","rb") as f: data2 = f.read() class Colors: BLACK = '\033[30m' RED = '\033[31m' GREEN = '\033[32m' YELLOW = '\033[33m' BLUE = '\033[34m' MAGENTA = '\033[35m' CYAN = '\033[36m' WHITE = '\033[37m' UNDERLINE = '\033[4m' RESET = '\033[0m' decoding_types = [ 'ascii', 'utf-7', 'utf-8', 'utf-16', 'utf-32', 'latin-1', 'cp1252', 'cp949', 'euc-kr', 'shift_jis', 'gb2312', 'big5', 'utf-16be', 'utf-32be', 'utf-32le', 'utf-8-sig' ] payload = "" import re def find_normal_chars(target): ret = None raw_ret = None max_length = -1 decoder = None black_list = "뒪뙆씠썾뼱궗슜옄쓽 쒖씤 젙대 닔묓븯곕굹 떆뒪뀥쓽 룞옉쓣 먯떆븯뒗 븙꽦 봽쒓렇옩엯땲떎뒝뒖뒳낱놄뢷댁븞 냼봽듃썾뼱 쒖떊쓽 븞떚붿씠윭뒪 솕 냼봽듃썾뼱 궗슜븯뿬 븙꽦붾뱶 깘븯 떒븷 닔 엳뒿땲떎" for cur_decoding in decoding_types: #print(data[11].decode(i,errors="ignore")) # https://codermun-log.tistory.com/148 filtered = re.sub('[^A-Za-z0-9가-힣\t\n ]', '', target.decode(cur_decoding,errors="ignore")) if len(filtered) > max_length and black_list not in filtered: max_length = len(filtered) ret = filtered decoder = cur_decoding else: continue if ret is None: print(Colors.RED + "SFFFFFFFFFFFFFFFFFFFFFFFUcked"+ Colors.RESET) return target.decode(decoder,errors="ignore"), decoder for idx in range(len(data)): if idx in [1,20]: if idx == 1: want = data2[0x37c:0x390+1] payload += want.decode("utf-16",errors="ignore") print(Colors.BLUE + str(idx)+" "+ "utf-16"+" "+Colors.RESET+want.decode("utf-16",errors="ignore")) elif idx==20: want = data[20][1:] print(Colors.BLUE + str(idx)+" "+ "utf-16"+" "+Colors.RESET+want.decode("utf-16",errors="ignore")) payload += want.decode("utf-16",errors="ignore") else: decoded_chars, decoder = find_normal_chars(data[idx]) payload += decoded_chars print(Colors.BLUE + str(idx)+" "+ decoder+" "+Colors.RESET+ decoded_chars)
Python
복사
이런식으로 4byte단위였다가 갑자기 1byte씩 빽빽하게 채워져서 디코딩해도 읽을 수 없는 문자가 나와서 오프셋을 잘 맞춰주고 디코딩해줬습니다.
→ idx 20번째 줄

Unicode 정리

ASCII → 영어 1byte, 한글 2byte
EUC-KR → 한글 문자 인코딩 방식, 한글과 ASCII문자 모두 포함해서 혼합해서 사용 가능함. but 다른 해외 문자들은 호환 안됨.
CP949 → Code Page 949, EUR-KR 의 확장 버전. EUR-KR보다 더 많은 문자를 지원함.
UNICODE → 국제 표준 문자 인코딩 방식. 바이트 단위로 UTF-8, UTF-16, UTF-32 가 있다.
BOM ( Byte Order Mark ) → 파일에 저장된 문자가 어떤 형식으로 저장되어 있는지 나타내는 매직값임.