-
-
[原创]以一次例题记录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'
赞赏
他的文章
- [原创]以一次例题记录strcpy和strcat 3787
- [求助]格式化字符串 3710
- [求助]对rop链的gadget有些问题 2739
- [求助]为啥同一道题我用ida反汇编出来和别人不一样啊 2195
- [求助]有道很简单的题想问下各位 2352
赞赏
雪币:
留言: