實驗吧 逆向 小練習
阿拉丁神燈
迷得很,還以為需要真正的逆向,就是找到關鍵字串…第一下就不合常理…
看來所有的逆向之前還是看一下段啊字串什麼有沒有藏東西,或者看到返回的關鍵字爆搜一下嗯
FLAG
打開發現是什麼輸入flag?怎麼像WEB???然後看到原始碼中有JS程式碼
關鍵的程式碼太多了,主要就是人工找到突破口吧。其實並不麻煩,因為你觀察一下由短到長是有規律的,我倒是覺得是資料分析能力,用一個函式排序,然後一個個試試就行了…
flag{wh47_my5ter10us-do3s,the+phe45ant/c0nta1n}
- 1
轉瞬即逝
神特麼轉瞬即逝…名字和題目沒有半毛錢關係好吧….
這就很明顯了…不解釋了…
#_*_coding:utf-8_*_s='tikp[luX|aoTjaoh'flag=""for i in range(len(s)): flag+=chr(ord(s[i])^i)print flag#this_is_the_flag
- 1
- 2
- 3
- 4
- 5
- 6
- 7
有一個程式加密得到如下密文
反彙編一下得到原始碼
但是看了半天感覺神了,應該是不知道的某種對稱加密,但是這個加密解密過程都給了,嘗試解密發現返回是空值,為什麼!觀察程式碼發現密文0-9位之間是一個關於時間戳的東西,10-25位是一個md5值,後面都是原密文,然後這個串被一個box盒進行了抑或替換…解密過程也是簡單的,僅僅是再做一次輪換然後判斷是不是中間的md5值後後面的string有關….有點像AES。按道理加密解密過程不會影響結果(前面分析純屬好奇),但是我們看到了關鍵的幾個限制條件…
解決方法就是把他改成
print True
- 1
然後執行解密即可
DUTCTF{2u0_chu_14i_d3_5hi_h3n74i}
- 1
babyCrack.exe
這個。。。
hctf{bABy_CtsvlmE_!}
- 1
bin100(ebCTF 2013)
大概看了一下,就是所謂的篩子游戲,需要讓你篩出一連串的對應的點數嗯,但是這概率很小。總體來說貌似你需要篩出3-1-3-3-7這個順序,但是這概率很小,所以我們嘗試修改程式中的判斷流程
隨便一改,將匹配值改成7,改成匹配就跳轉,然後是永遠不可能匹配的,一定不會跳轉
ebCTF{64ec47ece868ba34a425d90044cd2dec}
- 1
CFG to C
這個這個,選擇題???
BCDA
- 1
Byte Code
看到是.class檔案,如何反彙編,找到工具jd-GUI就行了,得到原始碼…
import java.io.Console;import java.io.PrintStream;class Authenticator{ public static char[] key; public static void main(String[] paramArrayOfString) { key = new char[10]; key[0] = 'A'; key[1] = 'o'; key[2] = 'J'; key[3] = 'k'; key[4] = 'V'; key[5] = 'h'; key[6] = 'L'; key[7] = 'w'; key[8] = 'U'; key[9] = 'R'; Console localConsole = System.console(); String str = ""; while (!str.equals("ThisIsth3mag1calString4458")) { str = localConsole.readLine("Enter password:", new Object[0]); } for (int i = 0; i < key.length; i++) { System.out.print(key[i]); } System.out.println(""); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
答案:AoJkVhLwUR
- 1
bitwise
簡單題
#_*_coding:utf-8 _*_verify_arr = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]user_arr = []flag=''for i in range(10): for j in range(30,140): if ( (((j << 5) | (j >> 3)) ^ 111) & 255 )==verify_arr[i]: flag+=chr(j) breakprint flag#ub3rs3cr3t
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
smali檔案分析
用jeb反彙編得到程式碼
public class Hello { public Hello() { super(); } public int foo(int arg3, int arg4) { return (arg3 + arg4) * (arg3 - arg4); } public static void main(String[] arg4) { System.out.println(new Hello().foo(5, 3)); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
CTF{16}
- 1
逆向觀察
還是比較明顯的,就是再1000個密碼中匹配是否存在
sedecrem
,但是真的是這個嘛???答案是否定的,我們需要注意原來存放src的型別是int型!而我們將它看成char型是必須倒置的!!!
也就是說我們需要在程式中注入一個串和1000個字典中匹配,而且字典中必須存在
mercedes
,檢視之後發現確實是存在的!那麼我們如果動態除錯就只需要輸入一個滿足條件的字串即可!
最終答案
mercedes
- 1
Just Click
Exeinfo Pe進行加殼分析,發現是利用了c#寫的,在分析結果中明確提出了應該用.NET Reflector
去分析原始碼!
真是漲了一波姿勢啊,按順序輸入即可
這裡還有一個小坑…這裡的To要用大寫….
simCTF{Easy_To_Get_Flag_From_DotNET}
- 1
分道揚鑣
非常有意思的題目,但是應該是不難的(要不然我也不可能會的),首先我們看到了由星號和空格組成的字串,輕易的可以猜測出來應該是一個8*8的地圖(因為後面的四種操作很明顯)得到地圖如下
********* * ** * ** ** * ** ** * #* ** **** ** *********
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
然後我們還可以輕易地找到了起點是這裡
然後後面就是肉眼觀察規劃路徑即可!然後推算得到的輸入應該是
jjjjjlllllkkkkkhhhjjjl
- 1
我們看函式
裡面有一個很誘人的東西….
這個是騙人的,python、指令碼搞出來得到
#_*_coding:utf-8_*_a=[0xF4,0xE8,0xE9,0xF3,0xDF,0xE9,0xF3,0xDF,0xE1,0xDF,0xE6,0xE1,0xEB,0xE5,0xDF,0xE6,0xEC,0xE1,0xE7]flag=''for i in a: flag+=chr(i+128-256)print flag#this_is_a_fake_flag
- 1
- 2
- 3
- 4
- 5
- 6
- 7
所以說…答案就是我們最開始得到的順序
jjjjjlllllkkkkkhhhjjjl
- 1
10000000
這個題目某明奇妙的簡單,說白了就是非常直白的逆向,總共的程式碼如下
簡單明瞭,就是一個字串的匹配,非常簡單,直接上程式碼了
#_*_coding:utf-8_*_import libnuma=[0xE7,0xE1,0xEC,0xE6]a=[0xE6,0xEC,0xE1,0xE7,0xBA,0xF4,0xE5,0xF3,0xF4,0xF4,0xE5,0xF3,0xF4]flag=''for i in a: flag+=chr(i^0x80)print flag
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
該題不簡單
真是沒想到,一看題目難度說是難…還以為是爆炸,一看為啥全世界都會啊….感覺不對勁,使勁看啊看,發現其實很簡單…首先我們試一試,找到關鍵字密碼,順勢找到了判斷的位置
就是這個!我開始直接看彙編沒看出個所以然,我們反彙編一下看看就非常明顯了!關鍵就是下面那個函數了
然後我們去稽核一下那個函式,就是一個匹配就好了…暈死了…
通過其他工具可以知道1000框為使用者名稱輸入框,1001為 註冊碼輸入視窗。直接上程式碼解密即可,很簡單
#_*_coding:utf-8_*_import libnums='hello'flag ='[email protected]'for i in range(len(s)): flag+=chr((i+i*ord(s[i])*ord(s[i]))%0x42+33)print flag
- 1
- 2
- 3
- 4
- 5
- 6
- 7
證明自己吧
主函式直接了當的
真是可以,關鍵就在這個4011BA這個驗證的函式上了
其實還是一個簡單的字串匹配,輕輕鬆鬆寫出指令碼搞定…
#_*_coding:utf-8_*_flag=''a=[0x68,0x57,0x19,0x48,0x50,0x6E,0x58,0x78,0x54,0x6A,0x19,0x58,0x5E,0x06]for i in range(len(a)): a[i]=a[i]-5for i in range(len(a)): flag+=chr(a[i]^0x20)print flag
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
wzwzDingDing
首先看到類似和結果有一些聯絡的string串,然後看整個題目是一個驅動程式。
這個FLAG有點怪
終於解出來了,放給大家連結
http://blog.csdn.net/qq_35078631/article/details/78209447
1000
沒什麼說的,1000有特殊含義試一下8,在收藏夾下得到一個新檔案,寫著
G00dTh1sIske
- 1
加上一個y即可
CTF{G00dTh1sIskeY}
- 1
此處無聲
這個題目首先PEiD開啟看一下,沒發現什麼,但是我們用IDA反編譯的時候卻發現還有殼,進入ODB看一下發現大量的都是動態修改程式,然後動態跑出來的,所以沒辦法只能動態除錯然後dump了。但是這個不是傳統的UPX加殼了,我也不知道是什麼殼子,所以只用了歪打正著的方法,首先觀察一下,輸入字串一般用到了函式GetWindowText這個函式,用ODB下斷電,然後F8一路調到一個函式中間,然後將這個函式的開始當做程式的OEP進行脫殼處理。就是這裡
然後脫殼以後發現IDA可以成功編譯,然後就是靜態加上動態分析了,首先執行一下發現執行是不成功的。
有大概的提示,明白了有MD5和RC6演算法,但是不知道RC6是啥,需要現查一下…然後我們進入IDA看到了start函式看到了這個
很容易猜測應該就是呼叫GetWindowTextA獲得使用者名稱和使用者的啟用碼吧。然後看到這個sub_401960這個函式一路跟進去看到了函式
啥都不說了,就是MD5的初始化的哪一步吧,我估計就是處理MD5了,第一步提取的是註冊使用者名稱字nsfocus。然後我們看一下後面幾個函式是幹什麼的
sub_401AA0 此函式之後得到了nsfocus的MD5值b9b7dd1c421e005bc9a7f70b848e3d0e
sub_401870 檢測輸入值是不是32位的,且必須只有0-9和A-E
sub_4018C0就是把輸入的驗證碼(32位)兩個字元一組拆成16組,然後做了這樣的處理
ans += chr(第一個字元*16+第二個字元)
- 1
這樣的處理,這樣就變成了一個16長度的字串,其實就是轉換成了hex值…
sub_4011F0 不知道是啥,但是16位,所以感覺是16位的金鑰,從v3開始,總共取出16位,如下
[0x35,0x47,0x82,0x5c,0x33,0x8c,0x85,0x77,0x9a,0x67,0x45,0x7a,0x6d,0x5c,0x16,0x47]
- 1
然後對金鑰進行進一步的加工,如果需要程式解密就需要動態把這個東西爬下來了,得到了這個
這個東西IDA有點坑,反編譯沒出來,需要看彙編才能看出來…要不然感覺金鑰給被吃了一樣…
然後後面的sub_4011F0和sub_4012F0恐怕就是處理RC6的東西了
但是我們拉下了一個重要的引數就是金鑰的預設r=20,這個很關鍵(一般是預設的,但是如果改了就非常坑了)
然後我們看判定的條件居然是註冊碼的RC6和nsfocus的MD5值進行比較。那麼我們的32位的註冊碼如何恢復就很明確了
1.知道金鑰,密文是b9b7dd1c421e005bc9a7f70b848e3d0e進行解密2.對得到的16位進行恢復
- 1
- 2
但是一直找不到RC6好用的程式額…github上面dump下來修改的結果都不對額…最後找到了網上一個小工具…
終於算是做出來了…首先考察的是 脫殼的知識,然後其實算是投機取巧了,如果沒有提示MD5演算法我能看出來,但是RC6有什麼特徵呢?所以還是見識太少了。
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow