这些技巧都是hgame-mini的文档里面的内容,我只是做一下汇总,当作我自己的笔记了
对于栈溢出拿shell应该有两步(我将使用攻防历史线来叙述,对于每一个在上面的,下面那个就必能解决)
一,能溢出到返回地址
防御技巧:通过在返回地址前放canary
攻击技巧:通过输出函数尝试泄露canary
二,拿shell,1.调用system函数,2.传入’bin/sh’字符串地址
攻击技巧:在栈上或者bss段写shellcode
防御技巧:NX,栈不可执行
攻击技巧1:ROP
攻击技巧2:ret2text,返回地址修改为text段的system函数,rop链把rdi设置成’bin/sh’地址
防御技巧1->2:text段不给system函数
防御技巧2->1,2:地址随机化ASLR
攻击技巧1->2:ret2text,通过之前的返回地址可以泄露某个绝对地址,再计算出其他地址
攻击技巧2->1,2:ret2libc,通过输出函数,泄露输出函数的绝对地址,泄露libc的基地址,调用libc中的system函数
攻击技巧3->1,2:ret2syscall,直接修改rax值使用系统调用,甚至无需system函数
上述基本上是调用system函数的技巧,如果要shell的话,必须让rdi传入bin/sh字符串的地址。以下是一些基本技巧
1.寻找有无现成的bin/sh字符串,并能够获取其地址
2.若是有办法知道栈地址(尝试泄露栈上脏数据),考虑在栈上自己写bin/sh
3.若是能知道libc的地址,可以使用里面现成的的bin/sh
4.考虑有无现成的输入函数可以写bin/sh字符串,并且知道其地址
之后可能根据我遇到的情况还会添加
推荐一个网站:ctf_wiki,最近才去认真看了一下,解决了我很多疑问。