逆向project實戰--Acid burn

0x00 序言

這是第二次破解 crackme 小程序,感覺明顯比第一次熟練。破解過程非常順利,差點兒是分分鐘就能夠找到正確的 serial,可是我們的目標是破解計算過程。以下將具體介紹。

0x01 初次執行

剛開始拿到 crackme 先執行程序。看看有哪些明顯的特征。或者有哪些任務須要完畢:
這里寫圖片描寫敘述
雙擊程序后彈框,顯然第一個任務就是把這個框框弄掉,我們繼續執行:
這里寫圖片描寫敘述

這個小程序比上次的要復雜,有兩個 serial ,我們先看看左邊的:

這里寫圖片描寫敘述
不出意外。猜錯了,有明顯的彈框和失敗字符串作為特征。我們接著看右邊的:
這里寫圖片描寫敘述

不出意外,再次失敗,依舊是彈框。

0x02 開始調試

1、明白目標
通過上面的執行分析,我們須要干掉第一個彈框,以及興許的兩個 serial 。同一時候我們發現三者的共同特征為彈框。所以首先攔截彈框函數:
右鍵代碼區選擇 “serach for” => “All intermodules calls”:
這里寫圖片描寫敘述

在新窗體中輸入 messageboxa,右鍵。選擇”Set breakpoint on every call to MessageBoxA”:
這里寫圖片描寫敘述

這樣我們就給全部調用彈框函數的地方下了斷點,接著回到代碼區執行程序。

2、調用者
按 F9 執行到彈框函數處,我們發現此時的棧頂就是第一次彈框時的字符串的地址,于是我們須要找到那個調用彈框函數的函數。叫做調用者。

這里我們往上看,找到當前這個函數的入口并下斷點:
這里寫圖片描寫敘述

然后我們 Ctrl + F2 又一次加載程序。F9 執行到剛才下斷點的入口:
這里寫圖片描寫敘述
此時棧頂就是調用者執行call指令時保存的返回點。我們在代碼區中查找這個地址(42F79C),注意單擊代碼區,按 Ctrl + G 進行查找:
這里寫圖片描寫敘述

看見了嗎,就是這個函數,僅僅有幾句代碼。以下我們就來消滅它。

3、去掉彈框
調用了函數才會彈框,我們的想法就是讓它不調用函數,那么直接讓函數返回是最簡單的方式。于是我們把函數入口處的第一條指令改成RETN 就可以:
單擊指令,按一下空格鍵能夠改動:
這里寫圖片描寫敘述

此時我們能夠把改動保存到文件里:
右鍵指令,選擇 “Copy to executable” => “selection”:

這里寫圖片描寫敘述

在新窗體中右鍵選擇 “Save file”:
這里寫圖片描寫敘述

然后保存:
這里寫圖片描寫敘述

執行新的程序發現第一次的彈框成功消失。

4、破解右側serial
接下來我們轉到右邊的 serial,輸入隨意字符串。然后點擊button:
我們發現程序停在了彈框函數的入口:
這里寫圖片描寫敘述

此時棧頂的值就應該是上級函數的返回地址:
這里寫圖片描寫敘述

我們繼續在代碼區搜索此地址(42F509):
這里寫圖片描寫敘述

發現了嗎,有推斷條件。能夠看出是字符串比較函數,我們設置斷點。F9 執行究竟后又一次點擊button:
這里寫圖片描寫敘述

程序停在了斷點處。看看棧區。發現給函數的參數中的字符串:
這里寫圖片描寫敘述

破解起來確實非常輕松,字符串是固定的:Hello Dude!
這里寫圖片描寫敘述

5、破解左側 serial
我們繼續執行,轉到左側。輸入隨意字符串后點擊button:
依據剛才的方式找到調用者返回地址:42FB37
這里寫圖片描寫敘述

查找代碼區:
這里寫圖片描寫敘述

發現字符串比較函數并下斷點。此時查看棧區:
這里寫圖片描寫敘述

再往上看代碼區:
這里寫圖片描寫敘述

我們能夠猜測出 serial 是 “CW-” + 某個數 + “CRACKED”,中間的數是我們須要找的目標。

6、真實的目標
我們給 serial 生成函數的入口下一個斷點,然后又一次點擊button執行到斷點處 F8 單步走:
這里寫圖片描寫敘述

中間發現兩段代碼:

EAX = name[0] * 7 + name[1] * 0x10;
EAX = name[3] * 0xB + name[2] * 0xE

