这篇笔记差不多是我一年前刚入门pwn时整理的,虽然现在还在入门……
Pwn入门,现在的程序段的权限区分已经非常清晰了,所以ret2shellcode这种需要执行权限的方式早已不适用了,但shellcode在后门、病毒方面也非常重要,所以还是总结下最基础的ret2shellcode。
Test.c

关闭栈保护、堆栈不可执行、地址随机化
1 | gcc -fno-stack-protector -z execstack -m32 test.c -o test -no-pie |
程序存在明显的栈溢出

又因为堆栈是可执行的,即可将buf填入shellcode,并溢出控制eip跳转回buf的起始地址

getshell Shellcode注意事项
1.一般情况下越短越好,编码后可能会变长,但免杀效果会变好
2.尽量避免坏字符’\x00’出现,因为’\x00’为字符串的结束符,在栈溢出过程中有strcpy等以字符串操作的情况下可能会导致shellcode执行失败
3.写入并使用shellcode时注意栈的可分配大小等因素,避免shellcode被污染
理论上来说,shellcode可以写在任何可以访问到的位置,且具执行权限,shellcode便会执行
这里再记录一点
起初我认为编译时手动加上参数-no-pie参数后即关闭了pie,但发现buf的地址还是不确定的,后来才发现使用echo 0 > /proc/sys/kernel/randomize_va_space 命令才是彻底关闭pie,此时buf的地址才不会改变,当pie开启时这个值为2。
例题:jarvis [XMAN]level1