攻防世界逆向刷題筆記(新手模式9-1?)

bad_python

看樣子是pyc文件損壞了。利用工具打開,發現是MAGIC壞了。搜下也沒有頭緒。

攻防世界-難度1- bad_python - _rainyday - 博客園

python Magic Number對照表以及pyc修復方法 - iPlayForSG - 博客園

看WP才知道36已經提示了pyc版本了。參考第二個文章,除了魔法數字還有8字節的額外信息。

但是我填充之后還是bad magic,再看看WP咋說的。原來代表文件大小的地方還不能為0.也就是第12個字節。

我們只需要修復一下就可以了。 媽的,用FF也不行,看來必須中規中矩才行。用E5成功了。、

?識別出是XTEA加密,寫出解密即可。后期我這又出問題了,這一步就不搞了吧

ereere

左邊沒有main了,依據start必定會出現main函數,一個個點找到了疑似main的函數。

base64換表+RC4。思路同攻防世界RE_ereere_攻防世界ereere-CSDN博客

用cyberchef解決的

easyEZbaby_app

定位到關鍵代碼。主要看checkpass和checkUsername函數

首先是username,密碼是zhishixuebao的MD5,以2為步長取。結果是:7afc4fcefc616ebd

pass則是如下。長度顯然是15位,注意算法要求是char數組=0,說明賦值等式右邊值是0(也就是48)。寫出Python代碼即可。

a=''
for i in range(15):a+=chr(((255 - i) + 2) - 98-48)
print(a)

toddler_regs?

導入pdb文件,放進IDA分析。

持續跟蹤,首先看到stage1,要求參數必須是要求的值,只能動調修改這個參數。

但是看起來沒啥用啊,看看stage2.

發現stage1的用處了,他會把黃框部分設置為23.我們直接找到這個對應的值即可。注意team是個字符串數組,我們導出來看看,直接在C里面運行吧。

第一個team輸出了:0Int

第二個代碼和上面一樣,結果是:nTJnU

組合起來就是flag{0Int_1s_n1c3_but_nTJnU_is_we1rd}

上面顯然是錯誤的,可能會遇到這個地方剛好是\0直接截斷。保險的做法是先定義好數組大小(如char[512][10],再直接去掉&運行即可)

exp:

也可以動調做,我電腦不知為何運行不起來這個軟件,只能靜態分析了。

easyre-xctf

看題目簡介估計有殼。是UPX原版殼,官方工具就可以脫殼了。

但并沒有明顯的算法,只在字符部分看到了疑似flag的后半段。雙擊這里有一個符號名part2。

動調看看有沒有提示,拿拿數據。

在內存發現了疑似的部分

根據其地址定位到函數,這就是第一個flag。函數名字有個part1,對應著part2.兩個16進制轉換為字符后就是part1.

七分靠猜,這里有運氣成分,正常來說估計得搜part1了。

CatFly(還沒有寫出來)

看主函數很復雜。慢慢來看吧。

運行出來是個這,輸入的東西會在左下角顯示。那么main函數有的部分就可以不看了。

看到一個提示:

要記住逃逸密碼??

難道是迷宮,分析這部分,\x1Bxxx是終端轉義啊,看著是打印圖形用的。

百思不得姐,還是看看WP吧。

re學習(29)攻防世界-CatFly(復原反匯編)_攻防世界catfly-CSDN博客

粗略瀏覽下發現沒有我想要的,不過突然想到可以給main函數拷貝到VC,刪去已知功能的函數再仔細分析看看。

暫時跳過,下次再看。

IgniteMe

跟進到主函數。

首先str長度需要大于4.

先來一個循環把str循環復制給v7。后兩個if判斷意思是大寫轉小寫,小寫轉大寫。

最關鍵的在后院嗎,str2我們已經知道了,這就是目標。byte我們也知道,目標就是求v7。接下來的sub_4013c0跟進一下。

?是一個表達式,相當于v7^0x55+72.那就很明顯了,寫出對應exp:

