0x7 shellcode 提取技巧这里参照 https://www.commandlinefu.com/commands/view/6051/get-all-shellcode-on-binary-file-from-objdump
objdump -d ./test|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-7 -d' ' | tr -s ' '|tr 't' ' '|sed 's/ $//g'|sed 's/ /\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'

文章插图
0x04 验证技巧走到这一步的大哥们都已经编好了自己的shellcode,开始磨刀霍霍向牛羊了,这里介绍两种常用的检查shellcode功能的方法,内联汇编和函数指针 。
0x0 关闭栈不可执行因为在测试时,shellcode在bss段,在关闭NX编译选项之后bss段也拥有了可执行属性,具体操作如下 。
注意在编译的时候加上 -z execstack
gcc -o test test.c -z execstack
文章插图

文章插图
0x1 内联汇编在linux 下的C语言中主要采用的是 att格式的汇编,这里有个坑,一开始没接触c内联att格式汇编的小盆友们要注意了jmp eax的写法为jmp *%rax
#include<stdio.h>char shellcode[] = "xb8x01x00x00x00xbfx01x00x00x00xebx0ax5exbax05x00x00x00x0fx05xebx0bxe8xf1xffxffxffx48x65x6cx6cx6fx0axb8x3cx00x00x00xbfx00x00x00x00x0fx05";int main(int argc, char **argv){__asm__("lea shellcode,%eax;jmp *%rax");return 0;}如图中代码所示,rip已经指向jmp rax指令此时的rax就是shellcode那段字符串的地址 。因为这段内存拥有可执行,最后成功执行shellcode 。
文章插图
0x2 函数指针第二种方法大同小异,也是将shellcode放在程序的bss段上,利用之前的编译指令编好后调试 。
#include<stdio.h>#include<string.h>unsigned char shellcode[] = "xb8x01x00x00x00xbfx01x00x00x00xebx0ax5exbax05x00x00x00x0fx05xebx0bxe8xf1xffxffxffx48x65x6cx6cx6fx0axb8x3cx00x00x00xbfx00x00x00x00x0fx05";int main(void){int (*func)() = (int(*)())shellcode;func();}
文章插图
在上述汇编代码中可以看出将shellcode 的地址赋值给了rdx寄存器,后续直接call调用 。
0x05 总结简单的记录了常见shellcode功能编写测试方法,本文介绍的还是比较宽泛,也只针对64位系统进行分析,之后会把其他架构还有x86的利用方式慢慢补齐,还请大佬们多指点指点 。
0x06 参考文献https://filippo.io/linux-syscall-table/
https://xz.aliyun.com/t/2052
http://www.vividmachines.com/shellcode/shellcode.html
https://blog.csdn.net/littlehedgehog/article/details/2653743
欢迎登录安全客 -有思想的安全新媒体www.anquanke.com/加入交流群113129131 获取更多最新资讯
原文链接: https://www.anquanke.com/post/id/216207
【带你玩转 Linux Shellcode】
推荐阅读
- 在Linux中查找已连接网络的WiFi密码
- 呕心沥血整理的linux服务器一条龙服务
- Linux select/poll机制原理分析
- Linux安全技巧汇总,防止扫描,禁止空密码,强制用V2等
- 使用growpart工具完成Linux系统盘分区扩容
- Linux下如何知道是否有人在使坏?
- 树莓派无屏上手指南
- linux操作系统上安装docker
- 黑客大神秘籍:Linux下Hook方式汇总
- 黑客大神谈一谈Linux与suid提权
