1.1 函数调用栈情况( 二 )


源代码会执行main-> , 中存在缓冲区溢出漏洞 , 此时只要将的返回地址替换成bar的起始地址就行 。
执行时 , 栈空间如下
栈空间
局部变量buf
main函数ebp
返回地址 , 该地址为main函数一个指令的地址
函数形参input
输入的input只要能把ebp覆盖并把返回地址替换成bar的起始地址就行 , 不需要考虑参数 。
2.3 其它情况
理想很丰满 , 现实很骨干 , 一般代码往往不会有("/bin/sh");摆在一个函数内部 , 所以需要自己构造 。
当代码中引入了函数时 , 可以利用函数来构造 , 比如攻防世界 , plt表有 , 这里地址为(是不是) , 可以用来当返回地址 , 接下来还需要/bin/sh字符串 。
/bin/sh地址是 , (data节)
漏洞函数如下
这个函数栈如下
栈空间
局部变量buf , 0x88字节
main函数ebp , 4字节
返回地址 , 该地址为main函数一个指令的地址 , 4字节
就是要将返回地址变成的地址 , 并且还附上参数的地址 。完整的应为('a' * (0x88 + 0x04) + p32() + p32(0) + p32())
当然 , 有时候 , /bin/sh都不会出现 。这个时候只能通过plt表构造了 , 一般可执行文件都会引入动态链接库 , read,write,等系统函数都会引入 , 而这些函数在动态链接库里的相对位置不变 , 所以可以通过它们的地址获取的地址 。
获取地址之后 , /bin/sh一般也在动态链接库里有 , 此时就可以构造了 。或者修改某个函数的got地址 , 比如把换成 , 把输出的可控参数输入成/bin/sh 。(这个不一定每次有用 , 首先调用和调用的参数要一致 , 其次 , 参数属于输入参数) 。当然 , 这些操作也更加复杂 。
3.防护