64位程序栈溢出
当参数少于7个时, 参数<1-6>放入寄存器: rdi, rsi, rdx, rcx, r8, r9
栈
High
Address | |
+-----------------+
| 第7参数(如果有) |
+-----------------+
| return address |
+-----------------+
rbp => | old rbp |
+-----------------+
rbp-8 => | canary value |
+-----------------+
| local variables |
Low | |
Address
一般参数小于7
则
#payload = 'a'*buf+p64(rbp)+p64(hack1)+p64(hack2)
buf为覆盖地址到ebp的字节
rbp为任意值
原理
调用hack1前,
函数一般leave,ret
将 return address (rbp+8)传给rip
rsp指向 rbp +16
返回地址是函数hack1
调用hack1,会在rsp(rbp+16)低地址上(即rbp+24)建立栈帧
hack1返回地址就是rbp+16
则接着执行hack2
#如果要传参,要用到rop
*** 如<只给hack1传参> ***
##payload = 'a'*buf+p64(rbp)+p64(pop|ret)+p64(参数)+p64(hack1)+p64(hack2)
如pop_rdi_ret (传递第一个参数)
将返回地址改为pop|ret则会将栈上数据传给寄存器。有几个pop就在栈上布局多少参数。
最后ret 会将rip指向参数下面的地址 如hack1
调用完hack1就执行hack2
函数hack1传参,栈布局
High
Address | |
+-----------------+
| hack2 |
+-----------------+
| hack1 |
+-----------------+
| hack1参数2 |
+-----------------+
| hack1参数1 |
+-----------------+
| 返回地址(rop) | pop rdi|pop rsi |ret 传递参数,执行hack1
+-----------------+
rbp => | old rbp |
+-----------------+
rbp-8 => | canary value |
+-----------------+
| local variables |
Low | |
Address