본문 바로가기

reversing

코드에서 프로그램 과정 및 CPU [Reversing] 전처리기 : #include 같은 헤더 파일이나 메크로 파일을 만나게 되면 헤더파일을 삽입한다. 컴파일러 : 컴파일러는 3개의 단계로 나눠지며 'Front-end -> Middle-end -> Back-end'로 나눠진다. - Front-end 단계에서는 코드의 문법적 오류를 점검하고 중간언어(중간언어가 있으면 각 CPU 회사마다 언어에 대한 컴파일러를 갖고있지 않아도 된다.)를 생성한다. - Middle-end 단계에서는 변수의 정의와 선언이 잘 이루어졌는지 점검을 한다. 또한 코드에 대한 최적화를 어느정도 진행한다. - Back-end 단계에서는 최적화 단계를 한번더 진행하고 어셈블리어 코드를 생성한다. 어셈블러 : 어셈블러어로 만들어진 코드를 기계어로 바꿔준다. 어셈블리어와 기계어는 거의 대응하기 .. 더보기
범용레지스터 [Reversing] 범용레지스터에는 여러 종류가 있습니다. 산술논리 범용레지스터 : EAX, EBX, ECX, EDX 인덱스 주소 레지스터 : EDI, ESI 포인터 주소 레지스터 : EBP, ESP, EIP EAX : 산술 논리 연산값을 저장합니다. 'E'가 붙어있으므로 32bit 이고 AX는 16bit 입니다. 'E'는 'Extended'의 약자이며 2배 큰 크기를 의미합니다. EBX : 주소값을 저장하는 레지스터입니다. ECX : 반복 카운터 즉, LOOP 명령 사용시 ECX의 카운터 값이 -1 되며 반복되고 0이 되면 반복을 멈춥니다. EDX : EAX에서 연산후 넘치거나 나눗셈을 했을 때 몫과 나머지를 나눠야 할 때 EDX로 넘어가게 되고 FLAG 레지스터의 flag값을 확인하여 EAX의 연산값이 넘쳤는지 잦은 확.. 더보기
crack_me[1] 리버싱 [Reversing] Crack_me [1] 리버싱입니다. - x64dbg : 올리디버거와 같은 디버깅 툴입니다. 올리디버거는 업데이트가 끊킨듯 하여 x64dbg를 사용하였고 gui 환경도 더 깔끔한 편입니다. - PEview : 윈도우 PE 파일의 구조를 보기위한 툴입니다. 핵사값으로 PE 파일의 구조가 들어있습니다. - crack me [1]은 '컴퓨터에서 하드디스크를 CD-ROM으로 인식하게 만들어라' 라는 파일입니다. 먼저 해당 파일을 리버싱 하기위해 'x64dbg'에서 열어주고 'EntryPoint'를 찾아야 합니다. 'EntryPoint'는 프로그램의 시작위치로 디버거로 파일을 열었을 때 자동으로 중단점(Brack Point)를 잡아줄 때도 있지만 없을 때도 있습니다. 그럴 때 프로그램의 시작 위치를 찾는 여러 방.. 더보기
Flag 레지스터 [Reversing] Flag 레지스터는 test, cmp 명령을 통해 즉, 조건문을 통과한 후 조건에 따른 참 거짓을 보여주는 레지스터입니다. 단순히 맞다 틀리다가 아닌 '어떤 상황이다.'를 알려주기 때문에 Flag 레지스터를 확인하는 것은 중요합니다. - 각각의 Flag의 의미는 다음과 같다. ZF : 비교 연산과정 후 두 값이 같으면 즉, 두 값을 뺏을 때 0이 되면 같다는 의미로 '1'로 셋트 된다. PF : 비교 연산 후 하위 1byte 중 1bit가 짝수 이면 '1' 홀수 이면 '0'으로 셋트된다. AF : 산술 논리 연산 후 하위 3bit에 올림 또는 내림이 발생할 경우 '1'로 셋트된다. OF : 산술 논리 연산 후 결과값이 넘칠 경우 '1'로 셋트된다. SF : 비교 후 최상위 비트가 0이면 양수 1이면 음수.. 더보기