繼續向下執行,發現另外一段代碼:
這里寫圖片描寫敘述
函數入口的以下有一句不起眼的代碼:
這里寫圖片描寫敘述

兩個結合起來就是:

EAX = name[0] * 0x29 * 2;

后面我們發現調用字符串輸出函數之前 EAX 的值被置為那個內存單元的值:
這里寫圖片描寫敘述

繼續往下調試結果就非常明顯了,第三段代碼才是我們要的。

0x03 雙重檢測

1、簡單粗暴的 C語言
代碼例如以下:

#include <stdio.h>int main()
{char name[1024];printf("Input your name: ");scanf("%s", name);printf("Serial: CW-%d-CRACKED\n", name[0] * 0x29 * 2);return 0;
}

執行結果:
這里寫圖片描寫敘述

2、原程序檢驗
這里寫圖片描寫敘述

0x04 總結

這個小程序左邊的 serial 和 name 的第一個字符有關,而且字符串長度不能小于4.

轉載于:https://www.cnblogs.com/yangykaifa/p/7396298.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyCharm使用技巧(六):Regullar Expressions的使用

2019獨角獸企業重金招聘Python工程師標準>>> PyCharm v2018.2最新版本下載 使用正則表達式查找和替換文件中的文本 示例代碼 使用正則表達式查找和替換字符串 假設您想用擴展標記<title> </title>替換元素&#xff08;title&#xff09;中的屬性&#x…

內核中_init,_exit中的作用

__init&#xff0c; __initdata等屬性標志&#xff0c;是要把這種屬性的代碼放入目標文件的.init.text節&#xff0c;數據放入.init.data節──這一過程是通過編譯內核時為相關目標平臺提供了xxx.lds鏈接腳本來指導ld完成的。 對編譯成module的代碼和數據來說&#xff0c;當模…

jQuery筆記總結

來源于&#xff1a;http://blog.poetries.top/2016/10/20/review-jQuery/ http://www.jianshu.com/p/f8e3936b34c9 首先&#xff0c;來了解一下jQuery學習的整體思路 第一節 jQuery初步認知 jQuery概述 JQuery概念 javascript概念 基于Js語言的API和語法組織邏輯&#xff0c;通…

芯片生產流程

每個半導體產品的制造都需要數百個工藝&#xff0c;泛林集團將整個制造過程分為八個步驟&#xff1a;晶圓加工-氧化-光刻-刻蝕-薄膜沉積-互連-測試-封裝。 一、晶圓加工 所有半導體工藝都始于一粒沙子&#xff01;因為沙子所含的硅是生產晶圓所需要的原材料。晶圓是將硅(Si)或砷…

GRE Sub math 報名

Step1 注冊ETS帳號 Step2 登錄帳號&#xff0c;點擊Register/Find Test Centers, Dates Step3 按照提示查詢考場 如果沒有結果而是出現了如下提示&#xff0c;意味著這個地方沒有考位了&#xff0c;需要選擇其他地方的考位 Step 4 接下來就和GRE general test的過程一樣了&…

????platform_device_系列函數及其設備注冊的作用

platform_device_系列函數&#xff0c;實際上是注冊了一個叫platform的虛擬總線。使用約定是如果一個不屬于任何總線的設備&#xff0c;例如藍牙&#xff0c;串口等設備&#xff0c;都需要掛在這個虛擬總線上。 driver/base/platform.c //platform設備聲明 struct device pla…

示例解讀 Python 2 和 Python 3 之間的主要差異

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; 每門編程語言在發布更新之后&#xff0c;主要版本之間都會發生很大的變化。 在本文中&#xff0c;Vinodh Kumar 通過示例解釋了 Python 2 和 Python 3 之間的一些重大差異&#xff0c;以幫助說明…

數字后端——布局

由于I / O單元和模塊的布放已經在布圖規劃時完成&#xff0c;因此布局的剩余任務主要是對標準單元的布局。布局方案在布圖規劃時就已經做了決定&#xff0c;要么選擇展平式布局&#xff0c;要么就是層次化布局。 一、布局目標 布局的目標也即布局內容實施之后所要達到的預期值…

python基礎 函數 (四)

一 函數基本 def func1():print("hello world")return 1, "hello", ("wo", "ai"), ["ni", "da"], {"you": "xi"} # return 可以返回任意# 結果&#xff1a; (1, hello, (wo, ai), [ni, da…

c#注釋

