[ 리버싱 / 프로그래밍 / 음악 / 게임 / 그 외... ]



목요일, 1월 11, 2018



* KB4074906 업데이트에서 해결됨
   - https://support.microsoft.com/ko-kr/help/4074906/typeinitializationexception-or-fileformatexception-error-in-wpf-apps-t


갑자기 회사 PC 의 Visual Studio 시작 페이지 일부 글자가 깨지는 현상이 발생했습니다.


Visual Studio 2015 한글 깨짐

Visual Studio 2013 한글 깨짐

처음에는 설치된 폰트 문제인가 생각했는데...

폰트 문제라면 글자 전체가 깨져야 될 것 같아서 폰트는 패스 ~


이 현상이 발생한 PC들 공통점을 찾다가 비슷한 시점에 '윈도우 업데이트' 를 한게 떠올라서

'업데이트 내역' 을 보던 중... ".NET Framework 4.7.1" 이 눈에 확~ 들어오더군요. +_+

다른 것들은 보안 업데이트였고... 보안 업데이트가 글자 출력에 영향을 줄 것 같지는 않고...

혹시나 해서 ".NET Framework 4.7.1" 을 제거해보니 글자가 정상적으로 출력되더군요.


글자가 전체 다 깨지는 것도 아니고... 그렇다고 같은 글자가 깨지는 것도 아니고...

일부만 저렇게 깨지는 이유는 아직도 모르겠네요... @_@ ;;;...

그래도 실제 개발 업무에는 지장이 없어서 그러려니....;;;


일단 '윈도우7' 에서만 확인했고 다른 윈도우 버전은 잘 모르겠습니다... ^^;;;;

혹시라도 Visual Studio 나 다른 프로그램 실행했는데 잘 나오던 글자가 갑자기 깨진다면...

.NET Framework 4.7.1 이 원인일 수도 있다는 걸... 살포시 공유해봅니다.





목요일, 8월 10, 2017



업무 특성상(?) Hex 값을 다루는 경우가 많은데...

이번에 파이썬용 Hex Dump 함수를 간단하게 만들어 봤습니다.

앞으로 파이썬으로 작업하다가 Hex 값이 필요할 땐 이 함수를 우려먹는 걸로... :)


def print_hex_dump(buffer, start_offset=0):
    print('-' * 79)

    offset = 0
    while offset < len(buffer):
        # Offset
        print(' %08X : ' % (offset + start_offset), end='')

        if ((len(buffer) - offset) < 0x10) is True:
            data = buffer[offset:]
        else:
            data = buffer[offset:offset + 0x10]

        # Hex Dump
        for hex_dump in data:
            print("%02X" % hex_dump, end=' ')

        if ((len(buffer) - offset) < 0x10) is True:
            print(' ' * (3 * (0x10 - len(data))), end='')

        print('  ', end='')

        # Ascii
        for ascii_dump in data:
            if ((ascii_dump >= 0x20) is True) and ((ascii_dump <= 0x7E) is True):
                print(chr(ascii_dump), end='')
            else:
                print('.', end='')

        offset = offset + len(data)
        print('')

    print('-' * 79)


사용법은 간단합니다~ :)

print_hex_dump(mft_buf, mft_offset)


요런 식으로 내용을 보고 싶은 버퍼와 시작 오프셋 값을 지정해주면~



요렇게 딱~~

시작 오프셋을 지정하지 않으면 기본적으로 '0' 으로 됩니다.

별거아닌데 쓸데없이 만족스럽네요.. :)




목요일, 7월 27, 2017



얼마 전 종영된 '프로듀스 101 시즌2' 에 멤버 4명이 나와서 화제가 된 그룹 ~

'뉴이스트' 의 '여보세요' 를 살포시 포스팅해봅니다.

프로듀스 101 방송이 끝난 후 뉴이스트 노래들이 역주행을 했는데

그 중 가장 순위가 높은 곡(멜론 기준)이기도 하고...

개인적으로 뉴이스트 노래 중 가장 좋아하는 곡이기도 하구요 ~ :)


   


