0x00 介绍

Shellcode 是指经过精心设计的一串指令,一旦注入正在运行的应用程序中即可运行,常用于栈和基于堆的溢出。术语Shellcode意思指的便是用于启动一个命令Shell的已编写好的可执行代码。

0x01 预写c调用程序

在linux中以C编写程序调用"/bin/sh"。

#include "unistd.h"
#include "stdio.h"char * buff[] = {"/bin/sh", NULL};
void main(){execve("/bin/sh", buff, NULL);
}

以execve开启一个bash进程,调用路径为/bin/sh。
注:/bin/sh是一个指向dash的符号链接,实际运行的也是dash程序,dash即移植到linux的bash,比bash更小也更快。[#!/bin/bash和#!/bin/sh是什么意思以及区别]

0x02 gdb调试

以gdb打开编译好的文件,我调试的文件的为32-bit的,在64-bit中可以在gcc加上参数-m32即可编译为32-bit elf文件。(gcc-multilib)

图中 1 处调用execve函数,通过plt表调用,而 2 处栈中已将参数压入,分别为程序路径、参数数组、环境变量数组(此处为NULL)。
接着跟进,找到execve是怎么调用的:


可以看到在0xf7e8b68d处赋予eax值0xb,0xb(11)为execve的系统调用号。下一步执行到系统调用中断(call dword ptr gs:0x10)时,ebx指向的是“/bin/sh”字符串,ecx指向的是{“/bin/sh”,NULL}数组,edx为0。于是execve在32位linux系统中的参数传递方式为“参数1->ebx;参数2->ecx;参数3->edx”。
call *%gs:0x10 call will __kernel_vsyscall
32位的中断调用可采用int 80;而64位可采用syscall。

elf32函数系统调用号查看方式:cat /usr/include/x86_64-linux-gnu/asm/unistd_32.h | grep execve

64位查看:cat /usr/include/x86_64-linux-gnu/asm/unistd_64.h | grep execve

0x03 编写汇编代码

最终只有一个目的,就是使得参数存入寄存器,然后系统调用。

section .text
global _start
_start:xor   eax, eaxpush  eax                  ; 字符串结尾 ==> NULLpush  "//sh"               ; '/bin//sh'push  "/bin"mov   ebx,esp              ; '/bin//sh' addresspush  eax                  ; push 0push  ebx mov   ecx,esp              ; array of argvsxor   edx,edx              ; edx = 0mov   al,0x0b             ; call execveint 80h

编译:nasm -f elf32 -o test32 ./call_execve.asm
链接:ld -m elf_i386 -o atest ./test32
执行:


执行成功!
然后提取shellcode,objdump -d atest:

Shellcode:"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

然后用C代码测试shellcode是否可用。

#include "unistd.h"
#include "stdio.h"void main(){char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80";(*(void(*)())shellcode)();
}

其中的(*(void(*)())shellcode)();也可替换成((void(*)())shellcode)();,测试之后没有问题。在网上查找资料之后发现数据指针的*value操作符是取value地址下的数据,而在函数指针中*value则是将eip移至value地址处进行执行,而比如平时写程序的函数func();func也指向一个函数存储的位置,但是缺省了*

编译并执行:gcc -z execstack -m32 -o ssssss shellcode_run_execve.c


成功运行,但是得加上 -z execstack关闭NX,因为shellcode作为局部变量存于栈上。

0x04 总结

这是新的尝试,收获良多,计算机底层知识很重要。

0x05 参考文章

手把手简易实现shellcode及详解

转载于:https://www.cnblogs.com/zUotTe0/p/10527129.html

简单shellcode编写相关推荐

  1. WINDOWS的SHELLCODE编写高级技巧

    WINDOWS的SHELLCODE编写高级技巧 unix等系统因为有用户概念,所以往往溢出是使用先得到普通帐号,然后登陆后用溢出 再加载一个SHELL的办法得到ROOT权限,其系统调用又方便,所以SH ...

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

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

  3. windows 平台shellcode编写

    0x00.介绍 比方说你手头上有一个IE或FlashPlayer现成的漏洞利用代码,但它只能够打开计算器calc.exe.但是这实际上并没有什么卵用,不是吗?你真正想要的是可以执行一些远程命令或实现其 ...

  4. 溢出的原理及 shellcode 编写

    本讲的预备知识: 首先你应该了解intel汇编语言,熟悉寄存器的组成和功能.你必须有堆栈和存储分配方面 的基础知识,有关这方面的计算机书籍很多,我将只是简单阐述原理,着重在应用.其次, 你应该了解li ...

  5. 【移动安全高级篇】————3、Android系统ShellCode编写

    随着Android手机的普及,Android系统安全日益受人关注.漏洞攻防是安全的一大课题,其中自然少不了shellcode的编写.本文将以提出问题.解决问题的方式教你如何编写Android系统she ...

  6. windows下shellcode编写入门

    0x00.介绍 比方说你手头上有一个IE或FlashPlayer现成的漏洞利用代码,但它只能够打开计算器calc.exe.但是这实际上并没有什么卵用,不是吗?你真正想要的是可以执行一些远程命令或实现其 ...

  7. c语言最简单的程序编写,C语言简单程序编写.doc

    C语言简单程序编写 项目一 C语言简单程序编写 1.1学习目标 本项目达到的目标为: 掌握程序设计的基本思路 掌握C语言的基本结构 了解流程图的符号含义 掌握C语言的关键字 会设计和编写简单的C应用程 ...

  8. Soul网关源码阅读(十)自定义简单插件编写

    Soul网关源码阅读(十)自定义简单插件编写 简介     综合前面所分析的插件处理流程相关知识,此次我们来编写自定义的插件:统计请求在插件链中的经历时长 编写准备     首先我们先探究一下,一个P ...

  9. C++ 17 标准正式发布:终于能更简单地编写和维护代码了!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 何为 C++ 17? C++17 是继 C++14 之后,C++ 编程语言 ISO/IEC ...

  10. 量化交易入门之vnpy简单策略编写

    本篇博客将介绍量化交易框架vnpy的简单策略编写.在阅读本博客前的环境准备请看我的上一篇博客.传送门如下: 零基础搭建量化交易框架 一.开发环境 因为python版本兼容有点差,且源码功能都有所变化, ...

最新文章

  1. [转] 先验概率and后验概率
  2. python打开excel表格-如何从python中用excel打开excel工作表?
  3. C# 单元测试简单入门
  4. 游戏详细设计说明书_宜家的说明书设计脑洞太大了!
  5. 分区变为RAW的解决办法
  6. 代码规范之prettier+eslint实践
  7. 简要分析unity3d中剪不断理还乱的yield
  8. 计算机c盘用户里的APPDATA,Windows7系统C盘中的appdata文件夹是否可以删除
  9. 嵌入式软件工程师对linux要求,嵌入式软件工程师的必备知识
  10. 安装SQL Server 2000时“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误的排除
  11. js+html代码设置,HTML+JS = 网站注册界面源代码(示例代码)
  12. 摊上事儿的网易邮箱和安全圈的那些“防御机制”
  13. 安卓街机模拟器 MAME4droid 源码,只需要自己加入rom 可以发布到安卓市场了。
  14. python bind_all_tkinter事件之bind
  15. 【案例 5-1】 模拟订单号生成
  16. 迅雷赚钱宝一代二代(pro)固件大全
  17. java htmlunit 模拟输入_教大家用HtmlUnit实现程序模拟页面表单提交
  18. 《UG NX10中文版完全自学手册》——1.2 工作环境
  19. Android中的颜色值
  20. linux控制cache使用值e,[轉]Linux塊設備加速緩存bcache和dm-cache:使用SSD來加速服務器...

热门文章

  1. 日语输入法电脑版_如何安装日语输入法?(手机/电脑安装使用指南)
  2. 【渝粤教育】国家开放大学2018年秋季 0708-22T互联网创业基础 参考试题
  3. [渝粤教育] 广东-国家-开放大学 21秋期末考试管理学原理★10013k1
  4. [渝粤教育] 西南科技大学 试验统计方法 在线考试复习资料2021版
  5. 工具使用教程 (一)【Git从原理到入门实用教程】
  6. 通过elasticsearch对日志进行搜索热词统计
  7. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)
  8. mui真机调试时无法查找到手机
  9. 扩展 MongoDB.Driver 支持实体
  10. 转:Raft一致性选举算法的ppt与视频