Tuuna Computer Science

C 언어 문자열 관련 함수 (strcpy) 분석 본문

Assembly

C 언어 문자열 관련 함수 (strcpy) 분석

GuTTe 2018. 6. 11. 21:02
     @pointer_00401500:                                     ;<= Procedure Start
        PUSH EBP
        MOV EBP,ESP
        AND ESP,0FFFFFFF0h
        SUB ESP,020h                                           ;공간 생성
        CALL @pointer_00401EE0                            ;<= Jump/Call Address Not Resolved
        MOV DWORD PTR SS:[ESP],0Fh                  ;동적할당 크기 인자 (나중에 내부 분석해보자 ㅋ)
        CALL malloc                                             ;<= Jump/Call Address Not Resolved (동적할당 호출),
                                                                     ;동적할당 후 생긴 주소값을 EAX에 넣는다.
                                                                     ;(return 값) 거의 모든 return값은 EAX에 넣는다.
        MOV DWORD PTR SS:[ESP+01Ch],EAX         ;EAX(주소값)을 메모리에 넣는다.
        MOV EAX,DWORD PTR SS:[ESP+01Ch]     
        MOV DWORD PTR DS:[EAX],06C6C6568h     ;이건 문자열이다.
                                                                     ;주소값에 들어있는 값에 문자열을 넣고 있다(최대4글자)
        MOV DWORD PTR DS:[EAX+4],06F77206Fh
        MOV DWORD PTR DS:[EAX+8],0646C72h
        MOV EAX,DWORD PTR SS:[ESP+01Ch]           ;주소값을 다시 EAX에 넣는다.
        MOV DWORD PTR SS:[ESP],EAX                 ;printf의 인자로 EAX를 준다. 
                                                                    ;(뇌피셜) (동적할당 시 생긴 힙영역 주소) 
        CALL puts                                               ;<= Jump/Call Address Not Resolved
        MOV EAX,DWORD PTR SS:[ESP+01Ch]
        MOV DWORD PTR DS:[EAX],06C6C6568h
        MOV DWORD PTR DS:[EAX+4],06F77206Fh
        MOV DWORD PTR DS:[EAX+8],020646C72h
        MOV DWORD PTR DS:[EAX+0Ch],06C6C6568h
        MOV DWORD PTR DS:[EAX+010h],06F77206Fh
        MOV DWORD PTR DS:[EAX+014h],0646C72h
        MOV EAX,DWORD PTR SS:[ESP+01Ch]
        MOV DWORD PTR SS:[ESP],EAX
        CALL puts                                                ;<= Jump/Call Address Not Resolved
        MOV EAX,0
        LEAVE
        RETN                                                      ;<= Procedure End


Q. 뇌피셜 : 포인터 변수선언 후 동적할당시 스택영역엔 포인터변수가있고 힙 영역에도 포인터변수가 있다는 것인가.


2018.8.3 뇌피셜 success! 저말이 맞구나


좀 더 자세히 붙이자면 스택영역에 있는 포인터변수엔 힙영역에 할당된 포인터변수의 주소값이 들어있음

Comments