[WUSTCTF2020]level1

关键知识点:for汇编

ida64打开:

00400666 55                            push    rbp
.text:0000000000400667 48 89 E5                      mov     rbp, rsp
.text:000000000040066A 48 83 EC 30                   sub     rsp, 30h
.text:000000000040066E 64 48 8B 04 25 28 00 00 00    mov     rax, fs:28h
.text:0000000000400677 48 89 45 F8                   mov     [rbp+var_8], rax                ; arg=rax
.text:000000000040067B 31 C0                         xor     eax, eax                        ; eax=0
.text:000000000040067D BE C4 07 40 00                mov     esi, offset modes               ; esi=r
.text:0000000000400682 BF C6 07 40 00                mov     edi, offset filename            ; "flag"
.text:0000000000400687 E8 C4 FE FF FF                call    _fopen
.text:0000000000400687
.text:000000000040068C 48 89 45 D8                   mov     [rbp-28h], rax                  ; lo1= rax
.text:0000000000400690 48 8B 55 D8                   mov     rdx, [rbp+stream]               ; rdx = lo1
.text:0000000000400694 48 8D 45 E0                   lea     rax, [rbp-20h]                  ; rax=addr(lo2)
.text:0000000000400698 48 89 D1                      mov     rcx, rdx                        ; stream
.text:000000000040069B BA 14 00 00 00                mov     edx, 14h                        ; n
.text:00000000004006A0 BE 01 00 00 00                mov     esi, 1                          ; size
.text:00000000004006A5 48 89 C7                      mov     rdi, rax                        ; ptr
.text:00000000004006A8 E8 53 FE FF FF                call    _fread
.text:00000000004006A8
.text:00000000004006AD 48 8B 45 D8                   mov     rax, [rbp+stream]
.text:00000000004006B1 48 89 C7                      mov     rdi, rax                        ; stream
.text:00000000004006B4 E8 57 FE FF FF                call    _fclose
.text:00000000004006B4
.text:00000000004006B9 C7 45 D4 01 00 00 00          mov     [rbp+var_2C], 1                 ; lo3=1
.text:00000000004006C0 EB 59                         jmp     short loc_40071B                ; if/while/for
.text:00000000004006C0
.text:00000000004006C2                               ; ---------------------------------------------------------------------------
.text:00000000004006C2
.text:00000000004006C2                               loc_4006C2:                             ; CODE XREF: main+B9↓j
.text:00000000004006C2 8B 45 D4                      mov     eax, [rbp+var_2C]               ; eax = lo3 = 1
.text:00000000004006C5 83 E0 01                      and     eax, 1                          ; eax = eax & 1
.text:00000000004006C8 85 C0                         test    eax, eax                        ; eax&eax
.text:00000000004006CA 75 24                         jnz     short loc_4006F0                ; if eax=0 , jmp
.text:00000000004006CA
.text:00000000004006CC 8B 45 D4                      mov     eax, [rbp+var_2C]               ; eax=lo3
.text:00000000004006CF 48 98                         cdqe
.text:00000000004006D1 0F B6 44 05 E0                movzx   eax, [rbp+rax+ptr]              ; eax = [rbp + lo3 +ptr]
.text:00000000004006D6 0F BE C0                      movsx   eax, al                         ; edx = al
.text:00000000004006D9 0F AF 45 D4                   imul    eax, [rbp+var_2C]               ; eax * lo3
.text:00000000004006DD 89 C6                         mov     esi, eax
.text:00000000004006DF BF CB 07 40 00                mov     edi, offset format              ; "%ld\n"
.text:00000000004006E4 B8 00 00 00 00                mov     eax, 0
.text:00000000004006E9 E8 42 FE FF FF                call    _printf
.text:00000000004006E9
.text:00000000004006EE EB 27                         jmp     short loc_400717
.text:00000000004006EE
.text:00000000004006F0                               ; ---------------------------------------------------------------------------
.text:00000000004006F0
.text:00000000004006F0                               loc_4006F0:                             ; CODE XREF: main+64↑j
.text:00000000004006F0 8B 45 D4                      mov     eax, [rbp+var_2C]               ; eax = lo3 =1
.text:00000000004006F3 48 98                         cdqe                                    ; Convert Doubleword to Quadword Extended
.text:00000000004006F5 0F B6 44 05 E0                movzx   eax, [rbp+rax+ptr]              ; eax = [rbp + lo3 +ptr]
.text:00000000004006FA 0F BE D0                      movsx   edx, al                         ; edx = al
.text:00000000004006FD 8B 45 D4                      mov     eax, [rbp+var_2C]               ; eax = lo3
.text:0000000000400700 89 C1                         mov     ecx, eax                        ; ecx = lo3
.text:0000000000400702 D3 E2                         shl     edx, cl                         ; edx < cl
.text:0000000000400704 89 D0                         mov     eax, edx                        ; eax = edx
.text:0000000000400706 89 C6                         mov     esi, eax                        ; esi=eax
.text:0000000000400708 BF CB 07 40 00                mov     edi, offset format              ; "%ld\n"
.text:000000000040070D B8 00 00 00 00                mov     eax, 0
.text:0000000000400712 E8 19 FE FF FF                call    _printf
.text:0000000000400712
.text:0000000000400717
.text:0000000000400717                               loc_400717:                             ; CODE XREF: main+88↑j
.text:0000000000400717 83 45 D4 01                   add     [rbp+var_2C], 1
.text:0000000000400717
.text:000000000040071B
.text:000000000040071B                               loc_40071B:                             ; CODE XREF: main+5A↑j
.text:000000000040071B 83 7D D4 13                   cmp     [rbp+var_2C], 13h               ; if lo3 > 19
.text:000000000040071F 7E A1                         jle     short loc_4006C2                ; goin content
.text:000000000040071F
.text:0000000000400721 B8 00 00 00 00                mov     eax, 0
.text:0000000000400726 48 8B 4D F8                   mov     rcx, [rbp+var_8]
.text:000000000040072A 64 48 33 0C 25 28 00 00 00    xor     rcx, fs:28h
.text:0000000000400733 74 05                         jz      short locret_40073A
.text:0000000000400733
.text:0000000000400735 E8 E6 FD FF FF                call    ___stack_chk_fail
.text:0000000000400735
.text:000000000040073A                               ; ---------------------------------------------------------------------------
.text:000000000040073A
.text:000000000040073A                               locret_40073A:                          ; CODE XREF: main+CD↑j
.text:000000000040073A C9                            leave
.text:000000000040073B C3                            retn
.text:000000000040073B                               ; } // starts at 400666

