위의 코딩 부분은 strcat을 실행하는 부분을 assembly설명을 위해 캡쳐한 부분이다.
다른 것을 막론하고 strcat("sky","blue")를 한다고 가정하자. 위 코딩과 비교해 보자면...
var_D8는 "sky"의 NULL에 해당하는 부분의 주소, var_E0은 "blue"의 b에 해당하는 부분의 주소,
var_E4는 "blue"의 문자열 수 5를 저장한다(null포함).
위의 그림처럼, edi = 문자열 마지막 주소 즉, sky의 문자열 마지막 주소인 NULL에 위치해 있는다.
그리고 edi = esi(복사할 문자열 여기선 "blue") 문자 복사를 한다. 문자열 복사는 ecx를 기준으로 ecx의 데이터 값만큼만 한다.
흐름은 이런식이고.. assembly에서는 어떻게 작동하는지 다시 위의 예제를 가져와 살펴보자.!
shr ecx, 2를 설명하기 전에 rep movsd를 이해하고 넘어가야 한다. 먼저 rep이란 무엇인가
REP(Repeat String Operation) - 뒤의 스트링 명령을 (e)cx가 0이 될때까지 반복한다. ecx는 1씩 감소한다.
rep movsd(mov string dword) - dword 단위 만큼 ecx가 0이 될때까지 edi에 esi를 복사한다.
shr ecx, 2는 비트를 shift right 오른쪽으로 2번 간다. 한 마디로 4로 나누고 있다.
그럼 여기서 blue는 문자열의 길이가 5가되고 ecx는 5이다. 즉 4로 나누면 1이되고 , 1dword만큼 복사를 실행한다.
그럼 blue 까진 복사를 하게되고, null은 다음 명령어에서 해결한다.
rep movsb(mov string byte) - byte단위 만큼 ecx가 0이 될때까지 복사 한다.
모든 문자열이 4byte씩 나뉘어 떨어지는 것이 아니기 때문에 and ecx, 3을 통해 나머지 부분을 추출해서 남은 문자열을 복사하는 것을 확인할 수 있다. 여기서는 and ecx(5), 3의 결과는 1이기때문에 남은 1byte NULL까지 복사를 완료할 수 있다.
'Malware Analysis' 카테고리의 다른 글
vssadmin (0) | 2018.02.12 |
---|---|
Sysmon의 개념 및 환경 구성 (0) | 2018.02.11 |
IDA 를 이용한 C언어 디스어셈블(1~10) (0) | 2018.01.15 |