初识shellcode
以前只是知道shellcode就是一段恶意代码,直到今天学习了shellcode的知识,才发现这东西真是博大精深。同时也学习到了一些新的指令,在这里记录一下。
通常pwn题目就是为了拿到shell,目前我理解的system其实就是系统调用的一个封装。对于获取shell的获取,需要执行这么一个命令。
execve("/bin/sh",null,null)
这行代码用系统调用来执行,大概意思就是(这里用我理解的伪代码)int 0x80 (eax,ebx,ecx,edx......),意思就是,先把数据保存在寄存器中,然后调用int 0x80,就是调用了系统函数,网上有一份系统调用的表格,我挑几个常用的函数粘贴过来。
|
%eax |
Name |
Source |
%ebx |
%ecx |
%edx |
%esx |
%edi |
|
1 |
sys_exit |
kernel/exit.c |
int |
- |
- |
- |
- |
|
3 |
sys_read |
unsigned int |
char * |
size_t |
- |
- |
|
|
4 |
sys_write |
fs/read_write.c |
unsigned int |
const char * |
size_t |
- |
- |
|
5 |
sys_open | fs/open.c | const char * | int | int | - | - |
| 11 | sys_execve | arch/i386/kernel/process.c | struct pt_regs | - | - | - | - |
这里我们试着写一个常用的shellcode。
假设0x400500这个地址存放着“/bin/sh”的字符串。
1 mov eax,0xb
2 lea ebx,[0x400500]
3 mov ecx,0x0
4 mov edx,0x0
5 int 0x80
这就是最简单的shellcode 了,有时候为了免杀,躲过一些保护。经常将shellcode写成其他形式的。例如这种:
1 jmp sh
2 run:
3 pop ebx
4 mov BYTE [ebp+7],0
5 xor eax,eax
6 mov al,11
7 xor ecx,ecx
8 xor edx,edx
9 int 0x80
10 sh:
11 call run
12 db"/bin/sh"
我们试着来编写一个shellcode的文件,试试,顺便还能学习很多东西。
编译汇编需要装一个nasm,用这个命令就可以(ubuntu):sudo apt-get install nasm
编译的命令是:nasm a.asm -o a.o -felf32
生成a.o,这个文件其实是包含一些文件头呀什么乱七八杂的东西,并不是我们单纯输入的代码,这个时候用objcopy命令来去除那些没用的代码。命令是:objcopy -O binary a.o code
我们来对比一个两个文件的大小,和看看里面的内容。

明显的看出第一个比第二个代码量少了很多很多。
顺便再学个命令:xxd可以用来显示一些二进制文件。加上参数 -i后显示是这样的。

上面的这个代码有什么用呢。。。这里是可以套用一个模板,来生成可执行文件的。
模板如下:
1 unsigned char code[] = {
2 0xeb, 0x0f, 0x5b, 0xc6, 0x45, 0x07, 0x00, 0x31, 0xc0, 0xb0, 0x0b, 0x31,
3 0xc9, 0x31, 0xd2, 0xcd, 0x80, 0xe8, 0xec, 0xff, 0xff, 0xff, 0x2f, 0x62,
4 0x69, 0x6e, 0x2f, 0x73, 0x68
5 };
6
7 typedef int (*CODE)();
8
9 int main(){
10 ((CODE)code)();
11 }
code数组里面存的就是我们生成的shellcode。
再用gcc的命令生成可执行文件试试,命令为:gcc code.c -o code -m32 -zexecstack
看一下效果。

当然还有一种方法,是将去除头文件信息的那个文件生成一个.h的头文件。
命令如下:xdd -i scode > scode.h
接下来就是写c代码了。代码很简单,和刚刚几乎一样。
1 #include "code.h"
2
3 typedef int (*CODE)();
4
5 int main(){
6
7 ((CODE)code)();
8
9 }
再次编译一下,发现还是可以拿到shell,好了,今天就到这里,感觉学到了很多。
初识shellcode的更多相关文章
- 跟羽夏学 Ghidra ——初识
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
随机推荐
- Error filterStart
一般原因为:1.xml配置失误filter应配置在servlet-mapping前面(应该都知道吧).看看class配的 别找不到.2.filter中某段代码未实例化(这个情况是出现最多的,要仔细检查 ...
- SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(上)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们来测试下前面封装好的 WebClient,这里开始,我们使用 spock 编写 gro ...
- [IIS]文件夹权限
发布完iis,默认的 Application Pool 没有权限访问文件夹. 可以给项目文件夹添加用户权限. 右键 - "属性" - "安全" - " ...
- Mac更换鼠标指针样式_ANI、CUR文件解析
前情提要 因为之前写了一篇mousecape的博客有一些回应,所以我决定写个续.主要是教大家怎么把cur文件和ani文件插入到mousecape里面,顺便提供几个做好的cape文件. 先给大家推荐一个 ...
- bcftools 提取vcf(snp/indel)文件子集
做群体变异检测后,通常会有提取子集的操作,之前没有发现bcftools有这个功能,都是自己写脚本操作,数据量一上来,速度真的是让人无语凝噎.这里记录下提取子vcf文件的用法,软件版本:bcftools ...
- [R报错] Kruskal-wallis test 所有组的层次都必需是有限的
做了个两组间的Kruskal-wallis检验,出现如下错误: 对应的英文版本错误为: All group levels must be finite is.finite(data$type)一下果然 ...
- R语言与医学统计图形-【20】ggplot2图例
ggplot2绘图系统--图例:guide函数.标度函数.overrides.aes参数 图例调整函数guide_legend也属于标度函数,但不能单独作为对象使用,即不能如p+guide_legen ...
- C语言计算fastq文件GC含量2
改进了一下,利用zlib可以读取gz格式的压缩文件,也可以直接计算非压缩格式 #include <stdio.h> #include <stdlib.h> #include & ...
- java中的Arrays类
今天刚接触了数组,学到了几个比较常用的方法 Fill方法:给数组赋值 sort方法:给数组升序 equals方法:比较数组中元素 值是否相等 binarySearch方法:对排序好的数组进行二分查找法 ...
- 使用SpringBoot实现文件的下载
上一篇博客:使用SpringBoot实现文件的上传 已经实现了文件的上传,所以紧接着就是下载 首先还是html页面的简单设计 <form class="form-signin" ...