首页
社区
课程
招聘
[旧帖] [原创]简单的子函数返回问题分析(仅限入门级阅读) 0.00雪花
发表于: 2014-5-15 12:57 1503

[旧帖] [原创]简单的子函数返回问题分析(仅限入门级阅读) 0.00雪花

2014-5-15 12:57
1503
网上有个朋友发了个程序,说是找找错误,楼主水平很次,但是以前被人忽视的感觉不爽,
所以就拿着入门级水平给改了改,废话不多说。
        (声明一下:这真心是给入门新手看的,已经会写程序的同学就可以看其他帖子了)

        这是源程序:
#include<stdio.h>
int leapyear(int y);
void main()
{
	
	int i,s=0;
	for(i=1900;i<=2000;i++)
	{
		printf("%d",leapyear(i));
		s+=1;
		if(s%3==0)
			printf("\n");
	}
	getchar();
	getchar();
}
int leapyear(int y)
{
    if(y%4==0&&y%100!=0||y%400==0)
		return(y);
}


        程序错误确实不少,不过先别管这些,就看输出数据有点问题吧。我用bool弄了弄,改过的
程序就不给大家看了。
        本帖子的重点是:leapyear()函数为什么会返回4呢?if不成立后这个4哪里来的?

        我写了个测试程序,大家看看吧。
#include <stdio.h>

int fun_test(int y)
{
	if(((y%4 == 0) && (y%100 != 0)) || (y%400 == 0))
		return y;
}

int main(void)
{
	int test = 422;

	if( test%2 == 0 )
		printf("test = %d\n", test);

	printf("fun_test = %d\n", fun_test(test));

	return 0;
}


/*

  这里是反汇编代码

  254:      if(((y%4 == 0) && (y%100 != 0)) || (y%400 == 0))	//这里是子函数fun_test的代码
0040D7D8   mov         eax,dword ptr [ebp+8]			//从[ebp+8]里取出y的值,进行y%4的运算
0040D7DB   and         eax,80000003h
0040D7E0   jns         fun_test+27h (0040d7e7)			
0040D7E2   dec         eax
0040D7E3   or          eax,0FCh
0040D7E6   inc         eax
0040D7E7   test        eax,eax
0040D7E9   jne         fun_test+3Ah (0040d7fa)
0040D7EB   mov         eax,dword ptr [ebp+8]			//进行y%100的运算
0040D7EE   cdq
0040D7EF   mov         ecx,64h
0040D7F4   idiv        eax,ecx
0040D7F6   test        edx,edx
0040D7F8   jne         fun_test+49h (0040d809)
0040D7FA   mov         eax,dword ptr [ebp+8]			//这里是y%400的运算
0040D7FD   cdq
0040D7FE   mov         ecx,190h
0040D803   idiv        eax,ecx
0040D805   test        edx,edx
0040D807   jne         fun_test+4Ch (0040d80c)			//这里有问题,因为它不满足if的条件,但是eax里存放的是y%400运算
								//的结果,也就是1,所以函数返回值默认放在eax里,出错。
								//同时也提醒新手们,注意函数的返回值!

255:          return y;						//这里返回y的值
0040D809   mov         eax,dword ptr [ebp+8]
256:  }
0040D80C   pop         edi
0040D80D   pop         esi
0040D80E   pop         ebx
0040D80F   mov         esp,ebp
0040D811   pop         ebp
0040D812   ret



  //这里是main函数调用子函数的地方

  265:      printf("fun_test = %d\n", fun_test(test));

0040D863   mov         edx,dword ptr [ebp-4]			//参数入栈
0040D866   push        edx
0040D867   call        @ILT+20(fun_test) (00401019)		//调用子函数
0040D86C   add         esp,4					//堆栈平衡
0040D86F   push        eax					//这就是问题所在了!eax中存放的是子函数返回的1,所以错误。
0040D870   push        offset string "fun_test = %d\n" (00422fa4)
0040D875   call        printf (00401130)
0040D87A   add         esp,8


*/


      水平有限,如果有什么错误或者不赞同的地方,麻烦大家指出来,我们再讨论,帮助共同提高。谢谢。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主说的极是

贴上g++ y%100,y%400部分代码 leapyear() = 22d

004010A0   > \8B45 08                                              mov eax,[ebp+8] ; [ebp+8]=[ebp-4] = 422d
004010A3   .  8945 FC                                              mov [ebp-4],eax
004010A6   .  B9 1F85EB51                                          mov ecx,51EB851F
004010AB   .  8B45 FC                                              mov eax,[ebp-4]
004010AE   .  F7E9                                                 imul ecx
004010B0   .  89D1                                                 mov ecx,edx
004010B2   .  C1F9 07                                              sar ecx,7
004010B5   .  8B55 FC                                              mov edx,[ebp-4]
004010B8   .  C1FA 1F                                              sar edx,1F
004010BB   .  29D1                                                 sub ecx,edx
004010BD   .  89CA                                                 mov edx,ecx
004010BF   .  C1E2 02                                              shl edx,2
004010C2   .  01CA                                                 add edx,ecx
004010C4   .  8D0C95 00000000                                      lea ecx,[edx*4]
004010CB   .  01CA                                                 add edx,ecx
004010CD   .  89D1                                                 mov ecx,edx
004010CF   .  C1E1 04                                              shl ecx,4
004010D2   .  8B45 FC                                              mov eax,[ebp-4]
004010D5   .  29C8                                                 sub eax,ecx
004010D7   .  8945 FC                                              mov [ebp-4],eax
004010DA   .  837D FC 00                                           cmp dword ptr [ebp-4],0

2014-5-16 16:30
0
游客
登录 | 注册 方可回帖
返回
//