64位程序中参数传递及栈溢出利用
32位程序参数传递是直接弹出栈顶元素作为参数,而64位程序通过edi寄存器传参;因此在栈溢出漏洞利用的步骤为:
找到“pop edi\rdi;ret;”语句、system函数和“bin/sh”字符串的地址,输入数据:【填满栈空间的数据+覆盖edb的数据(32位大小为4h,64位大小为8h)+“pop edi\rdi;ret;”语句的地址+“bin/sh”字符串的地址+system函数的地址】。
具体执行过程:
子函数调用结束时,通过返回地址执行“pop edi\rdi;ret;”语句,将“bin/sh”字符串的地址出栈到edi\rdi寄存器作为参数,通过“pop edi\rdi;ret;”语句的“ret”指令及栈顶的system函数地址执行system函数,将edi\rdi寄存器中的“bin/sh”字符串的地址所在的“bin/sh”字符串作为参数传给system函数 ,执行system(“bin/sh”)语句。
rop
rop即返回导向编程,其原理是利用动态链接库以及已有的指令中接“ret”指令的指令,利用一个栈,在栈中存入各个利用指令的地址并将其按照想要的运行流程顺序存入栈中,在执行完第一个指令后因为后接“ret”指令,所以会将下一条想要运行的指令的地址作为返回地址出栈继续运行,通过每一条指令后的“ret”指令以及栈中安排好的地址可以实现控制想运行的指令的运行流程。
ps:像rop是某个寄存器这种世界机密我是不会说的(/滑稽)