336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

cmp 1 2  -> 앞을 기준으로 내부적으로 마이너스 연산을 함 


JA

JZ - zero flag가 1일 때 점프 

JNE -> 제로 플레그가 0일떄 점프 

JB



-------------


CALL 

함수 호출를 할 때 사용하는 명령어 

함수를 호출하지만 가기전에 하는 일이 있음 

-> 다음실행될 명령어의 주소(return 주소) 를 stack에 넣어두고 함수를 호출함 




stack frame 

stack frame의 기준점 -> ebp 

-> 안에 아무것도 없을 때 최상단은 ebp

-> 값이 들어가면 esp가 올라가지만 주소는 낮아짐 




return -> 값을 돌려줌 -> eax레지스터에 값이 저장 -> RET





#include <stdio.h>


int Sum(){

 

int a=1;

int b=2;


printf("Result\n");


return a+b;

}



int main(){

int result=0;

printf("%d\n",result);


_asm{

call Sum

mov result, eax    //  리턴값을 변수에 저장 

}

printf("%d\n",result);

return 0;

}



*JMP 는 갔다가 돌아오지 않지만 CALL은 돌아옴

-> 다음 실행될 명령어의 주소 (return 주소)를 stack에 넣기 때문에 돌아옴

      -> mov 이용해서 다음실행될 명령어의 주소를 넣음 





------------------


RET   =  RETN 

(stack frame에 최상단에 있는값) esp 레지스터가 가리키는 값을 eip레지스터에 저장 



RET imm8

-> RET 에는 상수값이 올 수 있음 

-> esp가 eip에 가는 순간 eip 레지스터 값을 더해줌 




-------------


NOP


no operation

아무 동작도 수행하지 않는 명령어 

1 byte의 크기를 가짐  ->  0x90


NOP를 이용한 시스템 공격 



ex)

JMP L1  -> 5 byte 

CALL L1 -> 3 byte


-> 명령어를 JMP에서 CALL로 바꿀 경우 명령어의 크기가 5 byte에서 3byte로 바뀌면서 

     2 byte의 공백을 메우기 위해 NOP을 사용함




-----------------


assembly로 


strcmp() -  문자열 비교 

strlen()

strcpy()

strcat()

strstr() - 문자열 검색

strchr() - 한 문자 검색



구현 




-----------------------


strlen()



int my_strlen(char * str){

int i=0;

while(str[i]!=0){

i++;

}

printf("%d\n",i);

return 0;

}


int my_asm_strlen(char * s){

int cnt=0;

_asm{

mov esi,dword ptr[s] // 문자열 주소 -> 값을 가져오려면 lea가 아니라 mov를 사용

STA:

cmp byte ptr[esi], 0x00

je END

inc cnt

inc esi 

jmp STA

}


END:

printf("%d\n",cnt);

return cnt;

}


int main(){

char *ch="aaaa";


my_asm_strlen(ch);

return 0;

}



------------------


strcmp




int my_strcmp(char * s, char *s2){

int i=0;


while(s2[i]!=0){


if(s[i]!=s2[i]){

printf("다른 문자열입니다\n");

return 0;

}

i++;

}

printf("같은 문자열입니다\n");

return 0;

}


int my_asm_strcmp(char* s, char s2){


_asm{


}

}



int main(){

char *ch2="aa";


my_strcmp(ch,ch2);


return 0;

}





------------------


보고서




일관성 



레지스터 정리 



자세한 목차, 개요


함수에 대한 설명 


소스 코드 구현 

주석 


강조 부분

실행


그 과정 디버깅하여 설명 


함수의 헤더, 인자 , 설명, 



결론 


(10


mkgk888에 업로드 



[i2sec] 분석보고서폼.doc


snagit.exe


















'Reversing' 카테고리의 다른 글

analyzing files using ollydbg  (0) 2014.09.24
analyzing assembly sentences  (0) 2014.09.23
assembly lingoes and questions  (0) 2014.09.19
assembly lingoes  (0) 2014.09.18
assembly lingoes  (0) 2014.09.17
Posted by af334