地址固定,且libc已知,则直接ret至libc的shellcode即可。
若开启了canary保护,则需要先通过栈溢出,泄露canary(即题目中必须有两处越界才行。第一次泄露canary,第二次才是劫持运行逻辑),然后利用canary,劫持运行逻辑至libc的shellcode。
若开启了canary,则需要先通过栈溢出,泄露canary(即题目中必须有两处越界才行。第一次泄露canary,第二次才是劫持运行逻辑),然后利用canary,劫持运行逻辑,泄露syscall地址或libc(system()、”/bin/sh”)地址,然后再次劫持到前面泄露的地址
writeup中,使用的是泄露syscall的方式;可以尝试泄露libc的方式编写shellcode。
泄露某个libc函数地址,然后根据偏移,计算出system地址、/bin/sh地址,然后再次劫持运行逻辑,准备参数,跳转至system。
通过 Memory Leak & DynELF 内存泄露技术,可以主动搜索libc中的system()地址。
但是无法泄露”/bin/sh”地址,还需要read来输入到.bss段;然后再劫持到 system()地址。最终获取shell
由于canary是栈溢出的第一步防线,想绕过canary,是不是要求题目中给出两次栈溢出场景才行?
第一次,泄露canary值;
第二次,真正利用栈溢出来劫持程序逻辑。
问题是,如果题目没有两次栈溢出的话,如何绕过canary?
[注意]看雪招聘,专注安全领域的专业人才平台!
pwnda emmmm,因程序功能各异吧,而且canary开启的时候正常的栈溢出都没法利用,何来一次泄露canary,一次劫持控制流?
callmexxaqer 如果两次栈溢出时,题目本来就有write或printf来输出缓冲区,就可以把canary泄露了;之前有个题就是这样的。 那大侠觉得应该怎么绕过canary呢?