关于修改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函数了