主要功能:

for ( i = 1; i <= 19; ++i )
{if ( (i & 1) != 0 )printf("%ld\n", (unsigned int)(ptr[i] << i));elseprintf("%ld\n", (unsigned int)(i * ptr[i]));
}

for汇编特征:

#1,赋值
mov     [rbp+var_2C], 1                 ; lo3=1
jmp     short loc_40071B                ; if/while/for#3,循环内容
loc_4006C2:                             ; CODE XREF: main+B9↓j
mov     eax, [rbp+var_2C] 
...#4,累加变量,然后继续到2
add     [rbp+var_2C], 1#2,判断条件
cmp     [rbp+var_2C], 13h               ; if lo3 > 19
jle     short loc_4006C2

还原代码获取flag

随题附件有个output.txt,所以把它当输入flag文件,更改for中逻辑相反即可:

def main():# Open the file and read line by linewith open("output.txt", "r") as f:i = 1result = ""for line in f:  # Loop through each line in the fileptr = line.strip()  # Remove any trailing newline charactersvalue = int(ptr)  # Convert character to integerprint(value)if value == 0: continueif i % 2 != 0:  # If i is oddc = value >> i  # Right shift the integer valueelse:  # If i is evenc = value // i  # Divide the integer value by ii = i + 1result += chr(c)# Print the accumulated result after processing all linesprint(result)
if __name__ == "__main__":main()

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

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

相关文章

cpp自学 day20(文件操作)

基本概念 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放 通过文件可以将数据持久化 C中对文件操作需要包含头文件 <fstream> 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的…

Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商

攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…

备赛蓝桥杯-Python-考前突击

额&#xff0c;&#xff0c;离蓝桥杯开赛还有十个小时&#xff0c;最近因为考研复习节奏的问题&#xff0c;把蓝桥杯的优先级后置了&#xff0c;突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了&#xff0c;再补充一些常用函数供明天考前再背背&#xff0c;算…

榕壹云外卖跑腿系统:基于Spring Boot+MySQL+UniApp的智慧生活服务平台

项目背景与需求分析 随着本地生活服务需求的爆发式增长&#xff0c;外卖、跑腿等即时配送服务成为现代都市的刚性需求。传统平台存在开发成本高、功能定制受限等问题&#xff0c;中小企业及创业团队极需一款轻量级、可快速部署且支持二次开发的外卖跑腿系统。榕壹云外卖跑腿系统…

使用Docker安装Gogs

1、拉取镜像 docker pull gogs/gogs 2、运行容器 # 创建/var/gogs目录 mkdir -p /var/gogs# 运行容器 # -d&#xff0c;后台运行 # -p&#xff0c;端口映射&#xff1a;(宿主机端口:容器端口)->(10022:22)和(10880:3000) # -v&#xff0c;数据卷映射&#xff1a;(宿主机目…

【antd + vue】Modal 对话框:修改弹窗标题样式、Modal.confirm自定义使用

一、标题样式 1、目标样式&#xff1a;修改弹窗标题样式 2、问题&#xff1a; 直接在对应css文件中修改样式不生效。 3、原因分析&#xff1a; 可能原因&#xff1a; 选择器权重不够&#xff0c;把在控制台找到的选择器直接复制下来&#xff0c;如果还不够就再加&#xff…

