首页
社区
课程
招聘
[原创]从反汇编的角度学C/C++之循环结构
发表于: 2021-9-29 11:37 9503

[原创]从反汇编的角度学C/C++之循环结构

2021-9-29 11:37
9503

    在C/C++中,我们有三种循环结构。分别是while,do-while,for。下面的代码中,三种循环结构所做的事情是一样,通过比较这三种情况下的生成的汇编,我们就可以分析得出三种循环结构在内存中的表现形式得不同点

    由此可以看到while循环中,我们先是判断是否满足条件,不满足得话会跳出循环,如果满足执行相应得指令以后在跳转到判断语句处进行执行。执行得流程图如下图所示:

    可以看到do-while循环中,我们先是执行循环条件成立时候的代码,然后在进行判断,如果符合条件则跳转回去继续执行。流程图如下

    在for循环中,先执行第一个分号前的赋值指令,然后就跳转到判断指令进行判断,如果满足条件则执行条件成立指令执行随后在跳转到第二个分号后的语句执行,这个语句继续向下执行会继续判断条件是否成立。流程图如下

    由于for循环经常和数组指针一起使用,所以下面给出一个例子来看看汇编中的表现形式

    由上可知,数组和指针的差别不大,只不过指针运算会多一次取出地址的操作。另外由于这里没用对下标进行判断是否超过了数组的界限,只是根据下标算偏移而得出地址,所以对于新手来说往往会犯的一个错误就是写出了如下的代码导致了程序运行错误。

    这段代码本身是想给arrTest里面的元素赋值为0。但是因为for循环的时候没有用对下标导致了访问了数组之外的地址,而这个地址刚好是i的地址,导致当i等于10的时候,为arrTest[i]赋值的时候就是给i赋值。这就导致了程序的无限循环。反汇编结果如下:

    当i等于10的时候我们可以看看ebp-4与ebp+ecx*4-0x2C的值。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-10-20 11:19 被1900编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 922
活跃值: (1803)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
5
2023-1-26 10:45
0
游客
登录 | 注册 方可回帖
返回
//