전체 글 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] 위치..

반응형