日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

REVERSE-PRACTICE-BUUCTF-10

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 REVERSE-PRACTICE-BUUCTF-10 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

REVERSE-PRACTICE-BUUCTF-10

    • [GWCTF 2019]xxor
    • [HDCTF2019]Maze
    • [WUSTCTF2020]level2
    • [BJDCTF2020]BJD hamburger competition

[GWCTF 2019]xxor

elf文件,無殼,用ida分析
main函數的邏輯清晰,首先獲取輸入,為6個int64的值,然后每2個值一組,調用sub_400686函數進行變換,變換后的值存儲到v11,最后驗證v11,驗證輸入

sub_400686函數,讀取每組的2個值,進行64次循環運算,變換后的值放回原位置

check函數,可以由此得到輸入經變換后需要變成的6個值

寫逆腳本,v11的6個值可以手動計算或者使用python的z3庫計算
v5類型為int32,初始值為0,64次加法必定超出了int32的最大正值,不過計算過程中會自動截取,于是不必特別考慮v5,正常寫腳本即可

#include<stdio.h> __int64 v11[] = { 0xdf48ef7e,0x20caacf4,0xe0f30fd5,0x5c50d8d6,0x9e1bde2d,0x84f30420 }; __int64 a2[] = { 2,2,3,4 }; void main() {for (int i = 0; i <= 4; i += 2){unsigned int v3 = v11[i];unsigned int v4 = v11[i + 1];int v5 = 0;for (int j = 0; j <= 63; j++)v5 += 1166789954;for (int j = 0; j <= 63; j++){v4-= (v3 + v5 + 20) ^ ((v3 << 6) + a2[2]) ^ ((v3 >> 9) + a2[3]) ^ 0x10;v3-= (v4 + v5 + 11) ^ ((v4 << 6) + a2[0]) ^ ((v4 >> 9) + a2[1]) ^ 0x20;v5 -= 1166789954;}if (v5 == 0){v11[i] = v3;v11[i + 1] = v4;}}for (int i = 0; i < 6; i++){printf("%ld,", v11[i]);} }

運行結果

再用python的long_to_bytes轉成字符串

[HDCTF2019]Maze

exe程序,運行后提示通過迷宮獲得flag,有upx殼,脫殼后ida分析
main函數沒有被ida識別為函數,原因是代碼中添有花指令
jnz跳轉到下一條指令,不跳轉也是下一條指令,這里jnz阻礙了ida的識別,需要把jnz的整條指令nop掉
.text:0040102E處,call了一段紅色地址,說明該紅色地址并不存在于程序中,應該是在正確指令字節基礎上添加了幾個字節,變得不能被ida識別,于是需要去除多余的字節,選中紅色地址,按d轉換為數據,依次nop掉一些字節,看nop掉字節后ida是否能夠識別成代碼,發現轉為數據后,nop掉第一個字節,ida就可以識別了

去除花指令的效果

選中從main函數開始到結束retn指令之間的紅色.text代碼,按p生成函數,F5反編譯
分析main函數,wsad分別對應上下左右,初始位置為[7,0],結束位置為[5,-4]

在字符串窗口找到迷宮地圖,長度為70,猜測為10x7或者7x10,由初始位置和結束位置可知,地圖為7x10,即7行10列,起始點在“+”,終止點在“F”,走完迷宮即可得到flag

[WUSTCTF2020]level2

elf文件,有upx殼,脫殼后ida分析
左側函數窗口找到main函數,在IDA View-A窗口即可看到flag

[BJDCTF2020]BJD hamburger competition

unity游戲,老八秘制小漢堡,按正確的順序加料即可得到flag
BJD hamburger competition_Data->Managed->Assembly-CSharp.dll拖入dnSpy
找到主邏輯的部分
Md5方法對傳入的參數進行md5散列,大寫,取前20位
Sha1方法對傳入的參數進行sha1散列,大寫
Spawn方法對加料的順序進行驗證,選擇不同的配料對Init.secret(初始值為0)進行不同的運算,運算的結果進行sha1散列與已知值比較,相同時程序對運算的結果進行md5散列并輸出為flag

