C300_037
C300_소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> int length(char* pstr); main() { int len = length("abcde"); printf("길이 = %d ", len); // 길이 = 5 } int length(char* pstr) { int len = 0; while (*pstr != NULL) { pstr++; // pstr의 번지를 1만큼 증가 len++; // 문자열의 길이를 1만큼 } return len; } | cs |
IDA - Layout Graph (main, length)
IDA - Text View (main, length)
movsx를 통해 문자열의 한 문자씩 가지고 와서 null 문자인지 확인한다.
만일 null 문자를 만나면 문자열의 끝이기 때문에 반복문을 탈출한다.
movsx: 바이트, 워드, 더블 워드를 목적지에 전송한다.
부호있는 산술 값에 사용되므로 부호비트로 채운다.
test: 두 operand를 AND 연산을 한다.
피 연산자에 영향을 미치지 않고, SF, ZF, PF 플래그에 영향을 준다.
피 연산자가 0이면 ZF=1, 0이 아니면 ZF=0으로 설정된다.
pseudo code - 의사 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h> main() { int len; len = length(pstr); len = eax; eax = len; pirntf(_Format, eax); eax = 0; } int length(int *pstr) { int len; len = 0; eax = pstr; ecx = [eax] while(*pstr != null){ edx = pstr; edx = edx + 1; pstr = edx eax = len eax = eax + 1; len = eax } eax = len; } | cs |
pseudo code - 최종 의사코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> main() { int len; len = length(pstr); pirntf(_Format, len); return 0; } int length(int *pstr) { int len; len = 0; while(*pstr != null){ pstr++; len++; } return len; } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 039 (2) | 2018.07.06 |
---|---|
ASM to C with IDA - 038 (0) | 2018.07.06 |
ASM to C with IDA - 036 (0) | 2018.07.05 |
ASM to C with IDA - 035 (0) | 2018.07.05 |
ASM to C with IDA - 034 (0) | 2018.07.04 |