BugkuCTF-Reverse题NoString
知識點
我們需要知道異或(^)操作
舉例:11001001^00110001=11111000
10=1;01=1;11=0;00=0異真同假
當我們得到11111000和00110001,我們怎么得到11001001?當然也是異或
11111000^00110001=11001001
C語言的9u即異或9
c語言數字后面帶個U是表示無符號類型的數據。U是unsigned的首字母。如:unsigned int a = 32, b; b = 32 + 12U; // 12是一個無符號類型的數據。
U表示該常數用無符號整型方式存儲,相當于 unsigned int
L表示該常數用長整型方式存儲,相當于 long
F表示該常數用浮點方式存儲,相當于 float
(一)用于說明數據類型
數值后面加“L”和“l”(小寫的l)的意義是該數值是long型。
詳細說如下:
5L的數據類型為long int。
5.12L的數據類型為long double。
數值后面加“U”和“u”的意義是該數值是unsigned型。
(二)用于說明數值表示方法
數值后面加“”H“、“h”的意義是該數值是用16進制表示的。
數值后面加“”B“、“b”的意義是該數值是用2進制表示的。
后面什么也不加,代表10進制。
栗子:
11111111B = FFH = 255
數值前面加“0”的意義是該數值是八進制。
數值前面加“0x”的意義是該數值是十六進制。
解題流程
下載得到一個exe程序,是32位的
大概程序邏輯就是我們輸入正確的flag,就會提示正確
IDA打開后,字符串搜索大法shift+f12看不到什么有效信息
因為我們搜索不到字符串,所以我們考慮是被加密了,需要分析代碼
F5看一下偽碼
根據上面的代碼分析,xx經過9u異或操作,得到了printf的內容
注意到Format里各位依次與9u異或后得到的結果可能是yelhzl)`gy|})|)oehnl3
嘗試寫腳本,看一下Format本來的值是什么
發現輸出的結果正好是打開exe文件時,打印出的字符
那么后面某串字符肯定與輸出的flag有關系,注意到后面v5賦值為1時,輸出了一串l{{f{,拿去運行一下發現結果是error;而v5賦值為-1時,輸出了{na},運行結果是right`。
那么說明重要的判斷條件在前面,應該就是 v5 = strcmp(&v11,
aOehnl3rHfCcgpt);,找到aOehnl3rHfCcgpt對應的值oehnl3r=<?=hF@CCGPt
拿去跟9u異或一下,得到flag
得到flag
總結
以上是生活随笔為你收集整理的BugkuCTF-Reverse题NoString的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 函数不定长参数 - C语言零基础
- 下一篇: 全网最细之instanceof和类型转换