1. 程式人生 > >Bugku 逆向WP(1)

Bugku 逆向WP(1)

文章目錄

Bugku 逆向

2018-11-7 19:05:10
今天開始刷題了.

入門逆向

題目非常簡單.用IDA直接看彙編程式碼,會發現printf函式後面有很多mov指令,這裡就是flag.
建議不要直接F5,因為F5後看不到mov指令,找了半天.
在這裡插入圖片描述

flag{Re_1s_S0_C0OL}

Easy_vb

看題目就知道和vb有關.

  1. 先執行一下程式
    在這裡插入圖片描述
    一個確定按鈕,猜測所有數字正確時彈出flag.
  2. 用OD開啟,先搜尋字串,然後得到flag.突然感覺好簡單…
  3. 在這裡插入圖片描述

MCTF{N3t_Rev_1s_E4ay}
雖然答案是這個但是平臺提交的時候要把前面mctf改為flag

Easy_Re

OD開啟搜尋字串.找到了flag.好水

DUTCTF{We1c0met0DUTCTF}

遊戲過關

一個遊戲,憑實力打出來了flag

zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

Timer(阿里CTF)

因為是一道Android題目,所以要先反編譯,試了很多工具,最後確定JEB2是最好用的.其他反編譯出來原始碼是錯誤的.

  1. 下載執行
    發現需要200000秒就會出現flag.
  2. 反編譯,定位關鍵點
if(MainActivity.this.beg - MainActivity.this.now <= 0) {
        this.val$tv1.setText("The flag is:");
        this.val$tv2.setText("alictf{" + MainActivity.this.stringFromJNI2
(MainActivity.this.k) + "}"); }

可以看到beg-now的值<=0就會呼叫stringFromJNI2顯示falg.

public native String stringFromJNI2(int arg1) {
}

native表名是呼叫so了,我們不需要反編譯so檔案,只要算出k的值就可以了.
3. 計算k的值
知道計算k值得地方.

if(MainActivity.is2(MainActivity.this.beg - MainActivity.this.now)) {
        MainActivity.this.k += 100;
        }
else {
    --MainActivity.this.k;
    }

這裡其實是一個迴圈,將beg-now的值帶入is2.每秒迴圈一次.
4. beg和now值分析

 public MainActivity() {
        super();
        this.beg = (((int)(System.currentTimeMillis() / 1000))) + 200000;
        this.k = 0;
        this.t = 0;
    }
MainActivity.this.t = System.currentTimeMillis();
MainActivity.this.now = ((int)(MainActivity.this.t / 1000));

beg的值就是**執行時的當前時間(毫秒)/1000(秒)+200000秒.
now的值就是當前時間的秒.
所以beg-now=200000+now-beg的程式執行時間(因為小於1秒可以忽略)
5. 計算k值
is2是程式碼中的原始碼,直接計算得到k=1616384

public class timer {
    public static boolean is2(int arg4) {
        boolean v1 = true;
        if(arg4 > 3) {
            if(arg4 % 2 != 0 && arg4 % 3 != 0) {
                int v0 = 5;
                while(true) {
                    if(v0 * v0 <= arg4) {
                        if(arg4 % v0 != 0 && arg4 % (v0 + 2) != 0) {
                            v0 += 6;
                            continue;
                        }
                        return false;
                    }
                    else {
                        return v1;
                    }
                }
            }
            v1 = false;
        }
        else if(arg4 <= 1) {
            v1 = false;
        }
        return v1;
    }

    public static void main(String[] args) {
        System.out.println("hello");
        int k =0;
        int time =200000;
        while(time > 0){
            if(is2(time)){
                k += 100;
            }
            else{
                --k;
            }
            --time;
        }
        System.out.println(k);
    }

}
  1. 修改smali
    現在我們只需要修改beg-now<=0的邏輯為!=0和k的值,然後再編譯生成apk執行就可以得到flag.
    if-gtz v0, :cond_0

    .line 53
    iget-object v0, p0, Lnet/bluelotus/tomorrow/easyandroid/MainActivity$1;->val$tv1:Landroid/widget/TextView;

    const-string v1, "The flag is:"

這裡gtz是大於0的意思.我們改成
if-ltz v0, :cond_0
然後修改k的值

   iget v3, v3, Lnet/bluelotus/tomorrow/easyandroid/MainActivity;->k:I

在這個後面加上const v3, 1616384;這句話表示給v3賦值.
編譯執行,得到flag

alictf{Y0vAr3TimerMa3te7}
提交答案時alictf改為flag

逆向入門

水題,不是exe檔案,開啟是image資料.
掃碼得到flag

bugku{inde_9882ihsd8-0}

love

先嚐試執行,輸入字串,進行比較。

reverse_3.exe
please enter the flag:sss
wrong flag!

IDA開啟,找wrong flag!
在這裡插入圖片描述
str2字串可以找到.
可以看出來對字串進行一些列變換後,和str2進行比較.
跟進去去看sub_4110BE函式的作用
在這裡插入圖片描述
猜測可能是base64加密,寫指令碼嘗試

import  base64
s2 ="[email protected]@dH"
s1=""
for i in range(len(s2)):
    a =ord(s2[i])-i
    s1+=chr(a)
print(str(base64.b64decode(s1),'utf-8'))

得到flag

flag{i_l0ve_you}

LoopAndLoop(阿里CTF)

  1. 又是一道Android題目.用Android Killer反編譯(因為可以編譯回去,並正常執行,所以推薦此軟體)
  2. 執行程式,如果輸入正確的數字就會返回flag
  3. 反編譯看原始碼
paramAnonymousView = this.val$ed.getText().toString();
try
{
    int i = Integer.parseInt(paramAnonymousView);
if (MainActivity.this.check(i, 99) == 1835996258)
{
    localTextView1.setText("The flag is:");
    localTextView2.setText("alictf{" + MainActivity.this.stringFromJNI2(i) + "}");
    return;
}

i是我們輸入的值,經過check函式如果相等.就會將i傳給stringFromJNI2函式處理,顯示flag.chec函式是native的,所以直接看so檔案.

public int check(int arg2, int arg3) {
        return this.chec(arg2, arg3);
    }
public native int chec(int arg1, int arg2) {
    }

後面的看不懂程式碼,只能貼大佬的了.
在這裡插入圖片描述

result = _JNIEnv::CallIntMethod(Evn, obj, *(&check1_id + 2 * _99 % 3), _99 - 1);

分析後說第一個引數*2%3決定呼叫三個check函式中的一個,第二個引數每次減一

public int check1(int input, int s) {
        int v1 = input;
        int v0;
        for(v0 = 1; v0 < 100; ++v0) {
            v1 += v0;
        }

        return this.chec(v1, s);
    }

public int check2(int input, int s) {
        int v2;
        int v3 = 1000;
        int v1 = input;
        if(s % 2 == 0) {
            int v0;
            for(v0 = 1; v0 < v3; ++v0) {
                v1 += v0;
            }

            v2 = this.chec(v1, s);
        }
        else {
            for(v0 = 1; v0 < v3; ++v0) {
                v1 -= v0;
            }

            v2 = this.chec(v1, s);
        }

        return v2;
    }

public int check3(int input, int s) {
        int v1 = input;
        int v0;
        for(v0 = 1; v0 < 10000; ++v0) {
            v1 += v0;
        }

        return this.chec(v1, s);
    }

貼上別人的程式碼

a = 1835996258
i = 99
while i > 0:
    i -= 1
    if i > 0:
        now = ((i + 1) * 2) % 3 #注意一下這裡是i+1,因為這裡判斷的是沒有減一的第二個引數
        if now == 0:
            a -= 4950 #等價於for迴圈 從1加到99
        elif now == 1:
            if i % 2 == 0:
                a -= 499500
            else:
                a += 499500
        else:
            a -= 49995000
print(a)

236492408

alictf{Jan6N100p3r}

easy-100(LCTF)

又是一道安卓題.

  1. 先JEB反編譯,檢視MainActivity程式碼
protected void onCreate(Bundle arg3) {
    super.onCreate(arg3);
    this.setContentView(2130968602);
    ApplicationInfo v0 = this.getApplicationInfo();
    v0.flags &= 2;
    this.p();
    this.findViewById(2131427413).setOnClickListener(new d(this));
}
  1. 分析,主函式Main,先執行p函式,p函式後面會用,先不講.建立了一個按鈕監聽事件在classs d中.
    class d 中onclick函式,當我們點選安卓的按鈕,觸發函式.
public void onClick(View arg5) {
        if(MainActivity.a(this.a, MainActivity.a(this.a), this.a.findViewById(2131427414).getText().toString())) {
            View v0 = this.a.findViewById(2131427412);
            Toast.makeText(this.a.getApplicationContext(), "Congratulations!", 1).show();
            ((TextView)v0).setText(2131099682);
        }
        else {
            Toast.makeText(this.a.getApplicationContext(), "Oh no.", 1).show();
        }
    }

if判斷正確就顯示flag.呼叫了Main函式中的a函式,第一個引數是控制代碼,第二個引數是呼叫了a函式(另外一個)返回一個字串,第三個引數是我們輸入的字串.
3. a函式分析

private String v;

static String a(MainActivity arg1) {
    return arg1.v;
}

通過呼叫a,返回Main中的字串v,字串v的初始化在p函式中進行.
4. p函式分析

 private void p() {
        try {
            InputStream v0_1 = this.getResources().getAssets().open("url.png");
            int v1 = v0_1.available();
            byte[] v2 = new byte[v1];
            v0_1.read(v2, 0, v1);
            byte[] v0_2 = new byte[16];
            System.arraycopy(v2, 144, v0_2, 0, 16);
            this.v = new String(v0_2, "utf-8");
        }
        catch(Exception v0) {
            v0.printStackTrace();
        }
    }

p函式的作用就是讀取一張圖片的二進位制資料取出這張圖片byte[144:144+16]的資料儲存在v字串中.
5. 繼續分析if判斷語句
上面說了if語句呼叫了Main的a函式(三個引數)

static boolean a(MainActivity arg1, String arg2, String arg3) {
    return arg1.a(arg2, arg3);
}

private boolean a(String arg4, String arg5) {
    return new c().a(arg4, arg5).equals(new String(new byte[]{21, -93, -68, -94, 86, 117, -19, -68, -92, 33, 50, 118, 16, 13, 1, -15, -13, 3, 4, 103, -18, 81, 30, 68, 54, -93, 44, -23, 93, 98, 5, 59}));
}

可以看出a函式(三個引數)的呼叫了a函式(兩個引數).而a函式(兩個引數)的呼叫c的a函式(兩個引數).計算完後和後面的位元組比較,如果相等就顯示flag.
6. a函式(兩個引數)分析

public String a(String arg5, String arg6) {
    String v0 = this.a(arg5);
    String v1 = "";
    a v2 = new a();
    v2.a(v0.getBytes());
    try {
        v0 = new String(v2.b(arg6.getBytes()), "utf-8");
    }
    catch(Exception v0_1) {
        v0_1.printStackTrace();
        v0 = v1;
    }

    return v0;
}
this.a = new SecretKeySpec(arg4, "AES");
            this.b = Cipher.getInstance("AES/ECB/PKCS5Padding");

arg5是從圖片中獲取的字串,arg6是我們輸入的.
後面程式碼主要就是AES加密.將arg5經過變換後的字串當做密碼,將輸入的字串進行AES加密後和後面給出的字串比較,如果相等得到flag.
那我們就可以直接解密AES就可以得到flag了.

#equals比較的位元組陣列
byteArray =[21, -93, -68, -94, 86, 117, -19, -68, -92, 33,
            50, 118, 16, 13, 1, -15, -13, 3, 4, 103, -18,
            81, 30, 68, 54, -93, 44, -23, 93, 98, 5, 59]
#讀取圖片
with open('url.png','rb') as f:
    p =f.read()
str1 =p[144:144+16]


str2 =""
for i in range(0,len(str1),2):
    str2 += chr(str1[i+1])
    str2 += chr(str1[i])
print(str2)

print(p[144:144+16])
#把位元組陣列轉換為16進位制字串
str3 =""
for i in byteArray:
    s=str(hex((i+256)%256))
    if len(s) <4:
        s = s[0:2]+'0'+s[2:]
    str3
            
           

相關推薦

Bugku 逆向WP(1)

文章目錄 Bugku 逆向 入門逆向 Easy_vb Easy_Re 遊戲過關 Timer(阿里CTF) 逆向入門 love LoopAndLoop(阿里CTF) easy-100(LCTF

18/09/28-3-BugKu-逆向-easycrack-100(NJCTF)

ssa 根據 cal 加密 color pan cat string isp 0x00 題目鏈接:https://pan.baidu.com/s/12RGpSCcRVSu-tyreTqecaA 提取碼:9xyv 0x01 Java層分析 1)messageMe方法先獲取包

18/10/05-5-BugKu-逆向-LittleRotatorGame(NJCTF)

game iostream splay display 腳本 cpp ctf llvm spl 0x00 題目鏈接:https://pan.baidu.com/s/1FLIaSN6EOe34qQNO_8yi-g 提取碼:phou 0x01 native層分析 根據提示程

BugKu Web WP

變數1 這道題要好好說一下,因為以前不太知道這個套路。 我們來看看原始碼: 這個程式碼最重要的兩部分:一是 正則匹配,對我們輸入的進行檢查。  二是  var_dump($$args)  這句程式碼。 我們可以想到 如果我們的 $args 的值 剛

Bugku隱寫1(WinHex的學習)

將圖片在WinHex裡開啟 第二行,前四位是寬,後四位是高。(這裡兩個數字在一起,是為一位) PC機對有多位的十六進位制的資料的儲存方法是:低位在前,高位在後(16進制中,最右邊為最低位) 有大佬說,把圖片扔到虛擬機器裡,寬和高不匹配的話打不開 手動嘗試,出現的錯誤是:無法載入物件,IHDR

Bugku 逆向題(持續更新)

1.入門逆向-baby 一開始用OD開啟,查完字串什麼都發現不了,於是乎拖入IDA。   於是發現 這裡一大串的mov,在觀察66h,6Ch,61h,67h,稍有經驗的同學應該知道這是ASCII字元flag的16進位制 把他們逐個敲進寫好的指令碼,得到flag。(IDA

BUGKU-逆向(reverse)-writeup

目錄 入門逆向 Easy_vb Easy_Re 遊戲過關 Timer(阿里CTF) 逆向入門 love LoopAndLoop(阿里CTF) easy-100(LCTF) SafeBox(NJCTF) Mountain climbing 前言:在bug

bugku 雜項 wp

1.這是一張單純的圖片 點進題目中確實是一張單純的圖片233333 嗯,直接用winhex開啟看看 在最後發現了一段編碼,用Unicode解密看看。 flag出現了:key{you are right} 2.寫隱 解壓之後是一張照片, 直接用w

2018/12/15-Bugku-逆向-Take the maz

連結:https://pan.baidu.com/s/1476ONvrOcG0Jbzl1PEe30w 提取碼:az10    根據題目名稱可知道這是一個迷宮題,這個迷宮的實現比較有意思。   首先讓輸入24個字元。 然後sub_45C748是一個VM,試著輸入24個

Android逆向-Android基礎逆向1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

CTF練習之bugku(加密1

1、滴答~滴 -... -.- -.-. - ..-. -- .. ... -.-. 2、聰明的小羊 一隻小羊翻過了2個柵欄 KYsd3js2E{a2jda} 3、ok Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook

bugku 逆向之consoleapplication4(遊戲過關)

一頓分析 對於一個逆向小白來說,在這題上著實花了點時間,特記錄下~ 初看這題時,感覺就是資料題,經過一頓操作,發現1-8依次輸一邊,答案就出來了,反正每盞燈只能操作奇數次。 但是這樣的方式做一道“逆向”題,著實沒啥成就感,反正剛學習,那就從簡單題開始吧。 載入

逆向破解 H.Koenig 遙控器 Part 1

body x64 模塊 做了 目前 完成 努力 而且 優惠 逆向破解 H.Koenig 遙控器(Part 1) 最近我正在嘗試一研究些自動吸塵器機器人。iRobot公司的Roomba貌似是該領域的領導者,但是作為實驗來講的話這些東西真是太昂貴了,我也找不到任何的折

1.逆向分析之殼內找註冊碼

逆向先看看特點有:估計註冊碼是通過不同電腦與用戶名自動生成的 註意關鍵字符串 這裏就從字符串下手 查殼 (有殼)載入od斷下來了由於有殼所以先f9運行運行起來了就不管你怎麽加密 最後都要解密加載定位到 代碼段 (ctrl+g) 輸入0x401000搜索字符串(一般用智能搜索)搜索 未購買(怎麽就搜那個

逆向分析實戰》1.1

浮點 重要 保存 字符串操作 減法 存儲 dir 符號位 修飾 1.OD界面的熟悉 左上為反匯編窗口,用於顯示 反匯編代碼,調試分析程序主要在這個窗口中進行。 左中為信息提示窗口,用於顯示與反匯編窗口中上下文環境相關的內存,寄存器或者跳轉來源,調用來源等信息。 左下為數據窗

Bugku—雜項—come_game(wp

0x00 前言 這是Bugku—雜項—come_game,是第七季極客大挑戰中的題。 0x01 解題過程 下載好題目,解壓開啟檔案,開啟可執行檔案 進行通關玩耍,會發現生成一個檔案,用記事本開啟,你會發現發現裡面記錄了通關數,考慮更為為最後一關

Bugku—web—web3(wp

0x00 前言 這是Bugku中web中的web3的題目。 0x01 解題過程 1.點選這個網址,會出現一個介面,無論點選哪裡都關不掉。 2.考慮這是瀏覽器指令碼的設定因素,可以關閉你瀏覽器裡指令碼的在設定採用禁用。 3. 關閉指令碼後,再開啟網址,發現是一片空白,於

Bugku—雜項—眼見非實(ISCCCTF)(WP)

0x00 前言 這是Bugku—雜項中一道叫做眼見非實的題目。主要是對.xml的考察。 0x01 解題過程 下載好該zip檔案後會發現該壓縮檔案沒有後綴,於是加上字尾再解壓。 2. 開啟解壓檔案後,是一個docx文件,但是開啟后里面是一些亂碼。 3.

bugku程式碼審計——WP

目錄   1.extract變數覆蓋 2. strcmp比較字串 3.urldecode二次編碼繞過 4.md5()函式 5.陣列返回NULL繞過 6.弱型別整數大小比較繞過 7.sha()函式比較繞過 8. md5加密相等繞過 9.十六進位制與數字

墨者學院 - 逆向分析實訓-exe(第1題)

  OD載入 00401293   .  E8 B8FEFFFF   call game.00401150  跟入 00401246  |.&nb