0%

关于修改mian返回地址一个字节可重新执行main函数的原理

关于修改mian返回地址一个字节可重新执行main函数的原理

例题是 [ImaginaryCTF 2024] fermat

main函数的返回地址并不是像其他被main函数调用的返回地址一样返回程序内的某个地址,而是返回__libc_start_main

如下

然后在返回地址+0x10的地方保存着main函数的地址

在返回地址往上的低地址处存在着下面的这个函数,这个函数与__libc_start_main是挨着的,所以只需要修改__libc_start_main的一个字节即可劫持返回地址返回这个函数,关键的代码在于这个函数存在着这样一段汇编代码mov rax,[rsp+8];call rax

因此,我们试着将其最后的一个字节修改为\x89

在ret之后,rsp+8,那么此时[rsp+8]就刚好指向main函数的地址

mov rax,[rsp+8];call rax 之后,就能够返回main函数了

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道