본문으로 바로가기

ASM to C with IDA - 037

category Reversing/ASM to C 2018. 7. 5. 10:43

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