BUUCTF--[GWCTF 2019]re3学习记录
又是一道很操(沒做出來)的題目,學(xué)習(xí)其他師傅的思路。
第一步:
常規(guī)操作,無殼64位,放入IDApro中。
搜索找到main函數(shù),出現(xiàn)紅色提示
棧存在問題,修改一下棧的值
?查看main函數(shù),讀取,mproct函數(shù),一種保護函數(shù),不是很重要。
mprotect函數(shù)詳解
?SMC自修改代碼
在真正執(zhí)行某一段代碼時,程序會對自身的該段代碼進行自修改,只有在修改后的代碼才是可執(zhí)行的。在程序未對該段代碼進行修改之前,在靜態(tài)分析狀態(tài)下,均是不可讀的字節(jié)碼,IDA之類的反匯編器無法識別程序的正常邏輯。
第一次看,一臉懵逼,到這里就卡住了,把函數(shù)+i??? wtf???點進去查看
?大概意思是將sub_402219函數(shù)的匯編代碼修改了,最后再次執(zhí)行,我們靜態(tài)分析看不出來。而且這里無法動態(tài)調(diào)試。
查看匯編代碼
?發(fā)現(xiàn)這里出現(xiàn)了一大堆數(shù)據(jù),應(yīng)該就是我們需要處理的數(shù)據(jù)。
選中402219數(shù)據(jù)段 D鍵轉(zhuǎn)換為數(shù)據(jù)段。
?這時我們就需要使用IDC腳本進行數(shù)據(jù)修改(一種類c語言)shift+F2
IDC腳本介紹
IDC腳本舉例
IDC函數(shù)
#include <idc.idc>static main() {auto addr = 0x402219; //聲明局部變量 addr是起始地址auto i = 0;for(i=0;i<224;i++) {PatchByte(addr+i,Byte(addr+i)^0x99); //設(shè)置虛擬地址addr處的一個字節(jié)值} }然后將修改后的數(shù)據(jù)選中,右鍵分析,選擇force強制執(zhí)行,然后把代碼按P鍵形成函數(shù)。
?我們分析一下函數(shù),點進去都是好長一段,試試findcrypt插件,可能是某種加密,發(fā)現(xiàn)是AES
?byte_6030A0就是最后加密后的內(nèi)容
BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B
現(xiàn)在我們需要來求密鑰unk_603170.linux遠程動態(tài)調(diào)試(輸入一個長為32位的字符串)
CB8D493521B47A4CC1AE7E62229266CE
最后學(xué)習(xí)別的師傅的腳本
from Crypto.Cipher import AES from Crypto.Util.number import * key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce) #密鑰 mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b) #密文 lun = AES.new(key, mode=AES.MODE_ECB) flag = lun.decrypt(mi) print(flag)得到最后的flag為
flag{924a9ab2163d390410d0a1f670}
總結(jié)
以上是生活随笔為你收集整理的BUUCTF--[GWCTF 2019]re3学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUUCTF firmware
- 下一篇: [BUUCTF]Reverse——[网鼎