逆向基础之C语言:C语言printf scanf举例

一.简单介绍printf scanf裸汇编

printf 打印数据

scanf 输入数据

注意,scanf后面的参数跟的是地址,&取地址符号

int fun()
{
    int a;
    int b;
    int c;
    c=0;
    scanf("%d %d",&a,&b);
    c=a+b;
    printf("%d\n",c);
    return 0;
}

 

如上面代码简单应用scanf与printf,写成裸汇编如下面的代码所示

char*p="%d %d";
char*p1="%d\n";
 
_declspec(naked) int fun1()
{
    _asm{
        push ebp
        mov ebp,esp
        sub esp,0x4c
        push ebx
        push esi
        push edi
        lea edi,dword ptr ds:[ebp-0x4c]
        mov ecx,0x13
        mov eax,0xcccccccc
        rep stosd
 
        mov dword ptr ds:[ebp-0xc],0x0
        lea eax,dword ptr ds:[ebp-0x8]
        push eax
        lea ecx,dword ptr ds:[ebp-0x4]
        push ecx
        mov edx,p
        push edx
        call scanf
        add esp,0xc
        mov eax,dword ptr ds:[ebp-0x4]
        add eax,dword ptr ds:[ebp-0x8]
        mov DWORD ptr ds:[ebp-0xc],eax
 
        mov  ecx,dword ptr ds:[ebp-0xc]
        push ecx
        mov eax,p1
        push eax
        call printf
        add esp,0x8
 
        xor eax,eax
 
 
        pop edi
        pop esi
        pop ebx
        mov esp,ebp
        pop ebp
        ret
 
    }
}

 


下面是应用scanf与printf相关小例子

二.判断偶数

void oushu()
{
    int a;
    printf("请输入一个数\n");
    scanf("%d",&a);
    if (a % 2==0)
    {
        printf("您输入的%d是偶数\n",a);
    } 
    else
    {
        printf("您输入的%d是奇数\n",a);
    }
 
 
}

 

三.把几个数按从小到大排列

void bidaxiao()
{
    int a;
    int b;
    int c;
    int t;
    scanf("%d%d%d",&a,&b,&c);
    if(a>b)
    {
        t=a;
        a=b;
        b=t;
        
    }
    if(a>c)
    {
        t=a;
        a=c;
        c=t;
    }
    if(b>c)
    {
        t=b;
        b=c;
        c=t;
 
    }
    printf("从小到大排列%d%d%d\n",a,b,c);
 
}

 

四.判断是否是闰年

思路:1.能被4整除,但是不能被100整除;2.能被400整除

int runian()
{
    int year;
    scanf("%d",&year);
 
    if((year % 4 ==0 && year % 100 !=0)||year %400 ==0)
    {
        printf("%d是闰年\n",year);
 
    }
    else
    {
        printf("%d不是闰年",year);
    }
    return 0;
 
}

 

五.检测字符类型

思路:数字:48-57 大写字母:65-90 小写字母 97-122 特殊符号:剩下的

有两种写法:以大写字母举例,

第一种:c>=’A’&&c<=’Z’

第二种:c>=65&&c<=90

下面代码两种写法混写

int zifu()
{
    char c;
    scanf("%c",&c);
    if(c>='0'&& c<=57)
    {
        printf("%c是数字",c);
    }
    else if(c>='a' && c<='z')
    {
        printf("%c是小写字母",c);
 
    }
    else if(c>=65&& c<=97)
    {
        printf("%c是大写字母",c);
 
    }
    else
    {
        printf("%c是特殊字符",c);
 
    }
    return 0;
 
 
}

 

六:简单计算器

void jisuanqi()
{
    int a;
    int b;
    char c;
    scanf("%d%c%d",&a,&c,&b);
    switch(c)
    {
        case '+':
            {
                printf("%d\n",a+b);
                break;
            }
        case '-':
            {
                printf("%d\n",a-b);
                break;
            }
        case '*':
            {
                printf("%d\n",a*b);
                break;
            }
        case '/':
            {
            
                if(!b)
                {
                    printf("除数不能为0");
                    
                    break;
 
                }
                else
                {
                    printf("%d\n",a/b);
                    break;
                }
                
            }
        default:
            {
                printf("输入有错\n");
            }
    }
 
}

 


今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!

posted @ 2022-06-21 20:29  逆向小星同学  阅读(174)  评论(0编辑  收藏  举报