[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.pswp.cn/web/75448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75448.shtml
英文地址,請注明出處:http://en.pswp.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. 配置文件生…