C300_042
C300_소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> int print( char* string ); main() { print( "This is a function !" ); } int print( char* string ) { int len = 0; while( *string != (int)NULL ) { printf( "%c", *string ); string++; // 번지 값을 1 증가 len++; // 문자열의 길이를 1 증가 } return len; // 총 문자열의 길이를 반환 } | cs |
IDA - Layout Graph
IDA - Text View
movsx : 부호있는 산술 값에 대해서 사용되어서 부호비트로 목적지 피 연산자의 왼쪽 비트를 채운다.
바이트나 워드를 워드나 더블워드로 목적지에 전송한다.
test : operand 1과 oeprand2를 AND 연산한다. 결과값이 0이면 ZF가 1, 0이 아니면 ZF가 0이 된다.
print 함수 부분이 디스어셈블된 인자를 보면 stirng = dword ptr 8이다. ebp + 8 부분은 print로 전달되는 파라미터이다.
따라서 string이 print의 인자이고, 하나임을 확실히 알 수 있다.
번지값을 1씩 증가하면서 다음 문자열에 접근하는 것을 볼 수 있다.
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 | #include <stdio.h> int pirnt(int *string) { len = 0; eax = string; ecx = [eax]; while(ecx != NULL){ edx = string; eax = [edx]; printf(_Format , eax); ecx = string ecx = ecx + 1; string = ecx; edx = len; edx = edx + 1; len = edx eax = string; ecx = eax; } eax = len; } main() { print(string); } | cs |
pseudo code - 최종 의사코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> int pirnt(int *string) { len = 0; while(*string != NULL){ printf(_Format , *string); string++; len++; } return len; } main() { print(string); } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 044 (0) | 2018.07.09 |
---|---|
ASM to C with IDA - 043 (0) | 2018.07.08 |
ASM to C with IDA - 041 (0) | 2018.07.08 |
ASM to C with IDA - 040 (0) | 2018.07.06 |
ASM to C with IDA - 039 (2) | 2018.07.06 |