본문으로 바로가기

ASM to C with IDA - 024

category Reversing/ASM to C 2018. 5. 31. 08:33

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