C300_054
C300_소스코드
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 | #include <stdio.h> #include <string.h> #define SKY "sky" void main(void) { char string[100]; int ret; printf("영단어를 입력한 후 Enter키를 치세요 !\n"); printf("sky를 입력하면 프로그램이 종료됩니다. \n"); do { gets(string); ret = strcmp(string, SKY); if (ret == 0) { printf("%s == %s, ret = %d \n", string, SKY, ret); break; } else if (ret < 0) printf("%s < %s, ret = %d \n", string, SKY, ret); else printf("%s > %s, ret = %d \n", string, SKY, ret); } while (1); } | cs |
IDA - Layout Graph
IDA - Text View
sbb operand1 operand2 : operand1 = operand1 - (operand1 +Carry Flag)
CF가 1이면 -1이 된다.
or -1, 1 명령을 수행하면 -1이 된다.
CF가 0이면 0이 된다.
or 0, 1 명령을 수행하면 1이 된다.
cmp 명령어를 만날 대 ZF, CF가 설정된다.
따라서 위 과정에 따라서 strcmp의 parameter가 다를 때 반환 값이 -1이 나오거나, 1이 나온다.
strcmp를 사용할 때 C언어에서는 #include <string.h>를 이용해 간단히 사용했지만,
디스어셈블하면, 어셈블리로 strcmp가 변형되어서 해석하기 힘들었다.
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <stdio.h> #include <string.h> void main(void) { char var_1; char var_2; int ret; int var_c; int var_10; int var_14; int var_18; char string[100]; printf(_Format); printf(aSky_3); do{ eax = string; gets(eax); var_10 = offset aSky_2; ecx = string; var_C = ecx; edx = var_C; al = [edx]; var_1 = al; ecx = var_10; do{ if(al == [ecx]){ if(var_1 != NULL){ edx = var_C al = [edx+1]; var_2 = al; ecx = var_10; if(al == [ecx+1]){ var_C = var_C + 2; var_10 = var_10 + 2; }else var_14 = edx; }else var_14 = NULL; }while(var_2 != NULL) eax = var_14; var_18 = eax; ecx = var_18; ret = ecx; if(ret == NULL) edx = ret eax = string; printf(aSSRetD, eax, aSky, edx); break; else if(ret < 0) ecx = ret; edx = string; printf(aSSRetD_0, edx, aSky_0, ecx); else edx = ret; ecx = string; printf(aSSRetD_1, ecx, aSky_1, eax); edx = 1; }while(edx) eax = 0; } | 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 25 26 27 28 | #include <stdio.h> #include <string.h> void main(void) { int *ret; char string[100]; printf(_Format); printf(aSky_3); do{ gets(string); ret = strcmp(string, "sky") if(ret == NULL) printf(aSSRetD, string, aSky, ret); break; else if(ret < 0) printf(aSSRetD_0, string, aSky_0, ret); else printf(aSSRetD_1, string, aSky_1, ret); }while(1) return 0; } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 056 (strcat) (0) | 2018.07.16 |
---|---|
ASM to C with IDA - 055 (strncmp) (0) | 2018.07.12 |
ASM to C with IDA - 053 (0) | 2018.07.12 |
ASM to C with IDA - 052 (strcpy) (0) | 2018.07.11 |
ASM to C with IDA - 051 (0) | 2018.07.11 |