XOR EAX, EAX
OR ECX, FFFFFFFF
// EDI에 처리를 원하는 문자열의 주소 넣음
REPNE SCAS BYTE PTR ES:[EDI]
NOT ECX
하면 문자열의 길이가 ECX에 구해진다
이유
REPNE 명령어는 Repeat Not Equal을 뜻하는 명령어다. 여기선 ECX 레지스터를 반복 횟수로써 사용한다.
Not Equal 인즉, Equal 상태엔 1로 설정되는 ZF는 0이고 반복 횟수로 쓰는 ECX는 0보다 큰 상태가 유지되야 반복을 계속한다.
명령어가 시행되면 ECX값을 1씩 빼가면서 반복하며, SCAS(SCan A String) 명령어로 EAX와 비교를 한다. 이때 명시된 BYTE단위로 비교하기 때문에 EAX의 8bit 부분인 AL값과 EDI가 가리키는 문자열의 모든 문자를 차례차례 비교한다.
EAX를 0000 0000으로 초기화시켰으므로, 문자열의 끝인 널 문자를 만나면 ZF가 1이 되며 Repeat을 멈춘다.
그 후에, ECX값을 비트 반전(NOT) 시키면 반복한 횟수가 나타난다(깎은 횟수). 즉, EDI가 가리키는 문자열의 길이가 나온다.
----------------------------
문자열 관련 함수(비교, 붙이기)에서 많이 등장할거 같음
ASCII가 아닌 다른 인코딩에서는 비교 단위가 BYTE가 아닐거 같음(굳이..)
'Security > Reversing' 카테고리의 다른 글
RE.kr Twist (0) | 2018.01.09 |
---|---|
pwnable.kr 문제 (1) | 2017.03.08 |
Reversing.kr-Easy_KeygenMe 풀이 (0) | 2016.11.10 |