學了一個 map()函數的使用?
import base64rawData = "e3nifIH9b_C@n@dH"
target = list(map(ord, rawData))
# map 函數將 rawData 中的每個字符傳遞給 ord 函數。ord 函數返回給定字符的 Unicode 碼點
print(target)
# 打印 map 對象的內存地址,故須轉換為列表for i in range(len(target)):target[i] -= i
print(list(map(chr,target)))
#['e', '2', 'l', 'f', 'b', 'D', 'B', '2', 'Z', 'V', '9', '5', 'b', '3', 'V', '9']
src = ''.join(map(chr, target))
print(src)
# e2lfbDB2ZV95b3V9
decoded_data = base64.b64decode(src)print(decoded_data)
大小寫轉換
import string
key = "ADSFKNDCLS".lower()
print(key)
# adsfkndcls
enc='abcdefg'
print(enc.upper())
# ABCDEFG
charSet=string.ascii_uppercase+string.ascii_lowercase
print(charSet)
#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
刮開有獎
hint:在編輯框輸入flag
彈出一個對話框,對話框對應函數是DialogFunc
運行卻沒有輸入框和按鈕,上 RH 看看
最近有兩道題都用到了這個工具,也是來學習一下
首先 Resource Hacker 是一款windows應用程序的資源編譯器和反編譯器
1.可以查看和編輯可執行文件(exe, dll, src 等)和已編譯資源庫(res, mui )中的資源
2.提取 (保存) 資源為文件 (*.res) 格式,可作為二進制,或作為反編譯過的資源腳本或圖像。
圖標、位圖、指針、菜單、對話、字符串表、消息表、加速器、Borland 窗體和版本信息資源都可以完整地反編譯為其各自的格式,不論是作為圖像還是作為 *.rc 文本文件都可以。
3. 修改 (替換) 可執行文件的資源。
圖像資源(圖標、指針和位圖)可以被相應的圖像文件(*.ico, *.cur, *.bmp)、*.res 文件、甚至是另一個 *.exe 文件所替換。
對話、菜單、字符串表、快捷鍵和消息表資源腳本(以及 Borland 窗體)可以通過使用內部資源腳本編輯器被編輯和重新編譯。
資源也可以被某個 *.res 文件所替換,只要替換的資源與其是同一類型并且有相同的名稱即可。
4. 添加 新的資源到可執行文件。
允許一個程序支持多種語言,或將自定義圖標或位圖(公司的標識等)添加到程序的對話中。
5. 刪除 資源。大多數編譯器添加了應用程序永遠都不會用到的資源到應用程序中。刪除這些不使用的資源可以減小應用程序的體積。
一些可執行文件使用壓縮算法進行“打包”或“壓縮”。這不僅會減小文件大小,還會使查看和修改資源變得稍微困難??一些
ES_READONLY
WS_DISABLED
WS_DISABLED
CONTROL 129,-1,STATIC,SS_BITMAP | WS_CHILD | WS_VISIBLE, 7,7,230,72
加上 WS_VISIBLE 屬性
也是修復成功了,但輸入點擊沒有反應,不知道是沒有回顯還是怎么的
就是一個簡單base64得到五位flag,還有兩位是經過一個比較復雜的遞歸函數,可以寫個代碼跑也可以直接動調,我就動調了
import base64
v4='ak1w'
v5='V1Ax'
flag=[0]*8
v4=base64.b64decode(v4)
v5=base64.b64decode(v5)
flag[5]=v4[0]
flag[6]=v4[1]
flag[7]=v4[2]
flag[3]=v5[1]
flag[4]=v5[2]
flag[2]=v5[0]
flag[0] = ord('3') + 34
flag[1] =ord('J')
for i in range(8):print(chr(flag[i]),end='')
最后也可以看到是成功才有回顯。
CrackRTF
這個是 SHA_1哈希函數
CryptCreateHash 函數的第二個參數應該用來指定 hash 的類型
SHA1也是要知道 round 的好像,不看了,直接爆破(反正都是數字)
import hashlib
def sha1Encode(plain):sha=hashlib.sha1(plain.encode('utf-8'))return sha.hexdigest().upper()
passwd=''
for i in range(100000,1000000):plain=str(i)+'@DBApp'#print(plain)if sha1Encode(plain)=='6E32D0943418C2C33385BC35A1470250DD8923A9':passwd=str(i)break
print(passwd)
# 123321
第二部分就是一個 md5 找個網站或者用 hashcat (沒用過)
全出來了:~!3a@0123321@DBApp
[2019紅帽杯]easyRE
分析首先就是簡單的異或,然后有十次 base64
寫個腳本
import base64
target = "Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ=="
for _ in range(10):target = base64.b64decode(target)
print (target)
得到一個網址:b'https://bbs.pediy.com/thread-254172.htm'[原創]看雪CTF從入門到存活(六)主動防御-CTF對抗-看雪-安全社區|安全招聘|kanxue.com
elf 文件執行:
elf 從 start 函數開始執行(由 Entry point 指定),然后執行順序是 __libc_start_main -> __libc_csu_init -> _init_array 中的函數 -> main -> __libc_csu_fini -> _fini_array 中的函數。
?
這道題的 start 函數:
_init_array 地址可以在 __libc_csu_init 函數中找到:
翻一翻 _init_array 和 _fini_array 中的函數,每個都點過去 F5 看一下:
_fini_array 的第二個函數指針 sub_400D35 最為可疑:
Youngter-drive
嗯,運行不了,只能靜態分析了
兩個API函數
?::hObject = CreateMutexW(0, 0, 0); ? ?
創建或打開一個命名的或非命名的互斥體對象。互斥體對象用于線程同步,確保多個線程在同一時刻只有一個線程訪問共享資源。
CloseHandle(hObject);
?關閉內核對象句柄的函數。hObject:這是一個句柄,指向一個內核對象。此對象可以是文件、文件映射、進程、線程、安全和同步對象(如互斥體、信號量、事件)等。
StartAddress函數
sub_4011
要注意,這個函數看似沒有用,但 count 也減一了,寫腳本時要注意。
剛好前幾天學了一點的線程,也大致知道這兩個函數交替執行,且線程1先拿到鎖
也是遇到了一個棧不平衡的花指令:
這個棧不平衡之前也是有遇到的,需要學學。
table='QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
target='TOiZiZtOrYaToUwPnToBsOaOapsyS'+'y'
flag=['']*len(target)
for i in range(len(target)-1,-1,-1):if i%2:if ord(target[i])<97:flag[i]=chr(table.index(target[i])+96)else:flag[i]=chr(table.index(target[i])+38)else:flag[i]=target[i]
print(''.join(flag))
#ThisisthreadofwindowshahaIsESE
[GKCTF2020]Check_1n
main()函數里看不出什么,string窗口看看
一眼像base64,解一下
得到:Why don't you try the magic brick game
動調一下
不知道在干嘛,是個操作系統
點擊也沒用阿
還有 ida 顯示中文需要修復一下
是要自己猜密碼好像,看到密碼錯誤的字符串,雙擊跟進,找到函數
找到密碼在 aHelloworld里,即“HelloWorld”
運行一下,不知道怎么操作,啊!就只能用幾個方向鍵搞好像
[GXYCTF2019]luck_guy
也是提示了:try to patch me and find flag
確實可以自己寫個腳本跑,或者就是 patch
現在來學一下 patch ,那個 KeyPatch插件不知道怎么又沒了,煩
0x04008CA是case4的開始地址,讓函數進來直接跳這