C300_024
C300_소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> main() { unsigned char ch = 255, mask = 0x7F; printf("%d \n", ch); // 255 printf("%d \n", ch & mask); // 127 printf("%d \n", (char)~ch); // -256 = 0 printf("%d \n", ch ^ ch); // 0 printf("%d \n", ch >> 1); // 127 printf("%d \n", mask << 1); // 254 } | cs |
IDA - Layout Graph
IDA - Text View
MOVZX (move zero extend)
- 부호 없는 산술 값에 대해서 사용된다.
- 바이트를 워드, 워드를 더블 워드로 전송
- 0비트로 목적지 피연산자의 왼쪽 비트들을 채운다.
MOVSX (move sign extend)
- 부호 있는 산술 값에 대해서 사용된다.
- 바이트를 워드, 워드를 더블 워드로 전송
- 부호비트로 목적지 피연산자의 왼쪽 비트들을 채운다.
sar(Alethmetic Shift right)
- 부호를 유지한 채 오른쪽으로 shift 한다.
sal(Alethmetic Shift left)
- 부호를 유지한 채 왼쪽으로 shift 한다.
^(XOR)
- 비트단위 XOR 연산한다.
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 | #include <stdio.h> main() { char var_1; char mask; var_1 = -1; mask = 127; eax = (unsigned)var_1; printf(_Format,eax); ecx = (unsigned)var_1; edx = (unsigned)mask; ecx = ecx * edx; printf(aD_0, ecx); eax = (unsigned)var_1; eax = !eax; ecx = al; printf(aD_1, ecx); edx = (unsigned)var_1; eax = (unsigned)var_1; edx = 0; printf(aD_2, edx); ecx = (unsigned)var_1; ecx = ecx/2; printf(aD_3, ecx); edx = (unsigned)mask; edx = edx * 2; printf(aD_4, edx); } | 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 | #include <stdio.h> main() { char var_1; char mask; var_1 = -1; mask = 127; printf(_Format, (unsigned)var_1;); printf(aD_0, (unsigned)var_1 & (unsigned)mask); printf(aD_1, !(unsigned)var_1); printf(aD_2, (unsigned)var_1^(unsigned)var_1); printf(aD_3, (unsigned)var_1 >> 1); printf(aD_4, (unsigned)var_1 << 1); } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 026 (0) | 2018.06.01 |
---|---|
ASM to C with IDA - 025 (0) | 2018.05.31 |
ASM to C with IDA - 023 (0) | 2018.05.31 |
ASM to C with IDA - 022 (0) | 2018.05.30 |
ASM to C with IDA - 021 (0) | 2018.05.30 |