using System; using System.Security.Cryptography; using System.Text; using UnityEngine;// Token: 0x02000004 RID: 4 public class ButtonSpawnFruit : MonoBehaviour {// Token: 0x0600000A RID: 10 RVA: 0x00002110 File Offset: 0x00000310public static string Md5(string str){byte[] bytes = Encoding.UTF8.GetBytes(str);byte[] array = MD5.Create().ComputeHash(bytes);StringBuilder stringBuilder = new StringBuilder();foreach (byte b in array){stringBuilder.Append(b.ToString("X2"));}return stringBuilder.ToString().Substring(0, 20);}// Token: 0x0600000B RID: 11 RVA: 0x00002170 File Offset: 0x00000370public static string Sha1(string str){byte[] bytes = Encoding.UTF8.GetBytes(str);byte[] array = SHA1.Create().ComputeHash(bytes);StringBuilder stringBuilder = new StringBuilder();foreach (byte b in array){stringBuilder.Append(b.ToString("X2"));}return stringBuilder.ToString();}// Token: 0x0600000C RID: 12 RVA: 0x000021C8 File Offset: 0x000003C8public void Spawn(){FruitSpawner component = GameObject.FindWithTag("GameController").GetComponent<FruitSpawner>();if (component){if (this.audioSources.Length != 0){this.audioSources[Random.Range(0, this.audioSources.Length)].Play();}component.Spawn(this.toSpawn);string name = this.toSpawn.name;if (name == "漢堡底" && Init.spawnCount == 0){Init.secret += 997;}else if (name == "鴨屁股"){Init.secret -= 127;}else if (name == "胡羅貝"){Init.secret *= 3;}else if (name == "臭豆腐"){Init.secret ^= 18;}else if (name == "俘虜"){Init.secret += 29;}else if (name == "白拆"){Init.secret -= 47;}else if (name == "美汁汁"){Init.secret *= 5;}else if (name == "檸檬"){Init.secret ^= 87;}else if (name == "漢堡頂" && Init.spawnCount == 5){Init.secret ^= 127;string str = Init.secret.ToString();if (ButtonSpawnFruit.Sha1(str) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7"){this.result = "BJDCTF{" + ButtonSpawnFruit.Md5(str) + "}";Debug.Log(this.result);}}Init.spawnCount++;Debug.Log(Init.secret);Debug.Log(Init.spawnCount);}}// Token: 0x04000005 RID: 5public GameObject toSpawn;// Token: 0x04000006 RID: 6public int spawnCount = 1;// Token: 0x04000007 RID: 7public AudioSource[] audioSources;// Token: 0x04000008 RID: 8public string result = ""; }

使用在線網站可以解出已知sha1的原始值,為1001

再對1001進行md5,轉成大寫,取前20位,即可得到flag

如果不使用在線網站解sha1和md5散列,寫爆破腳本

#coding:utf-8 #漢堡底 +=997 #漢堡頂 ^=127 #鴨屁股 -=127 0 #胡羅貝 *=3 1 #臭豆腐 ^=18 2 #俘虜 +=29 3 #白拆 -=47 4 #美汁汁 *=5 5 #檸檬 ^=87 6 import hashlib #從其他7種材料中選4種 加上漢堡底和漢堡頂 一共6種 for i in range(7):for j in range(7):for k in range(7):for m in range(7):secret=997 #漢堡底當作第一種材料if i==0:secret-=127elif i==1:secret*=3elif i==2:secret^=18elif i==3:secret+=29elif i==4:secret-=47elif i==5:secret*=5elif i==6:secret^=87if j==0:secret-=127elif j==1:secret*=3elif j==2:secret^=18elif j==3:secret+=29elif j==4:secret-=47elif j==5:secret*=5elif j==6:secret^=87if k==0:secret-=127elif k==1:secret*=3elif k==2:secret^=18elif k==3:secret+=29elif k==4:secret-=47elif k==5:secret*=5elif k==6:secret^=87if m == 0:secret -= 127elif m == 1:secret *= 3elif m == 2:secret ^= 18elif m == 3:secret += 29elif m == 4:secret -= 47elif m == 5:secret *= 5elif m == 6:secret ^= 87secret^=127 #最后加漢堡頂的時候,材料的種數還沒有加到6h = hashlib.sha1()h.update(str(secret).encode(encoding='utf-8'))#驗證sha1散列if h.hexdigest() == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7".lower():print(secret)#輸出md5散列h2 = hashlib.md5()h2.update(str(secret).encode(encoding='utf-8'))print(h2.hexdigest().upper()[0:20])

運行結果

總結

以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-10的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。