用IDA 逆向題目
逆向main函數
逆向reveal_flag函數

解題方法
根據逆向結果,進入reveal_flag條件為:
- 大於999
- 小於9999
- 位數等於3 因此用普通的十進位無法進入,我們可以用十六進位(FFF)來進入該函數 接著會取得被翻轉並加料的flag,我們利用python腳本還原
取得被翻轉並加料的flag
輸入FFF

還原腳本
str='}4cdftc_oc_ip6f47ftc_oc_ipa_99ftc_oc_ip9_TGftc_oc_ip_xehftc_oc_ip_tigftc_oc_ipid_3ftc_oc_ip{FTCftc_oc_ipocipftc_oc_ip'
str=str.replace('ftc_oc_ip','')
str=str[::-1]
print(str)

flag

小筆記
| 函式 | 所屬 | 功能 | 備註 |
|---|---|---|---|
fopen(path, mode) |
stdio.h | 打開檔案,回傳檔案指標(stream) | "r" = 唯讀模式 |
fseek(stream, offset, whence) |
stdio.h | 移動檔案讀取位置(指標) | whence: SEEK_SET=0(從檔頭)、SEEK_CUR=1(從目前位置)、SEEK_END=2(從檔尾);offset 為偏移量 |
ftell(stream) |
stdio.h | 回傳目前讀取指標位置(距檔頭的 byte 數) | 常搭配 fseek(…SEEK_END) 算出檔案總大小 |
rewind(stream) |
stdio.h | 把讀取指標重置回檔案開頭(位置 0) | 等同 fseek(stream, 0, SEEK_SET) |
malloc(size) |
stdlib.h | 動態配置一塊指定大小的記憶體,回傳指標 | 用完需搭配 free() 釋放 |
fread(ptr, size, nmemb, stream) |
stdio.h | 從檔案讀取資料到緩衝區 | size=每單位大小(byte),nmemb=要讀幾個單位 |
fclose(stream) |
stdio.h | 關閉檔案,釋放檔案指標資源 | 開了檔案一定要關 |
free(ptr) |
stdlib.h | 釋放 malloc 配置的記憶體 |
避免 memory leak |
putchar(c) |
stdio.h | 印出單一字元 | putchar(10) = 印出 \n(LF, 0x0A) |
puts(str) |
stdio.h | 印出字串並自動換行 | 與 printf 不同,會自動加 \n |
printf(fmt, ...) |
stdio.h | 格式化輸出字串 | |
fflush(stream) |
stdio.h | 強制把緩衝區內容立刻輸出 | fflush(stdout) 常用於確保 printf 內容先顯示再等待輸入 |
__isoc99_scanf(fmt, ...) |
stdio.h | 格式化讀取輸入 | 反組譯常見命名,其實就是 scanf;"%31s" 表示最多讀 31 個字元 |
strlen(s) |
string.h | 計算字串長度(不含 \0) |
|
atoi(s) |
stdlib.h | 把字串轉成整數(10 進位) | 遇到非數字字元會停止轉換 |
strtol(s, endptr, base) |
stdlib.h | 把字串依指定進位(base)轉成 long 整數 | base=16 即當十六進位解析;比 atoi 更彈性、可指定進位制 |
__readfsqword(0x28u) |
編譯器內建 | 讀取 Stack Canary(金絲雀值) | 用來偵測 buffer overflow,配合 fs:0x28 存取 TLS |


說些什麼吧!