Streamlit在测试领域中的应用:构建自动化测试报告生成器

引言 Streamlit 在开发大模型AI测试工具方面具有显著的重要性&#xff0c;尤其是在简化开发流程、增强交互性以及促进快速迭代等方面。以下是几个关键点&#xff0c;说明了 Streamlit 对于构建大模型AI测试工具的重要性&#xff1a; 1. 快速原型设计和迭代 对于大模型AI测试…

docker 运行自定义化的服务-后端

docker 运行自定义化的服务-前端-CSDN博客 运行自定义化的后端服务 具体如下&#xff1a; ①打包后端项目&#xff0c;形成jar包 ②编写dockerfile文件&#xff0c;文件内容如下&#xff1a; # 使用官方 OpenJDK 镜像 FROM jdk8:1.8LABEL maintainer"ATB" version&…

解决java使用easyexcel填充模版后,高度不一致问题

自定义工具&#xff0c;可以通过获取上一行行高设置后面所以行的高度 package org.springblade.modules.api.utils;import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.wr…

repo仓库文件清理

1. repo 仓库内文件清理 # 清理所有Git仓库中的项目 repo forall -c git clean -dfx # 重置所有Git 仓库中的项目 repo forall -c git reset --hard 解释&#xff1a; repo forall -c git clean -dfx&#xff1a; repo forall 是一个用于在所有项目中执行命令的工具。-c 后…

结合大语言模型整理叙述并生成思维导图的思路

楔子 我比较喜欢长篇大论。这在代理律师界被视为一种禁忌。 我高中一年级的时候因为入学成绩好&#xff08;所在县榜眼名次&#xff09;&#xff0c;直接被所在班的班主任任命为班长。我其实不喜欢这个岗位。因为老师一来就要提前注意到&#xff0c;要及时喊“起立”、英语课…

spark-core编程2

Key-Value类型&#xff1a; foldByKey 当分区内计算规则和分区间计算规则相同时&#xff0c;aggregateByKey 就可以简化为 foldByKey combineByKey 最通用的对 key-value 型 rdd 进行聚集操作的聚集函数&#xff08;aggregation function&#xff09;。类似于aggregate()&…

原理图设计准备:页面栅格模板应用设置

一、页面大小的设置 &#xff08;1&#xff09;单页原理图页面设置 首先&#xff0c;选中需要更改页面尺寸的那一页原理图&#xff0c;鼠标右键&#xff0c;选择“Schmatic Page Properties”选项&#xff0c;进行页面大小设置。 &#xff08;2&#xff09;对整个原理图页面设…

关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结

以下是关于异步消息队列的详细解析&#xff0c;涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结&#xff1a; 一、异步消息核心概念与JMS模式对比 1. 异步消息核心组件 组件作用生产者发送消息到消息代理&#xff08;如RabbitMQ、Kafka&#xff09;。消息代理中间…

【深度洞察】解码饮料行业破局点:场景革命

当东鹏特饮以 “大瓶装 防尘盖” 精准解决货车司机的场景化需求&#xff0c;当农夫山泉通过 “冷藏版东方树叶” 打开年轻白领的早餐场景 —— 这些现象级案例背后&#xff0c;是饮料行业底层逻辑的深刻变革&#xff1a;真正的市场增量&#xff0c;藏在对消费场景的极致拆解中…

二、TorchRec中的分片

TorchRec中的分片 文章目录 TorchRec中的分片前言一、Planner二、EmbeddingTable 的分片TorchRec 中所有可用的分片类型列表 三、使用 TorchRec 分片模块进行分布式训练TorchRec 在三个主要阶段处理此问题 四、DistributedModelParallel&#xff08;分布式模型并行&#xff09;…

如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?

MyBatis 提供了 ExecutorType.BATCH 类型&#xff0c;允许将多个 SQL 语句进行组合&#xff0c;最后统一执行&#xff0c;从而减少数据库的访问频率&#xff0c;提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点&#xff1a; 1. 配置 MyBatis 使…

Redis 字符串(String)详解

1. 什么是字符串类型 在 Redis 中&#xff0c;字符串&#xff08;String&#xff09; 是最基本的数据类型。它可以包含任何数据&#xff0c;比如文本、JSON、甚至二进制数据&#xff08;如图片的 Base64 编码&#xff09;&#xff0c;最大长度为 512 MB。 字符串在 Redis 中不…

Elasticsearch 系列专题 - 第四篇:聚合分析

聚合(Aggregation)是 Elasticsearch 的强大功能之一,允许你对数据进行分组、统计和分析。本篇将从基础到高级逐步讲解聚合的使用,并结合实际案例展示其应用。 1. 聚合基础 1.1 什么是聚合(Aggregation)? 聚合是对文档集合的统计分析,类似于 SQL 中的 GROUP BY 和聚合…

YOLO学习笔记 | YOLOv8 全流程训练步骤详解(2025年4月更新)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 这里写自定义目录标题 一、数据准备1. 数据标注与格式转换2. 配置文件生…