首页
社区
课程
招聘
[原创]以一次例题记录strcpy和strcat
发表于: 2025-1-20 12:44 3786

[原创]以一次例题记录strcpy和strcat

2025-1-20 12:44
3786

这两个函数想必各位都不陌生,由于都不会检测长度,导致这两个函数都有可能造成溢出
然而细节的点在于,strcpy会在复制的字符串末尾自动添加'\0',而strcat也是,且二者遇'\0'则停,也就是说,它们都只能添加一个'\0',无法添加多个'\0'
strcat会从目的地址开头向后不断遍历,直至遇到第一个'\0'后,从这第一个'\0'的位置向后复制源地址的字符串,直至遇到源地址的'\0'

例题344K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2L8s2m8S2j5$3q4Z5j5h3y4C8i4K6u0W2j5$3!0E0i4K6u0r3j5$3S2S2L8r3I4W2L8X3N6W2M7#2)9J5c8X3y4S2N6r3y4H3P5b7`.`.
ida逆向后显然要覆盖返回地址为win函数的地址
返回地址距离0x118,输入的字符串长度限制为0x100,那么显然无法通过一次strcpy达到覆盖。
而且系统是64位,原返回地址共有6字节,而win函数地址只有3字节,由于之前介绍的strcat的限制,一次strcat显然是难以将返回地址的高字节覆盖为0了。
那么这时候只能多次strcat,由于strcat会在最末尾添加一个'\0',我们不断的strcat,并逐步缩短复制字符串的长度,即可多次添加'\0'
需要注意的是,由于strcat会遍历目的地址,如果单纯只用strcat就难以覆盖同一个地址(第二次strcat会把字符串复制到第一次末尾的后面),所以还需用到strcpy,由于strcpy会在复制字符串后自动添加'\0',这个'\0'就相当于是strcat开头的定位器,多次使用strcpy+strcat,即可多次在目标返回地址添加'\0'


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回