본문으로 바로가기

ASM to C with IDA - 042

category Reversing/ASM to C 2018. 7. 8. 13:52

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