Total

    [C/C++]NULL, NUL, 0, \0 의 차이점을 알아보자.

    코드를 짜다보니 NULL , NUL, 0, \0 이것들의 차이점이 문득 궁금해졌습니다. 인터넷을 뒤져보니 이미 많은분들이 이것들의 차이점에 대해 적어 놓으셨더라구요. 헷갈릴 수있는 것들이기에 자세하게 정리해 보았습니다. NULL 혹은 0 먼저 NULL 부터 알아보겠습니다. NULL은 헤더파일에 정의된 매크로로 null pointer constant입니다. 컴파일러에 의해 (void*)0 으로 정의되어집니다. 일반적으로 C언어에서 stdio.h 파일, C++에서 iostream 헤더파일을 include 시에 사용할 수 있습니다. NULL은 0 주소를 의미하기 때문에 포인터 변수를 초기화 시에 사용합니다. 예를들어 .. char *ptr = NULL 과 char *ptr = 0 은 같은 의미라 볼 수 있습니..

    [PE파일] 특정 PE파일로부터 Export Table 주소를 구해보자.

    ★ windows 7 32bit 환경에서 진행하였습니다. 간단한 어셈블리 프로그램으로~ 특정 PE 파일로부터 Export Table 주소를 구해봅시다. Export Table 주소를 구하고, 더 나아가서 Export 하는 함수들의 주소까지 구해볼수 있겠죠. kernel32.dll 를 이용해봅시다. PEView를 이용하면 쉽겠지만 동적으로 Export Table 내의 함수들의 주소를 받아오기 위해서 간단한 어셈블리 프로그램을 짜보도록 하겠습니다. 먼저 kernel32.dll 의 base 주소를 알아야겠죠? mov eax, fs:[eax+0x30] // PEB 의 주소 FS = TEB을 가리키고있음 mov eax, [eax+0xc0] // PEB_LDR_DATA mov eax, [eax+0x14] // .e..

    [어셈블리어] FS Register 를 자세하게 알아봅시다.

    유저모드의 FS레지스터는 현재 프로세서의 TEB(Thread Environment Block)을 가리키고 있습니다. 이는 처음 한 프로세스 내의 처음 생성된 쓰레드부터 0x7ffde000으로 부터 쓰레드가 생성될때마다 4KB씩 감소면서 생성됩니다. 첫번째 쓰레드 : 0x7ffde000 두번째 쓰레드 : 0x7ffdd000 세번째 쓰레드 : 0x7ffdc000 .... 참고로 커널 모드의 프로세스에서는 FS 레지스터는 일반적으로 KPCR(Kernel Process Control Region)이라는 곳을 지칭하고 있는데 이는 XP 같은 경우 0xffdf0000 이라는 친숙한 주소의 값입니다. 물론 OS마다 다르지만 FS의 GDT 정보를 확인하여 KPCR을 찾으시면 되겠습니다. 출처: http://passke..

    [어셈블리어] 헷갈리는 것들 ! 정리

    LODS, LODSB, LODSW, LODSD(Load String Byte, Word, DWord) - ESI가 가르키는 곳에서 지정한 크기(Byte, Word, DWord) 만큼 읽어와 EAX에 복사한다. ESI는 복사한만큼 이동한다. TEST , - 이 연산은 대부분이 과 가 같게 설정된다. 예를들면 TEST EAX, EAX. 이 연산은 논리회로의 AND연산을 수행하지만 결과값을 저장하지 않는다. 단지 EAX=0일경우 ZF=1이 되고 EAX!=0일경우 ZF=0이 된다. 그리고 OF, CF는 0이된다. PUSHAD EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터의 값을 스택에 PUSH한다.저장순서는 EAX > ECX > EDX > EBX > ESP > EBP > ESI ..

    [C/C++] 미리 컴파일된헤더(Precompiled Header)? 컴파일 시간을 줄여봅시다!

    미리컴파일된 헤더(Precomplied Header) 란? 말그대로 헤더를 미리 컴파일 해두는겁니다 . 프로그램을 만들다보면 어쩔수없이 프로그램의 몸집은 점점 불어가죠 프로그램이 커지면 전처리기가 컴파일해야될 헤더도 엄청나게 많아질텐데요 컴파일 시간이 늘어나는건 당연하겠죠? 이 컴파일 시간을 효과적으로 줄여줄 수 있는 방법을 소개합니다. 조금더 자세하게 말씀드리면 .. 미리컴파일된 헤더(Precompiled Header) 는 자주변경되지 않는 긴소스를 미리 컴파일하여 컴파일결과를 별도의 파일에 저장하여, 다시 똑같은 헤더를 컴파일시 해당파일을 처음부터 컴파일하지않고 미리컴파일된 헤더 파일을 사용해 컴파일 속도를 월등히 향상시켜줍니다. 예를들면 windows.h 같은 덩치가 매우큰 녀석들을 사용할때 말이죠..

    [C/C++] main은 알겠는데.. wmain, _tmain 는 무엇일까요?

    Main 이란? int main(int argc, char* argv[]) -세번째 입력 인수가 있긴하지만 잘안쓰죠main은 무엇일까요? 다들 아시다시피 main 이라는 특수함수는 모든 c및 c++ 프로그램이 실행이 시작되는 지점입니다. int wmain(int argc, wchar_t* argv[])그럼 wmain은 무엇일까요? msdn에 따르면 "유니코드 프로그래밍모델을 따르는 코드를 작성하는경우 main 의 와이드 문자버전인 wmain을 사용할 수 있습니다" 라고 합니다. int _tmain(int argc, _TCHAR *argv[]) _tmain은 _UNICODE가 정의되지 않은 한 main으로 확인됩니다. _UNICODE가 정의된 경우에는 _tmain이 wmain으로 확인됩니다. 유니코드가 정..

    [C/C++] 동적 메모리 할당 malloc(), calloc(), realloc(), free()

    메모리에서 스택영역, 데이터영역, 힙영역 이런 말을 한번쯤은 들어 보셨을겁니다. 이 메모리들은 각각 특성이 있습니다. 일단 메모리 그림을 한번 보고 가시죠. 메모리가 이렇게 생겼구나.. 정도만 알고 가시면됩니다 ㅇㅅㅇ 정적메모리는 보통 스택영역, 데이터영역을 의미합니다. 메모리 크기는 컴파일할 때 결정되며 실행 도중에 해제되지 않고, 프로그램이 종료할 때 알아서 운영 체제가 회수합니다. C 언어에서 정적 할당된 메모리는 스택에 위치하기 때문에 할당 받을 수 있는 메모리에 제약을 받습니다. 말그대로 컴파일 시 결정된 크기만큼 그 딱그만큼만 쓸 수 있다는거죠. 실행중에 변경이 불가능합니다. 그와 반대로 동적메모리는 프로그램 실행 시간(런타임) 중에 프로그래머가 동적으로 메모리를 할당 할 수 있습니다. 한마디..

    [BOF] strcpy 와 strncpy 함수의 취약점

    취약점을 공부하시는 분들 대다수는 Memory Corruption 취약점에대해 잘 알고 계실것입니다. 길이(메모리 경계) 를 검사하지 않는 함수는 buffer overflow에 취약하여 Exploit당하기 쉽죠.- BOF에 취약한 대표적인 함수 : strcpy , strcmp, gets, scanf, strcat, getwd, sprintf 등등 그래서 보통은 strncpy 같은 길이를 검사하는 함수를 쓰게되는데 .. 이함수도 bof에 안전한건 절대 아니였다. 나도 항상 길이를 검사하면 괜찮겠지 했는데 그게아니였다 ㅇㅅㅇ;; 먼저 strcpy , strncpy 함수부터 알아봅시다. strcpy : NULL문자를 만나기 전까지의 문자열을 복사합니다.strncpy : 문자열을 지정된 길이만큼 복사합니다. s..

    [C/C++]공유메모리 함수 shmget(),shmat(),shmdt(),shmctl()

    해커스쿨의 ftz 워게임을 풀던중 공유메모리에 관한 문제가있었다.. 처음봤을때는 이게뭐지... 하다가 키워드 중심으로 검색을 해봤더니 공유 메모리를 생성하고 관리하는 함수들이 있었다. 넘나 어려운것 ㅡ.ㅡ;; 공유메모리란 한마디로 여러 프로세서들이 함께 사용하는 메모리 이다. 프로세스들이 메모리 자체를 공유하게 됨으로써 데이터복사와 같은 오버헤드가 발생하지않아서 속도가 빠르다고한다. 이함수들을 쓰기위해서는 sys/ipc.h , sys/shm.h 두 헤더파일을 include 해준다. 동작방식은 간단하더라.. shmget() 으로 공유메모리를 구별하는 key값과 크기, 옵션을 부여하고 공유메모리를 생성한다. shmat() 으로 프로세스에 메모리 세그먼트를 붙이고 , shmctl() 함수로 공유메모리를 제어한..

    OllyDbg를 설치해보자 !

    리버서가 되기위한 첫걸음! OllyDbg 디버거를 설치해봅시다. 올리디버거 공식 홈페이지 공식 홈페이지로 이동하시면 이런 메인화면이 뜨게됩니다. 중앙의 VERSION 2.01을 클릭해주세요. OllyDbg를 눌러주시면 다운로드가 시작됩니다. 압축을 풀어주시면 이상한 물감을 쏟은거같은 아이콘이하나 보입니다. Ollydbg.exe 를 실행해줍시다. 설치완료!

    리버싱(Reverse Engineering) 이란 무엇일까요?

    Reverse Engineering 이란? 말그대로 역공학(逆工學). 즉 장치 또는 시스템의 기술적인 원리를 그 구조분석을 통해 역으로 발견하는 과정이에요. 이 리버싱 기술을 통해서 프로그램 내부의 동작원리를 들여다 볼 수 있답니다. 이 과정을 통해서 개발단계에서 발견하지 못한 버그나 취약점들을 파악할 수 있고, 그 취약점들을 직접 패치할 수 있답니다.여기서 하나 ! 패치랑 크랙 두 단어를 구분을 못하시는 분들이 있던데 이 두 단어의 차이점은 중요하므로 짚고 넘어갈게요~ 패치(patch) 이란?프로그램의 파일 혹은 실행중인 프로세스 메모리의 내용을 변경하는 작업을 패치라고 해요. 게임을 하시다보면 "패치한다"는 말을 들어보신적이 있을거에요. 크랙(crack) 이란?크랙은 패치와 같은 개념이지만 패치를하는..