str2='GONDPHyGjPEKruv{{pj]X@rF'
byte=[ 0x0D, 0x13, 0x17, 0x11, 0x02, 0x01, 0x20, 0x1D, 0x0C, 0x02, 0x19, 0x2F, 0x17, 0x2B, 0x24, 0x1F, 0x1E, 0x16, 0x09, 0x0F, 0x15, 0x27, 0x13, 0x26, 0x0A, 0x2F, 0x1E, 0x1A, 0x2D, 0x0C, 0x22, 0x04]
flag=''
#根據str2猜測長度是24
for i in range(24):flag+=chr(((byte[i]^ord(str2[i]))-72)^0x55)
print(flag)
print(flag.lower())

出來的flag都是大寫,不要忘記兩個if判斷是大寫轉小寫小寫轉大寫,因此再次轉為小寫即可

BABYRE

main函數看著很簡單

需要注意:在 C 語言中,(*judge)(s)?這種語法表示通過函數指針調用函數。在 C 語言中,函數名本質上是指向函數代碼起始地址的指針。可以將這個地址存儲在一個函數指針變量中,然后通過該變量調用函數。

也就是說這是一段自修改代碼。judge是函數,需要解密這段judge。

先用AI生成(因為我不太會IDA python)一段解密的腳本在IDA運行,然后C--P加載為函數即可

import idautils
import idaapibase = 0x600b00# 處理182個字節(與原始代碼一致,0到181共182次)
for i in range(182):# 讀取原始字節original_byte = idaapi.get_byte(base + i)# 異或解密decrypted_byte = original_byte ^ 0xC# 寫入解密后的字節idaapi.patch_byte(base + i, decrypted_byte)# 標記為數據(這一行刪了就行)無用idaapi.create_data(base + i, FF_BYTE, 1, idaapi.BADADDR)print(f"已解密 {base:X} 開始的182個字節")

再次從main函數進入judge即可了。?直接點進去judge好像部分代碼還是錯誤,重新從main進去就好了。

這個加密邏輯就很明顯了。

a='fmcd\x7Fk7d;V`;np'
flag=''
for i in range(len(a)):flag+=chr(ord(a[i])^i)
print(flag)

parallel-comparator-200

這一題直接給了C代碼。有點意思。

注意到代碼的flag_len是20.

首先認識一個新函數

逐步分析,main函數調用了下圖的highly_.....函數。

跟進此函數。根據is_ok的判斷條件,著重關注此部分,說明result值是0.因為is_ok的條件為generated==just_a_string。

查找用到result的地方。注意到只有first_letter未知,user_string是我們的目標。

最后一行代碼實際上經過上文知識點鋪墊,調用了checking函數。

由于result==0,說明argument[0]+argument[1]嚴格相等于argument[2]。會循環20次這個checking函數(因為pthread_creat函數在for循環內部循環了20次)

0我們不知道,(起碼知道是某個小寫字母)2是目標,1知道了。而且2就等于1+0.但是這還不太夠啊,看看還有沒有其余條件,似乎沒了。

先嘗試寫一個爆破腳本試試。這里要注意,一定要多生成幾個flag,因為不同的frist_letter對應不同的flag,我們試著a~z都搞一遍。第一次沒想到這樣遍歷。而且代碼美觀不如豆包寫的,還得多寫多練。

、注意{}是占位符,可以寫任意的表達式。

a = [0, 9, -9, -1, 13, -13, -4, -11, -9, -1, -7, 6, -13, 13, 3, 9, -13, -11, 6, -7]# 嘗試所有可能的基準值b (97-122)
for base in range(97, 123):flag = []valid = Truefor i in a:char_code = base + iif 32 <= char_code <= 126:flag.append(chr(char_code))else:valid = Falsebreak  # 這個基準值無效if valid:print(f"基準值 {chr(base)} ({base}): {''.join(flag)}")

發現flag?

很讓我開心的是我找到了大致思路!哈哈哈哈哈。只是腳本功底還比較薄弱。

secret-galaxy-300

注意到程序是打印了類似于星球的東西。

但是觀察函數發現其實并沒有完全打印出來,a1這個數組的部分內容并沒有完全用到,所以我打算動調拿一波數據看看。