뉴이스트(NU'EST) - 여보세요

여보세요
밥은 먹었니
어디서 뭐 하는지
걱정되니까
Tell me baby where you at
여보세요
Call me baby I be there
Wherever you are I be there
여보세요
Pick up the phone girl
Cuz I gotta be there

차가 막히는지 늦을 건가 봐 (급한 맘에)
배터리는 또 깜빡 하셨나 봐 (나는 또)
왠지 비가 올 것 같애 고민을 하다가 (너를 좀 더)
빨리 보고 싶은 맘에 일찍 데릴러 나가

깜짝 놀라겠지 날 보면 (좋아하겠지)
길이 엇갈리지 않게 더 (달려야겠지)
저 멀리 니 모습 보이는데 왜 난
전활 걸어 한다는 말이 결국엔

여보세요 밥은 먹었니
어디서 뭘 하는지 걱정되니까
여보세요 왜 아무 말 못하니
여보세요 여보세요

널 데릴러 왔어 비가 올까 봐
혼자 쓸쓸히 빗속을 걸을까 봐
집 앞이야 니가 보여 누구랑 있나 봐
솔직히 말 못했어 그럼 널 잃을까 봐

나도 알아 내 행동 비겁해
비겁하다 놀려도 난 절대 못 가 더는
이런 내 맘 알까 너는
네게 가는 길이 내게 왜 지옥행
같이 느껴져야 되는건지
이건 말이 안돼
니 외로움 달래 준건 난데
어서 말해 제발 아무 사이 아니라고
왜 난 안돼 한 번 해봐 아무 말이라도

지금 너 거기서 뭐하니
지금 널 멀리서 멍하니
바라보는 내가 느껴지지 않니
하고픈 말은 다 내일 해
미안하단 말도 내일 해
자꾸 어딜 봐 바로 여기가 니가 있어야 할 자린데

여보세요 밥은 먹었니
어디서 뭘 하는지 걱정되니까
여보세요 왜 아무 말 못하니
여보세요 여보세요

널 보고 싶었어 비가 오니까 (비가 내리니까)
너와 걷던 거리를 걷다 보니까 (죽겠으니까)
집 앞이야 보고 싶어 너는 아닌가 봐 (보고싶어)
솔직히 미치겠어 너 아님 안되나 봐

Baby I can’t let you go (밥은 먹었니)
I only think about you girl
What would I be without you girl (어디서 뭐 하는지)
Don’t tell me lies, Don’t say goodbye
I just wanna let you know (왜 아무말 못하니)
I only think about you girl
What would I be without you girl
What would I be without you girl

여보세요




일요일, 5월 28, 2017



최근에 우연히 듣게된 노래인데 2014년에 발매된 곡이네요...

이런 노래를 지금껏 몰랐다니... @_@

제대로 취향저격 당해서 무한재생 중입니다...







마크툽(MAKTUB), 구윤회 - Marry Me

비내리는 날엔
우산이 되주고
어둠이 오면 빛이 되줄게

추운 겨울이면
난로가 되주고
더운 날엔 바람이 될게

잠이 들 때까지 머릴 만져줄게
니가 두려울 때마다 꼭 옆에 있어줄게

갑작스런 맘에 문득 떠나고 싶으면
내일 무슨 일이 있어도 함께 떠나줄게

Marry Me
내 손 잡아줄래요
Marry Me
나와 평생 함께 할래요
남은 나의 모든 삶.
오직 그대 남자로 살고 싶어요
Marry Me darling
나와 결혼해줄래요

순간뿐이 아냐 많이 생각했어
헌데 내 사랑을 줄 수 있는 여잔 너밖에 없어

차갑고 어두운 험하고 쓸쓸한 세상 속
평생의 동반자로 함께 걸어가고 싶어

Marry Me
내 손 잡아줄래요
Merry Me
나와 평생 함께 할래요
남은 나의 모든 삶.
오직 그대 남자로 살고 싶어요
Marry Me darling
나와 결혼해줄래요

내 안에 숨쉬는 아름 다운 그대
영원히 같은 꿈을 꾼다면 얼마나 좋을까
믿어요 Marry Me
그대와 함께 하는 매일이
내겐 천국이죠
나와 결혼해줄래요

비내리는 날엔
우산이 되주고
어둠이 오면 빛이 되줄게





일요일, 5월 14, 2017



전 세계적으로 "Wanna Cryptor" 랜섬웨어가 유행입니다 ;;;

이 랜섬웨어에 대한 정보는 안랩 ASEC 블로그의 내용을 참고하면 되겠습니다.

ASEC BLOG - SMB 취약점으로 전파되는 워너크립터(WannaCryptor) 랜섬웨어


KISA 에서도 랜섬웨어 예방 요령 공지를 하고 있습니다.

KISA보호나라 & KrCERT - SMB 취약점을 악용한 랜섬웨어 방지 대국민 행동 요령


KISA 에서 안내하는 내용은 다음과 같습니다.

------------------------------------------------------------------------
1. PC 를 켜기전 네트워크 단절
  - 랜선 뽑기, 와이파이 끄기

2. 감염 경로 차단
 1) 제어판 -> ( '시스템 및 보안' ) -> Windows 방화벽
 2) 고급 설정 -> 인바운드 규칙 -> 새 규칙
 3) 포트 -> 'TCP' 선택, '특정 로컬 포트' : 139, 445 -> '연결 차단' 선택
 4) '도메인', '개인', '공용' 체크
 5) 이름 "SMB 차단" 으로 일단 설정

3. 인터넷 재연결후 보안 업데이트
  - 윈도우 보안 패치
  - 백신 프로그램 업데이트
------------------------------------------------------------------------

PC 를 잘 다루는 분이 아니라면 ~

2번 항목은 꽤나 번거롭고 어렵게 느껴질 수 있겠다 싶더군요...;;;

그래서 뚝딱뚝딱~ 툴을 만들어 봤습니다.


[ 윈도우 방화벽 SMB 차단 룰 등록 & 삭제 도구 다운로드 ]

"SMB_Block_Rule.zip" 파일을 받아서 압축을 풀면 2개의 실행파일이 있습니다.

- Insert_SMB_Block_Rule.exe : 윈도우 방화벽에 SMB 관련 포트 차단 룰을 등록
- Delete_SMB_Block_Rule.exe : Insert 툴로 등록한 룰 삭제


사용법은 간단합니다.

네트워크 단절 상태를 만든 다음~

"Insert_SMB_Block_Rule.exe" 파일을 "관리자 권한"으로 실행합니다.

윈도우 방화벽을 사용중이라면 아래 화면처럼 "SMB 차단" 룰을 등록해 줍니다.

SMB 관련 포트 차단

이 상태에서 다시 인터넷 연결해서 윈도우 보안 업데이트 및 백신 업데이트를 진행하시면 됩니다 ~ :)

어렵지 않죠~? :)


나중에 다시 원상태로 돌리고 싶을 땐~

"Delete_SMB_Block_Rule.exe" 를 "관리자 권한"으로 실행하면~

위에서 등록했던 "SMB 차단" 룰을 삭제해줍니다.


일단 제가 사용중인 Windows 7 환경에서는 실행이 잘되어서 공유하는데...

다른 윈도우는 모르겠네요;;; 혹시라도 문제가 있으면 댓글 남겨주세요.




수요일, 4월 19, 2017



스타크래프트 클래식 1.18

"스타크래프트" 를 열렬히 좋아하는건 아니지만~

중학생 시절 PC방 가서 밤샘도 해보고, 모뎀으로 친구와 멀티플레이를 해본...

나름의 소소한 기억들이 있어서 그런지 "스타크래프트 리마스터" 의 소식이 반가웠습니다.


덕분에 클래식 버전은 1.18 로 업데이트 되면서 무료 배포로 딱~!!!

[ 스타크래프트 클래식 설치파일 다운로드 ]


추억의 화면

오랜만에 에피소드 진행하면서~ 스토리 다시 한 번 되새겨 봐야겠어요~ :)

리마스터가 나오면 이 모든걸 "한글"로 즐길 수가 있겠죠...? @_@

얼른 나오길....





화요일, 4월 11, 2017



지난번에 올린 Pin 을 이용한 메모리 조작 분석에 이어서 ~

이번에도 '게임 해킹툴 분석' 측면으로 접근해보려 합니다 :)

물론 응용하기에 따라 다른 쪽으로 이용도 가능하겠지만요.. ^^;;; 

Pin 을 이용한 비정상 함수 호출 분석


게임 내부의 함수들은 게임이 진행되는 중에 게임에서 호출하는 것이 일반적입니다.

FPS 게임에서 캐릭터가 죽는 경우를 예를 들어봅시다.

게임 내부적으로 무기 데미지 / 캐릭터 체력 / 착탄 부위 등 이것저것 계산을 해서

조건을 만족하는 경우에 게임이 Kill 함수를 호출하는 것이 정상적인 흐름입니다.


만약 이 Kill 함수가 게임이 아닌 다른 곳에서 호출되면 어떻게 될까요...? @_@

게임 진행과 상관없이 캐릭터가 죽겠죠... -_-;;;

이런 식으로 게임 해킹툴이 게임 내부 함수를 호출하는 것을 '비정상 함수 호출' 이라고 합니다.


Pin 을 이용해서 인젝션 된 DLL 이 대상 프로세스의 함수를 호출하는 것을 분석해봅시다.

테스트 샘플 구성은 '메모리 조작 분석' 과 동일합니다.

[ Sample.zip 다운로드 ]


- Sample.exe : 게임 프로세스

- SampleDll.dll : 게임 프로세스에 인젝션되는 게임 해킹툴

Sample.exe 가 실행될 때 SampleDll.dll 을 로드하고

DLL 이 로드된 후, 'F2' 키를 누르면~ SampleDll.dll 이 Sample.exe 의 함수를 호출합니다.

Sample.exe 실행

'F2' 키를 눌렀을 때... 실행되는 SampleDll.dll 의 코드는 아래와 같습니다.

SampleDll.dll 의 비정상 함수 호출 코드 (소스코드)
참고로 lpFunc 는 프로세스 베이스 주소 + 0x1000 의 값으로 고정해두었습니다.

