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! 저말이 맞구나
좀 더 자세히 붙이자면 스택영역에 있는 포인터변수엔 힙영역에 할당된 포인터변수의 주소값이 들어있음