Skip to main content

栈溢出入门小技巧

这些技巧都是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,最近才去认真看了一下,解决了我很多疑问。