栈溢出
人家的文章写的就是好
http://paper.seebug.org/271/
http://paper.seebug.org/272/
名词
内存布局随机化(ASLR): 一个会妨碍我们进行攻击的措施,字面意思
内存布局
+++++++++++++++++++++++++ high Add
Return Address return to F's F's next sentence
------------------------ 0xA
Caller's Caller's EBP F'F
------------------------ 0xB
some state about Caller F's data
------------------------ 0xC
Callee's Arg Child's arg
------------------------ 0xD
Return Address return to F's next sentence
------------------------ 0xE
Caller's EBP *save Callers's data basis Adddress, is not now EBP(is this Addr)
------------------------ 0xF
Local Var Child's data
++++++++++++++++++++++++ low Add
Caller’s EBP 那个地址0xF
存的那个数据0xB
是Caller的基地址
但那个地址正好是0xF
正好是Callee的基地址(也许是0xE
???)
四种栈溢出
利用姿势
一个注意的点是payload里不要包含0x00
,会被截断的
修改返回地址,让其指向溢出数据中的一段指令(shellcode)
修改返回地址,让其指向内存中已有的某个函数(return2libc)
修改返回地址,让其指向内存中已有的一段指令(ROP)
修改某个被调用函数的地址,让其指向另一个函数(hijack GOT)
Shellcode
payload : padding1 + address of shellcode + padding2 + shellcode
padding1: 通常都是可随意填写,调试确定具体长度
一般的,可能无法确定padding2的具体大小,所以会填充若干\x90
padding2: \x90 + \x90 + … , 因为\x90
是nop
前提是在函数调用栈上的数据(shellcode)要有可执行的权限(另一个前提是上面提到的关闭内存布局随机化)
Return2libc
payload : padding1 + address of system() + padding2 + address of “/bin/sh”
padding1: 能随意填写,调试确定呢具体长度
padding2: 数据长度为4(32位机),对应调用 system() 时的返回地址。
其实不是很理解这个padding2, padding2的这个位置不应该是system
函数的第一个参数吗
不是应该直接填写/bin/sh
吗0.0 不太懂….先跳过吧
因为我们在这里只需要打开 shell 就可以,并不关心从 shell 退出之后的行为,所以 padding2 的内容可以随意填充。
ROP
payload : padding + address of gadget 1 + address of gadget 2 + …… + address of gadget n
在这样的构造下,被调用函数返回时会跳转执行 gadget 1,执行完毕时 gadget 1 的 RET 指令会将此时的栈顶数据(也就是 gadget 2 的地址)弹出至 eip,程序继续跳转执行 gadget 2,以此类推。
为了拼凑代码段,以执行一次系统调用,帅气~
Hijack GOT
要复习考试了,暂停中