栈溢出

Author Avatar
Aryb1n 4月 14, 2017

人家的文章写的就是好

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 + … , 因为\x90nop
前提是在函数调用栈上的数据(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

要复习考试了,暂停中