動調看a1并沒發現明顯的字符串

攻防世界逆向高手題之secret-galaxy-300-CSDN博客

看了別人的wp,反思一下,還是思路錯了,這時候可以結合題目的提示,隱藏的星系,確實發現一個沒有被打印出來的星系,點擊ctrl+x查看交叉引用:

(而且我說為啥有三個代碼差不多的文件,原來對應不同平臺)

其實這里就可以看出來這估計就是flag了,這里偷了個懶,使用了AI。

# 定義各個星系名稱字符串
ngs_2366 = "NGS 2366"
andromeda = "Andromeda"
messier = "Messier"
sombrero = "Sombrero"
triangulum = "Triangulum"
dark_secret_gala = "DARK SECRET GALAXY"# 將各個星系名稱轉換為字符列表,方便按索引取值
galaxy_strings = {"ngs_2366": list(ngs_2366),"andromeda": list(andromeda),"messier": list(messier),"sombrero": list(sombrero),"triangulum": list(triangulum),"dark_secret_gala": list(dark_secret_gala)
}def build_result_string():"""構建結果字符串"""result_chars = [galaxy_strings["andromeda"][8],galaxy_strings["triangulum"][7],galaxy_strings["messier"][4],galaxy_strings["andromeda"][6],galaxy_strings["andromeda"][1],galaxy_strings["messier"][2],'_',galaxy_strings["andromeda"][8],galaxy_strings["andromeda"][3],galaxy_strings["sombrero"][5],'_',galaxy_strings["andromeda"][8],galaxy_strings["andromeda"][3],galaxy_strings["andromeda"][4],galaxy_strings["triangulum"][6],galaxy_strings["triangulum"][4],galaxy_strings["andromeda"][2],'_',galaxy_strings["triangulum"][6],galaxy_strings["messier"][3]]return ''.join(result_chars)# 直接構建并打印結果字符串
print("構建的結果字符串:", build_result_string())

其實直接動調很快

simple-check-100

打開也是三個文件,有了前面的經驗,這里面的代碼一定是一樣的

不如直接打開exe,動調起也方便

懷疑這部分的result就是最終的flag。

為了便于調試分析,我想使用動調的方法來做這道題。目前有兩個思路,一個是直接改匯編代碼,讓這個條件強制為真,另一個是利用check_key來找v8的值,但是很遺憾看代碼這個是v7地址對應的數組,估計不方便尋找和爆破。方便起見,先直接改匯編代碼看看。

好吧,這種思路看著不太行的樣子。OD出來的是亂碼。估計是GBK編碼不可以處理,這個估計不是GBK編碼,

需要注意用X32得用管理員模式,剛才我patch了估計就是沒管理員模式,他不認,IDA動調的patch估計沒有靜態的好使,patch了還是說wrong.

參考了攻防世界-simple-check-100_攻防世界 simple-check-100-CSDN博客看來這種動調還是找專業的調試器吧

我看人家都是用GDB動調的。linux估計不亂碼。

新學的調試指令:set $eax=1

這里需要注意在這里改:,估計箭頭跑到這里意思就是這個指令執行完畢了已經。

果不其然出來了flag。

接下來試試靜態分析

注意參數本來是字符,搞成了int,因此本來一字節,導致合并為4字節。

還要注意這是一個嵌套for循環。?

這借鑒了攻防世界 simple-check-100(非常好的一篇wp,日后還得多多觀看,受益匪淺)-CSDN博客

