1. 程式人生 > >實驗吧 逆向 小練習

實驗吧 逆向 小練習

                       

阿拉丁神燈

迷得很,還以為需要真正的逆向,就是找到關鍵字串…第一下就不合常理…

這裡寫圖片描述

看來所有的逆向之前還是看一下段啊字串什麼有沒有藏東西,或者看到返回的關鍵字爆搜一下嗯

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