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



목요일, 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 을 공부하시는 분들께 조금이나마 도움이 되었으면 좋겠네요~~ :)





목요일, 3월 30, 2017



믿고 듣는 아이유~ :D

이번 노래도 제대로 취향저격이네요~ (*-_-*)

음원차트를 휩쓸고 있는 중... ㅋ








아이유(IU) - 밤편지

이 밤 그날의 반딧불을
당신의 창 가까이 보낼게요
음 사랑한다는 말이에요

나 우리의 첫 입맞춤을 떠올려
그럼 언제든 눈을 감고
음 가장 먼 곳으로 가요

난 파도가 머물던
모래 위에 적힌 글씨처럼
그대가 멀리
사라져 버릴 것 같아
늘 그리워 그리워

여기 내 마음속에
모든 말을
다 꺼내어 줄 순 없지만
사랑한다는 말이에요

어떻게 나에게
그대란 행운이 온 걸까
지금 우리 함께 있다면
아 얼마나 좋을까요

난 파도가 머물던
모래 위에 적힌 글씨처럼
그대가 멀리
사라져 버릴 것 같아
또 그리워 더 그리워

나의 일기장 안에
모든 말을
다 꺼내어 줄 순 없지만
사랑한다는 말

이 밤 그날의 반딧불을
당신의
창 가까이 띄울게요
음 좋은 꿈 이길 바라요



일요일, 3월 26, 2017



일전에 Visual Studio 에서 Intel Pin 프로젝트를 설정하는 방법을 올린 적이 있습니다.

이번에는 응용차원에서 Pin 을 활용하는 방법을 올려봅니다. @_@

주 업무분야가 '게임보안' 인만큼 '게임 해킹툴 분석' 측면으로 접근해봤습니다... ^^;;

Pin 을 이용한 메모리 조작 분석


캐릭터의 공격력을 높이기 위해 '공격 데미지 값' 이라는 데이터를 조작하거나...

캐릭터가 받는 데미지를 없애기 위해 '데미지 처리 로직' 이라는 코드를 조작하거나...

게임 해킹툴이 게임 치팅을 위해 가장 많이 사용하는 방식 중 하나가 '메모리 조작' 입니다.


'메모리 조작' 은 조작하는 방식에 따라 아래와 같이 크게 두 종류로 나눌 수 있습니다.

- 게임 프로세스 외부의 다른 프로세스에서 WriteProcessMemory 로 조작.

- 게임 프로세스 내부에 DLL 을 인젝션 시켜서 직접 값을 조작.


여기서는 DLL 을 인젝션 시켜서 직접 값을 조작하는 방식을 대상으로

Pin 을 활용해보도록 하겠습니다.

테스트 편의를 위해 Sample.exe 와 SampleDll.dll 을 간단하게 구현했습니다.

[ Sample.zip 다운로드 ]


- Sample.exe : 게임 프로세스

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

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

DLL 이 로드된 후, 'F1' 키를 누르면~ SampleDll.dll 이 Sample.exe 의 메모리를 조작합니다.
 
Sample.exe 실행

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

게임 해킹툴이 메모리 조작 시 자주 사용하는 형태입니다.

SampleDll.dll 의 메모리 조작 코드 (소스코드)
 참고로 hModule 은 Sample.exe 프로세스의 베이스 주소입니다.
 
SampleDll.dll 의 메모리 조작 코드 (디스어셈블 코드)
우리의 목표는 SampleDll.dll 에서 Sample.exe 의 메모리를 0x90 으로 조작하는 노란 박스의 코드를...

Pin 을 이용해서 찾아내는 겁니다. :)

핵심 API 는 "INS_MemoryOperandIsWritten" 입니다.

메모리 쓰기가 발생하는 경우 이 함수의 리턴값이 TRUE 가 됩니다.

"MOV", "AND", "SUB" 등의 명령으로 메모리 주소에 값이 써지는 경우는 물론...

"PUSH", "CALL" 등의 명령으로 스택 메모리에 값이 써지는 경우도 포함됩니다. @_@;;;

이 함수를 잘 이용하면 DLL 에서 게임 프로세스의 메모리를 조작하는 코드를 찾을 수 있습니다.

아래는 Pin Tool 예제 코드입니다


// MemTrace.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_MemWrite(VOID *ip, string &MemWrite, VOID *addr)
{
    UINT32 target = UINT32(addr);

    if ((target >= SampleBaseAddr) && 
        (target < (SampleBaseAddr + SampleMappedSize))) {
        TraceLog << MemWrite << endl;
    }
}

VOID Instruction(INS ins, VOID *v)
{
    ADDRINT Address = INS_Address(ins);

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

        UINT32 memOperands = INS_MemoryOperandCount(ins);

        for (UINT32 memOp = 0; memOp < memOperands; memOp++) {
            if (INS_MemoryOperandIsWritten(ins, memOp)) {
                string MemWrite = "- eip: " + hexstr(Address) + 
                    "   [WriteMem]  " + INS_Disassemble(ins);

                INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)Log_MemWrite,
                    IARG_INST_PTR, 
                    IARG_PTR, new string(MemWrite), 
                    IARG_MEMORYOP_EA, memOp, 
                    IARG_END);
            }
        }
    }
}

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

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

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

    IMG_AddInstrumentFunction(ImageLoad, NULL);
    INS_AddInstrumentFunction(Instruction, NULL);

    PIN_AddFiniFunction(Fini, NULL);

    PIN_StartProgram();

    return 0;
}

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

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

MemTrace.dll 에서 남긴 로그

SampleDll.dll 에서 메모리 조작을 하는 코드가 깔끔하게(?) 로그 파일에 기록되었습니다~ :)


마치며

일반적으로 Pin 으로 프로그램을 실행시키면 그냥 실행시키는 것보다 속도가 느립니다.

게다가 Instrumentation 하는 범위가 넓을 수록... 로깅 위치가 많을 수록...

엄~~~청나게 느려집니다. -_-;;;;;;

Instrumentation 범위 조절과 로깅 위치 조절만 하더라도 실행 속도를 올릴 수 있으니...

적절하게 필터링을 해서 쓰는 걸로~ :)


5년 전에 회사에서 이것저것 시도하다 한계에 부딪혔던걸...

지금 올리네요... -_-;;;;;




카테고리

가장 많이 본 글

통계

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