reversing-enging-0x01
buffer overflow
HTB:You know 0xDiablos
:bof
.
Linux x86 内存结构
一个函数被调用时,传递给此函数的参数(name-parameter
)以及此函数的局部变量会被push
到stack段
的
栈顶。
当一个函数有多个入参时,会倒序push
到stack段
中,如funcA(1, 2, 3)
,会以
push(3);push(2);push(1)
的方式push
到stack
中。
调用的函数(A)入栈后,应该持有一个地址,用于函数(A)执行完成后,继续运行的下一行
代码的地址(return address
)。
全部内容入栈后,会将栈底指针EBP(extended base pointer)
入栈,说明当前位置是栈底
。此处栈底
的定义是针对入栈后正在运行的函数(A)而言的,因为,函数(A)的内部变量
也需要入栈,入的是以EBP
为底的栈。
举例理解
1 | void main() { |
当以上程序
执行1
行时,buffer
入栈。
执行2
行时,作为入参(name-parameter):3
入栈、2
入栈、1
入栈;作为返回地址
(return address),下一行代码(3
行)的地址入栈。
funcA
函数相关信息入栈完毕,EBP
入栈,标识此处是栈底。
椄下来是funcA
内部变量,会以EBP
作为栈底,入栈。
比较特殊的是,main
函数的入参在kernel段
中,而不是stack
段。
缓冲区溢出攻击过程
buffer
溢出攻击过程就是栈溢出攻击过程。buffer
在填充的时候,由低地址向高地址
填充。
buffer
填充过量(溢出),就是栈溢出,当人为控制溢出的内容时,就是缓冲区溢出攻击
。
根据以上图,funcA
执行完毕后,根据return address
与name-parameter
执行bad func
了,而不是预计的funcA 的3行
,这就是缓冲区溢出攻击
。
reversing-enging-0x01