분류 전체보기 289

어셈블리 - REP 명령어

REP 명령어는 REP뒤에 오는 스트링 명령을 CX 레지스터가 0이 될때까지 반복하는 명령이다. 한번 명령이 실행되면 CX 레지스터의 값은 1 감소한다. 예를 들어, REP MOVS byte ptr [edi], byte ptr [esi] 이런식으로 쓸 수 있다 중간에 STOS, MOVS, SCAS 가 올 수 있는데 각각 의미는 STOS : 크기에 따라 (AL/AH/AX/EAX)를 EDI가 가르키는 주소에 저장한다 MOVS : ESI, EDI 증가 SCAS : AX와 비교하여 같으면 아래로, 같지 않으면 계속 명령 실행

어셈블리어 - CALL / JMP / RET

ADD, SUB, INC 등의 보면 딱 알 수 있는 명령어에 대한 포스팅은 안하겠음. CALL, JMP, RET 는 중요하니까 해야지. CALL : 프로시저를 호출하는 명령이다. 프로시저? 바로 함수를 이야기하는 것임. CALL과 JMP의 차이는 RET다. 너무 두루뭉술한 말이구나 내가 적어놓고도. CALL은 호출되고 난 후에 이전에 실행중이던 프로시져로 복귀를 해야하고 JMP는 그럴 필요가 없다. 즉, RET명령이 필요없다는 것 CALL을 이용하여 호출하면 "프롤로그" 과정부터 수행해야한다. 지금껏 분석하면서 프롤로그는 많이 보았을 터임. ESP레지스터를 EBP에 저장하여 복귀지점을 기록하는 것이다. 그리고 처음에 스택 공간을 할당한 것은.. 그 함수가 사용하는 매개변수가 잇을 때. 호출 한 후 복귀할..

어셈블리어 - CMP

비교하는 명령이다. CMP 명령은 첫번째 값에서 두번째 값을 뺐을 때 마이너스(-)가 되는 경우 CF=1 0일 경우 ZF=1 플레그가 설정된다. 플래그는 CPU의 FLAG 레지스터에 저장되는 처리 데이터 이다. FLAG의 한 비트가 한 플래그가 됨. 그 플래그가 어떻게 설정되냐에 따라 분기문 조건이 달라진다. CMP명령으로 플래그가 어떻게 설정하느냐에 따라 조건 분기 명령이 다 다르다. 표에 정리를 궁금증이 하나 생기게 된다. 그럼 플래그를 어디서 확인해?? Ollydbg에 레지스터 창에서 확인이 가능하다. C P A Z S T D O 이친구들이 모두 앞서 설명한 플래그 레지스터 들이다. 모든 산술 연산, 논리 연산이 끝나고난 결과값에 대해 상태 플레그값을 설정한다. C: Carry flag : 연산결과..

어셈블리어 - LEA 명령어

LEA 명령에 대해 알아보겠음. 지정한 주소값을 가져오는 명령어로, 보통 값을 가져와야 하는 경우에 쓰인다. MOV와는 다르다. 레지스터에 주소값을 저장하고 싶을 때 사용되는 명령어임. 예제를 통해 확실한 개념을 알아보겠음. 디어셈블을 위한 소스는 위와 같음. .data 부분은 데이터 세그먼트를 지정하여 1234값을 저장하는 것이다. push ebp mov ebp, esp sub esp, 4h :함수의 프롤로그와 스택 한칸을 할당한다. mov dword ptr [ebp-4], 00402000h : [ebp-4] 위치에 0x00402000 값을 저장한다. 여기서 0x00402000은 앞에 데이터 세그먼트에 저장된 1234의 주소값이다. mov eax, dword ptr [ebp-4] : [ebp-4] 위치..

어셈블리어 - MOVZX 명령어

MOV 명령의 확장 명령인 MOVZX를 알아본다. 이전에 MOV명령을 설명할 때 같은 크기의 데이터 끼리만 복사가 된다고 했는데.. MOVZX 명령은 첫번째 데이터가 두번째 보다 크기가 커도 복사가 된다. 대신 크기가 안맞으니 남은 공간은 0으로 체워짐.. 컴파일과 오브젝트 파일 링크하는 방법은 이전 mov명령어 포스트 참고 push ebp mov ebp, esp sub esp, 4h : 아까도 설명 했듯이.. 함수의 프롤로그와 스택 한칸의 크기를 할당한다. mov dword ptr [ebp-4], 0000ffffh : 할당된 스택에 0xFFFF 값이 저장된다. mov bx, word ptr [ebp-4] : BX부분에 FFFF가 복사된다. 원래 ebx값이 7FFD0000이었는데 7FFDFFFF이 되었음..

어셈블리어 - MOV 명령어

MOV 명령 데이터를 복사하는 명령어다. move라고 착각하여 이동시킨다고 생각할 수 있는데 이거는 복사하는 거다. MOV를 쓸 때 몇가지 제한사항이 있으니 참고하자. * 레지스터에서는 같은 사이즈의 데이터끼리만 복사 가능하다. * 메모리에서 메모리로 복사가 안된다. 고로 레지스터를 통해서 복사해야한다. * 세그먼트 레지스터의 내용은 범용 레지스터가 아닌 곳으로 이동 가능. 반대는 불가 mov는 " mov eax, ebx " 형태를 가진다. ebx의 값을 eax로 복사한다. 이런 뜻이다. 직접 예제를 통해서 mov에 대해 더 알아보자. mov에 관한 예제 어셈블리 코드이다. 설명이 필요하니 하겠음 .code : 코드가 시작되는 부분 main proc push ebp : 기존 EBP 주소를 스택에 백업 m..

어셈블리어 개요

. Assembly(어셈블리) 란? -> 기계어와 1:1로 대응되는 저급 프로그래밍 언어이다. 어셈블리 언어를 기계어 형태의 오브젝트 코드로 해석해주는 어셈블러에 의해 해석된다. 2. 어셈블리 기본 정리 - segreg : 16비트 세그먼트 레지스터 - mem : 메모리 - label : 지정된 레이블 - imm : 즉시값(상수) - reg : 일반 범용 레지스터 어셈블리 명령어 앞에 E가 많이 붙는데. 기존 16비트에서 32비트 아키텍쳐가 되면서 범위가 확장된 거임 (Extended) 명령어를 보기 전에 일단 프롤로그와 에필로그가 뭔지 좀 알아보자. Prologue(프롤로그) : 스텍 프레임을 잡아주는 것. 즉 함수가 호출 될 때 프롤로그라고 한다. -> push EBP ebp의 값을 push하고 es..

정규표현식 (Regular Expression)

1. Reuglar Expression 개념 정규표현식에 대해 알아봅시다. 먼저 위키피디아에 적혀있는 정규표현식의 개념은 아래와 같다. " 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어" 쉽게 말해 문자열의 검색, 치환, 추출을 위한 하나의 패턴이라고 생각하면 된다. 주로 프로그래밍 언어와 문서편집기 등에서 쓰인다. 여담으로 나는 Snort 룰 설정에 정규표현식이 사용되어 공부하는 것이다. 꼭 알아야 함 언어별, 프로그램별로 조금씩 규칙의 차이점이 있지만 거의 비슷하다. 14 위와 같이 생겨먹은게 정규표현식이다. 진짜 극혐;;; 정규표현식 자체가 CRLF를 허용하지 않아서 한줄에 저렇게 다 적어야 한다. 토쏠리게 복잡하다. 하지만 정규표현식을 사용하지 않으면 문자열 처리를 수행하려면 ..

C 프로그램 퍼포먼스에 대한 메모

내가 들은 강의에서 주안점으로 본 것은 "실제 프로그래머들은 어떻게? 무엇을? 왜?" 라는 점이다. ​ 실제로 필드에서 일하시는 분들이 신경쓰는 부분, 책에선 알 수 없는 내용. ​ "어떻게 효율적으로 프로그래밍을 하는가?" "무엇을 사용해야 효율적인 프로그래밍이 가능한가?" "내가 대충 넘어간 부분을 저 사람은 왜 중요하다고 말하는가?" ​ 기본적인 문법, 내용 등은 컴퓨터 전공인 관계로 알고 있는 내용이 많았다. 하지만 실제로 코딩할 때는 책에서 쉽게 알 수 있는 지식도 물론 중요하지만 실제 경험을 바탕으로 나온 노하우 등으로 인한 미세한 변화가 큰 결과를 낳을 때가 많다. 강의를 듣는 내내 그런 꿀(?)같은 정보가 없나 귀를 쫑긋하고 들었다. ​ 먼저 연산에 대한 내용이다. 1. 이항 연산보다 단항..

반응형