c#的注釋分為&#xff1a;這里不能不說一下什么是注釋。 注釋本身不會執行&#xff0c;只是說明性文字&#xff0c;只供程序員閱讀。 注釋又分為&#xff1a;單行注釋&#xff0c;多行注釋&#xff0c;文檔注釋。 單行注釋&#xff1a;//開始 多行注釋&#xff1a;/*開始&#…

嵌入式linux字符設備驅動

1. 我們需要先調用register_chrdev_region()或 alloc_chrdev_region()來向系統申請設備號int register_chrdev_region( dev_t first, unsigned int count, char *name ); //函數通過已知的設備號first來注冊字符設備區域。 int alloc_chrdev_region( dev_t *dev, unsigned int…

數字后端——時鐘樹綜合

在數字集成電路設計中&#xff0c;時鐘信號是數據傳輸的基準&#xff0c;它對于同步數字系統的功能、性能和穩定性起決定性作用&#xff0c;所以時鐘信號的特性及其分配網絡尤被人們關注。時鐘信號通常是整個芯片中有最大扇出、通過最長距離、以最高速度運行的信號。時鐘信號必…

52次課(mysql用戶管理、常用sql語句、 mysql數據庫備份恢復)

MySQL創建用戶以及授權 默認用戶是root用戶&#xff0c;不可能所有人員都用root用戶&#xff0c;創建用戶防止誤刪除&#xff0c;因為mysql里邊有多個庫每個庫里有很多表&#xff0c;所以需要給單獨的用戶做一些授權我只需要它對某一個數據庫有權限&#xff0c;或者說對某個數據…

線程池的種類,區別和使用場景

newCachedThreadPool&#xff1a; 底層&#xff1a;返回ThreadPoolExecutor實例&#xff0c;corePoolSize為0&#xff1b;maximumPoolSize為Integer.MAX_VALUE&#xff1b;keepAliveTime為60L&#xff1b;unit為TimeUnit.SECONDS&#xff1b;workQueue為SynchronousQueue(同步隊…

20145225 《信息安全系統設計基礎》第14周學習總結

第九章 虛擬存儲器 虛擬存儲器是計算機系統最重要的概念之一&#xff0c;它是對主存的一個抽象 三個重要能力&#xff1a; 它將主存看成是一個存儲在磁盤上的地址空間的高速緩存&#xff0c;在主存中只保存活動區域&#xff0c;并根據需要在磁盤和主存之間來回傳送數據&#xf…

數字后端——布線

布線是繼布局和時鐘樹綜合之后的重要物理實施任務&#xff0c;其內容是將分布在芯片核內的模塊、標準單元和輸入輸出接口單元( I /O pad&#xff09;按邏輯關系進行互連&#xff0c;其要求是百分之百地完成它們之間的所有邏輯信號的互連&#xff0c;并為滿足各種約束條件進行優…

動態加載和靜態加載及其編譯步驟

在類unix操作系統中&#xff0c;驅動加載方式一般分為&#xff1a;動態加載和靜態加載&#xff0c;下面分別對其詳細論述。 一、動態加載 動態加載是將驅動模塊加載到內核中&#xff0c;而不能放入/lib/modules/下。 在2.4內核中&#xff0c;加載驅動命令為&#xff1a;ins…

streamsets 集成 minio s3測試

具體streamsets crate 集成可以參考 streamsets crate 以下文檔只關注minio 集成的配置 minio 服務 搭建 具體搭建參考&#xff1a; https://www.cnblogs.com/rongfengliang/p/9197315.html 創建bucket &#xff08;crate 集成使用&#xff09; 測試的csv 文件從https://www.s…

sqlite性能優化

1、數據庫性能上 1.1 批量事務插入&#xff0c;提升數據插入的性能 由于sqlite默認每次插入都是事務&#xff0c;需要對文件進行讀寫&#xff0c;那么減少事務次數就能簡書磁盤讀寫次數從而獲得性能提升。 1.2 單條sql優于多條sql 實測發現&#xff0c;對于幾十條sql插入當你替…

【codecombat】 試玩全攻略 第十四關 已知敵人

第十四關 已知敵人 在這一關里&#xff0c;我們的英雄獲得了一副可以看見敵人的眼鏡&#xff0c;所以他很強勢的學會了“發現敵人”的技能。 hero.findNearestEnemy()命令&#xff0c;單詞多了&#xff0c;首字母都要大寫了&#xff0c;不然分不出來。玩過wow的小伙伴用過 宏命…