이 코드를 디버거로 보면 아래와 같은 디스어셈블 코드가 나옵니다.

SampleDll.dll 의 비정상 함수 호출 코드 (디스어셈블 코드)
노란 박스 안의 저 "CALL" 명령으로 시작되는 코드를 Pin 으로 잡아내면 되겠죠~? :)


핵심 API 는 "INS_IsCall" 입니다.

CALL 명령이 나오면 이 API 의 리턴값이 TRUE 가 됩니다.

아래는 Pin tool 예제 코드입니다.


// CallTrace.cpp

#include "pin.H"

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

ofstream TraceLog;

UINT32 SampleBaseAddr = 0;
UINT32 SampleMappedSize = 0;
UINT32 DllBaseAddr = 0;
UINT32 DllMappedSize = 0;

//-------------------------------------------------------------------
INT32 Usage()
{

    return -1;
}

VOID Fini(INT32 code, VOID *v)
{
    TraceLog << endl << "#eof..." << endl;

    if (TraceLog.is_open()) TraceLog.close();
}

VOID ImageLoad(IMG img, VOID *v)
{
    // 메인 프로세스 : Sample.exe
    if (IMG_IsMainExecutable(img) == TRUE) {
        SampleBaseAddr = IMG_StartAddress(img);
        SampleMappedSize = IMG_SizeMapped(img);
        TraceLog << "* Process Name : " << IMG_Name(img) << endl;
        TraceLog << "  StartAddress : " << hexstr(SampleBaseAddr) 
            << ", MappedSize : " << hexstr(SampleMappedSize) << endl;
    }

    // SampleDll.dll
    if (IMG_Name(img).find("SampleDll.dll") != string::npos) {
        DllBaseAddr = IMG_StartAddress(img);
        DllMappedSize = IMG_SizeMapped(img);
        TraceLog << "* Sample Dll : " << IMG_Name(img) << endl;
        TraceLog << "  StartAddress : " << hexstr(DllBaseAddr)
            << ", MappedSize : " << hexstr(DllMappedSize) << endl;
    }
}

VOID Log_Call(string &CallFunc, ADDRINT target)
{
    if ((target >= SampleBaseAddr) && 
        (target < (SampleBaseAddr + SampleMappedSize))) {
        TraceLog << CallFunc + " [ Target : " + hexstr(target) + " ]" << endl;
    }
}

VOID Trace(TRACE trace, VOID *v)
{
    for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl))
    {
        INS tail = BBL_InsTail(bbl);
        ADDRINT Address = INS_Address(tail);

        if ((Address >= DllBaseAddr) &&
            (Address <= (DllBaseAddr + DllMappedSize))) {

            if (INS_IsCall(tail))
            {
                string CallFunc = "- eip: " + hexstr(Address) +
                    "   [CallFunc]  " + INS_Disassemble(tail);

                INS_InsertPredicatedCall(tail, IPOINT_BEFORE, AFUNPTR(Log_Call),
                    IARG_PTR, new string(CallFunc),
                    IARG_BRANCH_TARGET_ADDR,
                    IARG_END);
            }
        }
    }
}

//-------------------------------------------------------------------
int main(int argc, char *argv[])
{
    PIN_InitSymbols();

    if (PIN_Init(argc, argv)) return Usage();

    TraceLog.open("CallTrace_Log.txt", ofstream::out);
    TraceLog << "### Call Trace Log ###" << endl << endl;

    IMG_AddInstrumentFunction(ImageLoad, NULL);
    TRACE_AddInstrumentFunction(Trace, NULL);

    PIN_AddFiniFunction(Fini, NULL);

    PIN_StartProgram();

    return 0;
}


빌드해서 생성된 CallTrace.dll 을 이용해보면~

Sample.exe 실행 (with Pin - CallTrace.dll)

CallTrace.dll 에서 남긴 로그

이번에도 역시 SampleDll.dll 에서 비정상 함수 호출을 하는 코드가 로그 파일에 제대로 기록되었네요~ :)

마치며

Pin 을 이용해서 '메모리 조작 분석' 과 '비정상 함수 호출 분석' 을 분석하는 방법을 살펴봤는데요.

기능별로 설명(?)하기 위해 MemTrace / CallTrace 로 나눴지만...

잘 조립하면 하나의 DLL 로 합칠 수도 있습니다 :)


실제 게임에 적용하기 위해서는 이것저것 고려해야 될 사항들과 장벽들이 많지만... @_@;;

Pin 을 공부하시는 분들께 조금이나마 도움이 되었으면 좋겠네요~~ :)





카테고리

가장 많이 본 글

통계

Copyright © XeroNic(HS) BLOG | Powered by Blogger
Design by WP Lift | Blogger Template by NewBloggerThemes.com