#include <stdio.h>
int main(int argc, char *argv[])
{unsigned char flag_data[] = {220, 23, 191, 91, 212, 10, 210, 27, 125, 218,167, 149, 181, 50, 16, 246, 28, 101, 83, 83,103, 186, 234, 110, 120, 34, 114, 211};char v7[] = {84, -56, 126, -29, 100, -57, 22, -102, -51, 17,101, 50, 45, -29, -45, 67, -110, -87, -99, -46,-26, 109, 44, -45, -74, -67, -2, 106};unsigned int v2;unsigned char *v3;// v11 = -478230444;// v12 = -1709783196;// v13 = 845484493;// v14 = 1137959725;// v15 = -761419374;// v16 = -752063002;// v17 = -74;// v18 = -67;// v19 = -2;// v20 = 106;// 方法一:類比寫for (int i = 0; i <= 6; ++i){v2 = ((v7[4 * i] & 0x000000FF) + ((v7[4 * i + 1] & 0x000000FF) << 8) + ((v7[4 * i + 2] & 0x000000FF) << 16) + ((v7[4 * i + 3] & 0x000000FF) << 24)) ^ 0xDEADBEEF;v3 = (unsigned char *)&v2;for (int j = 3; j >= 0; --j){printf("%c", *(v3 + j) ^ flag_data[4 * i + j]);}}// 方法二:按位異或,小端字節序,低位在低地址// for (int i = 0; i <= 6; ++i) {// printf("%c", v7[4 * i + 3] ^ 0xDE ^ flag_data[4 * i + 3]);// printf("%c", v7[4 * i + 2] ^ 0xAD ^ flag_data[4 * i + 2]);// printf("%c", v7[4 * i + 1] ^ 0xBE ^ flag_data[4 * i + 1]);// printf("%c", v7[4 * i] ^ 0xEF ^ flag_data[4 * i]);// }return 0;
}

代碼分析:v2?的計算邏輯

這行代碼的核心是?將 4 個有符號字節組合成一個 32 位無符號整數,然后與?0xDEADBEEF?進行異或運算。讓我逐步拆解這個過程:

1. 為什么需要?& 0x000000FF

  • v7?是一個?有符號字符數組char v7[]),其中的負數(如?-56)在內存中以補碼形式存儲(例如?-56?的補碼是?0xC8,即十進制的?200)。

  • 問題:當將有符號數擴展為更大的類型(如?int)時,符號位會被保留。例如:

    • v7[1]?的值是?-56(二進制?0xC8),如果直接轉換為?int,會變成?0xFFFFFFC8(因為符號位擴展)。

    • 這會導致后續的位運算(如?<< 8)結果錯誤。

  • 解決方法:通過?& 0xFF?將其截斷為無符號字節:

    • -56 & 0xFF?→?0xC8(十進制?200),確保高 24 位為?0

2. 為什么要進行位移操作(<< 8,?<< 16,?<< 24)?

這是?小端序(Little Endian)字節組合?的過程:

  • 假設有 4 個字節?b0, b1, b2, b3,對應的索引為?4*i?到?4*i+3

  • 在小端序中,低字節存放在低地址,高字節存放在高地址。因此,組合成 32 位整數的公式是:

    plaintext

    value = b0 + (b1 << 8) + (b2 << 16) + (b3 << 24)
    
  • 示例
    假設?v7[4*i]?到?v7[4*i+3]?的值為?[84, -56, 126, -29](即?[0x54, 0xC8, 0x7E, 0xE3]):

    • v7[4*i] & 0xFF?→?0x54(低字節)

    • v7[4*i+1] & 0xFF?→?0xC8

    • v7[4*i+2] & 0xFF?→?0x7E

    • v7[4*i+3] & 0xFF?→?0xE3(高字節)

    • 組合后的值:0xE37EC854(注意字節順序顛倒,符合小端序)。

主要是因為將字符指針弄成整數的,再加上端序轉換,搞得很麻煩。?

re1-100

開局這些都是反調試

函數功能與原理

  • 管道概念:管道是一種進程間通信(IPC,Inter - Process Communication)機制,用于在具有親緣關系(如父子進程)的進程間傳遞數據。它本質上是一個特殊的文件,遵循先進先出(FIFO)原則。

  • 函數作用:在許多編程語言和系統(如 C、C++ 等基于 POSIX 標準的系統編程中),pipe?函數用于創建一個匿名管道pipe?函數通常接受一個包含兩個文件描述符的數組作為參數(這里?pParentWrite?應該是數組首地址),其中一個文件描述符用于讀取管道數據(通常是數組的第一個元素,記為?fd[0]),另一個用于向管道寫入數據(通常是數組的第二個元素,記為?fd[1]

  • 成功時:返回?0
  • 失敗時:返回?-1,并設置?errno?來指示具體錯誤類型。

由此我們已經知道pparentread/pparentwrite都是什么意思。

這個代碼大概意思就是判斷輸入的是不是完整。根據我的判斷。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84758.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql ACID 原理

序言&#xff1a;ACID 是一組數據庫設計原則&#xff0c;他是業務數據和關鍵業務程序的可靠性保障。 1、atomicity&#xff08;原子性&#xff09; 依賴如下能力 autocommit commit rollback2、一致性 2.1 double write buffer 1、定義&#xff1a;double write buffer 是…

WebStorm 高效快捷方式全解析

作為前端開發的黃金搭檔&#xff0c;WebStorm 憑借強大的功能和高度可定制的快捷鍵體系&#xff0c;成為眾多開發者提升編碼效率的利器。本文基于 IntelliJ IDEA 的快捷鍵體系&#xff08;WebStorm 作為 JetBrains 家族成員&#xff0c;快捷鍵邏輯高度一致&#xff09;&#xf…

基于 STM32 的農村污水處理控制系統設計與實現

摘要 針對農村污水處理自動化程度低、運維成本高的問題,本文設計了一種基于 STM32 單片機的污水處理控制系統。系統通過多傳感器實時監測水質參數,結合 PID 控制算法實現污水處理全流程自動化,并集成遠程監控功能,滿足農村地區低成本、易維護的需求。 一、硬件系統設計 …

自動生成md文件以及config.mjs文件-vitepress

效果&#xff1a; config.mjs文件 import {defineConfig} from vitepress import hljs from highlight.js/lib/core import javascript from highlight.js/lib/languages/javascript import xml from highlight.js/lib/languages/xml import {ref} from "./cache/deps/vue…

Tailwind css實戰,基于Kooboo構建AI對話框頁面(二)

基于上篇內容&#xff0c;添加交互邏輯&#xff0c;實現一個偽聊天功能的對話框效果&#xff1a; Tailwind css實戰&#xff0c;基于Kooboo構建AI對話框頁面&#xff08;一&#xff09;-CSDN博客 在前期文章中&#xff0c;我們完成了 AI 對話框的靜態頁面搭建。本文將聚焦交互…

Conda:環境移植及更新1--使用conda-pack

更多內容&#xff1a;XiaoJ的知識星球 目錄 一、使用conda-pack1.安裝 conda-pack2.移植整個 Anaconda 環境3.移植單個虛擬環境4.驗證是否生效 在相同Linux設備上移植Miniconda3&#xff08;Anaconda3同理&#xff09;常用方法有。 使用conda-pack&#xff1a;使用conda-pack工…

樹莓派超全系列教程文檔--(50)如何查找樹莓派的IP地址

如何查找樹莓派的IP地址 找到您的Raspberry Pi的IP地址桌面命令行引導輸出網絡管理器使用mDNS解析 raspberrypi.local檢查路由器的設備列表使用 nmap 查找設備使用智能手機應用程序查找設備 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 找到您…

如何優化 MySQL 存儲過程的性能?

文章目錄 1. 優化 SQL 語句避免全表掃描減少子查詢&#xff0c;改用 JOIN避免 SELECT 2. 合理使用索引3. 優化存儲過程結構減少循環和臨時變量避免重復計算 4. 使用臨時表和緩存5. 優化事務處理6. 分析和監控性能7. 優化數據庫配置8. 避免用戶自定義函數&#xff08;UDF&#…

尚硅谷redis7 47-48 redis事務之理論簡介

47 redis事務之理論簡介 什么是事務 可以一次執行多個命令,本質是一組命令的集合。一個事務中的所有命令都會序列化,按順序地串行化執行而不會被其它命令插入 能干什么&#xff1f; 一個隊列中&#xff0c;一次性、順序性、排他性的執行一系列操作 redis事務vs數據庫事務 …

Nginx 在四大核心場景中的應用實踐與優化

一、Nginx 核心應用場景深度解析 1. HTTP 服務器&#xff1a;靜態資源的高性能承載者 Nginx 作為 HTTP 服務器時&#xff0c;憑借輕量級架構和高效的事件驅動模型&#xff0c;成為靜態資源服務的首選方案。 核心能力與場景 靜態文件高效處理&#xff1a;直接響應 HTML、CSS…

亞當·斯密思想精髓的數學建模與形式化表征

亞當斯密思想精髓的數學建模與形式化表征 摘要&#xff1a;本文運用數學建模方法對亞當斯密的經濟與倫理思想進行形式化表征。通過分工的規模經濟模型和市場均衡條件展現《國富論》中"看不見的手"原理&#xff1b;采用擴展效用函數與合作博弈均衡解釋《道德情操論》…

FastDFS集群部署與性能優化實戰

目錄 一、介紹 二、FastDFS原理 三、FastDFS部署 1.資源清單 2.修改主機名 3.安裝libfastcommon&#xff08;tracker01、tracker02、storage1、storage2&#xff09; 4.安裝編譯FastDFS&#xff08;tracker01、tracker02、storage1、storage2&#xff09; 5.配置tracker…

學習心得(14--16)

模板&#xff1a; 前端的頁面單獨存在模板當中 jinja2 &#xff1a;模板語法 保持前端頁面不變的情況下&#xff0c;返回內容給前端做法&#xff1a; 寫一個data&#xff0c;并在return中的render_template中&#xff0c;寫上datadata 使用時&#xff0c;要將templa…

stm與51單片機哪個更適合新手學

一句話總結 51單片機&#xff1a;像學騎自行車&#xff0c;簡單便宜&#xff0c;但只能在小路上騎。 STM32&#xff1a;像學開汽車&#xff0c;復雜但功能強&#xff0c;能上高速公路&#xff0c;還能拉貨載人&#xff08;做復雜項目&#xff09;。 1. 為啥有人說“先學51單片…

Web安全測試-文件上傳繞過-DVWA

Web安全測試-文件上傳繞過-DVWA 很多網站都有上傳資源(圖片或者文件)的功能&#xff0c;資源上傳后一般會存儲在服務器的一個文件夾里面&#xff0c;如果攻擊者繞過了上傳時候的文件類型驗證&#xff0c;傳了木馬或者其他可執行的代碼上去&#xff0c;那服務器就危險了。 我用…

ant-design-vue中的分頁組件自定義

ant-design-vue中的分頁組件自定義 實現效果 實現代碼 需要自己創建一個分頁組件的代碼然后導入進去。 <template><div style"display: flex; justify-content: space-between; margin-bottom: 10px"><div><a-select v-model:value"pageS…

LabVIEW軟件開發過程中如何保證軟件的質量?

一、需求與架構設計階段 明確功能邊界與技術指標 在測試系統設計初期&#xff0c;圍繞比例閥性能測試核心需求&#xff08;如壓力 / 流量信號采集、特性曲線繪制、數據對比分析&#xff09;&#xff0c;定義軟件功能模塊&#xff08;數據采集、邏輯控制、界面顯示&#xff09;&…

Linux 527 重定向 2>1 rsync定時同步(未完)

rsync定時同步 配環境 關閉防火墻、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 設置主機名 systemctl set-hostname code systemctl set-hostname backup 配靜態ip rsync 需要穩定的路由表和端…

Vue 3.0 中狀態管理Vuex 與 Pinia 的區別

在 Vue.js 應用開發中&#xff0c;狀態管理是構建復雜應用的關鍵環節。隨著 Vue 3 的普及和 Composition API 的引入&#xff0c;開發者面臨著狀態管理庫的選擇問題&#xff1a;是繼續使用經典的 Vuex&#xff0c;還是轉向新興的 Pinia&#xff1f;本文將從設計理念、API 設計、…

分布式緩存:三萬字詳解Redis

文章目錄 緩存全景圖PreRedis 整體認知框架一、Redis 簡介二、核心特性三、性能模型四、持久化詳解五、復制與高可用六、集群與分片方案 Redis 核心數據類型概述1. String2. List3. Set4. Sorted Set&#xff08;有序集合&#xff09;5. Hash6. Bitmap7. Geo8. HyperLogLog Red…