[Reverse] - 百度杯”CTF比賽 2017 二月場-CrackMe-1

環境:Windows XP

工具:
IDA
OD
EXEINFOPE

0x00 查殼

這里寫圖片描述

0x01 分析

拖入OD,字符串查找看一看。
這里寫圖片描述

跟進去看就可以知道關鍵call了

0040196A   .  48            dec eax
0040196B   .  0F85 C4000000 jnz CrackMe1.00401A35
00401971   .  B8 E8030000   mov eax,0x3E8                            ;  Case 111 (WM_COMMAND) of switch 00401956
00401976   .  66:3945 10    cmp word ptr ss:[ebp+0x10],ax
0040197A   .  0F85 B5000000 jnz CrackMe1.00401A35
00401980   .  8B4D 08       mov ecx,dword ptr ss:[ebp+0x8]
00401983   .  E8 88F8FFFF   call CrackMe1.00401210                   ;  返回值要為0x2EF
00401988   .  3D 29090000   cmp eax,0x929                            ;  Switch (cases 168..1435)
0040198D   .  7F 54         jg XCrackMe1.004019E3
0040198F   .  74 3A         je XCrackMe1.004019CB
00401991   .  3D 68010000   cmp eax,0x168
00401996   .  74 23         je XCrackMe1.004019BB
00401998   .  3D EF020000   cmp eax,0x2EF
0040199D   .  0F85 92000000 jnz CrackMe1.00401A35
004019A3   .  6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL; Case 2EF of switch 00401988
004019A5   .  68 0CFD4000   push CrackMe1.0040FD0C                   ; |Title = "CrackMe"
004019AA   .  68 14FD4000   push CrackMe1.0040FD14                   ; |Text = "This is Flag!"
004019AF   .  6A 00         push 0x0                                 ; |hOwner = NULL
004019B1   .  FF15 08C14000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

00401983跟進去,翻到后面有個這個:

00401267   .  68 402E4100   push CrackMe1.00412E40                   ; /pStartupinfo = CrackMe1.00412E40
0040126C   .  FF15 28C04000 call dword ptr ds:[<&KERNEL32.GetStartup>; \GetStartupInfoA
00401272   .  833D 502E4100>cmp dword ptr ds:[0x412E50],0x0
00401279      0F85 6D060000 jnz CrackMe1.004018EC
0040127F   .  833D 542E4100>cmp dword ptr ds:[0x412E54],0x0
00401286      0F85 60060000 jnz CrackMe1.004018EC
0040128C   .  833D 602E4100>cmp dword ptr ds:[0x412E60],0x0
00401293      0F85 53060000 jnz CrackMe1.004018EC
00401299   .  833D 642E4100>cmp dword ptr ds:[0x412E64],0x0
004012A0   .  0F85 46060000 jnz CrackMe1.004018EC
004012A6   .  833D 682E4100>cmp dword ptr ds:[0x412E68],0x0
004012AD   .  0F85 39060000 jnz CrackMe1.004018EC
004012B3   .  833D 582E4100>cmp dword ptr ds:[0x412E58],0x0
004012BA   .  0F85 2C060000 jnz CrackMe1.004018EC
004012C0   .  833D 5C2E4100>cmp dword ptr ds:[0x412E5C],0x0
004012C7   .  0F85 1F060000 jnz CrackMe1.004018EC
004012CD   .  F605 6C2E4100>test byte ptr ds:[0x412E6C],0x80
004012D4   .  0F85 12060000 jnz CrackMe1.004018EC

判斷STARTUPINFO信息來反調試。

規定輸入內容的長度

0040133E   .  8D041B        lea eax,dword ptr ds:[ebx+ebx]
00401341   .  3BC1          cmp eax,ecx
00401343   .^ 75 B2         jnz XCrackMe1.004012F7

規定輸入內容的字符的范圍

00401370   > /8A8414 840000>mov al,byte ptr ss:[esp+edx+0x84]
00401377   . |3C 41         cmp al,0x41
00401379   . |7C 04         jl XCrackMe1.0040137F
0040137B   . |3C 46         cmp al,0x46
0040137D   . |7E 10         jle XCrackMe1.0040138F
0040137F   > |3C 30         cmp al,0x30
00401381   .^|0F8C 70FFFFFF jl CrackMe1.004012F7
00401387   . |3C 39         cmp al,0x39
00401389   .^|0F8F 68FFFFFF jg CrackMe1.004012F7
0040138F   > |42            inc edx
00401390   . |3BD1          cmp edx,ecx
00401392   .^\7C DC         jl XCrackMe1.00401370                    ;  規定只能是數字和大寫字母

然后是核心算法的內容了,最后面這里就是比較內容決定是否是正確了:

 004018A0   > /8B840C AC0000>mov eax,dword ptr ss:[esp+ecx+0xAC]
004018A7   . |3B840C D40000>cmp eax,dword ptr ss:[esp+ecx+0xD4]
004018AE   . |75 22         jnz XCrackMe1.004018D2                   ;  這里不能跳
004018B0   . |83C1 04       add ecx,0x4
004018B3   . |83F9 28       cmp ecx,0x28
004018B6   .^\7C E8         jl XCrackMe1.004018A0

這是是填入內容的語句

00401767   .  88BC0C AC0000>mov byte ptr ss:[esp+ecx+0xAC],bh
0040187F   .  888414 D40000>mov byte ptr ss:[esp+edx+0xD4],al

IDA分析一下就知道,其實兩個算法是一樣的,只是換了個變量名。

0x02 結果

算法過程感覺很復雜,就沒有用代碼實現一遍了。

方法一:爆破

ABCDEF1234567890ABABCDEF1234567890AB
0012FA5C  3C 81 64 30 E8 EE 0A 90 20 1B 46 52 C8 20 FE D4  <0.?FR?0012FA6C  8C FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00..............
0012FA7C  00 00 00 00 00 00 00 00 B4 0A C0 6D AB 59 97 1F  ........?續玒?
0012FA8C  B4 B4 0A C0 6D AB 59 97 1F B4 00 00 00 00 00 00.續玒??.....
0012FA9C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ACADAEAFBABBBCBDBEBFCACBCDCECFDADBDC
0012FA5C  3C 81 64 30 E8 EE 0A 90 20 1B 46 52 C8 20 FE D4  <0.?FR?0012FA6C  8C FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00..............
0012FA7C  00 00 00 00 00 00 00 00 73 EA 21 80 C5 24 E3 5A  ........s??0012FA8C  D1 F0 F5 D4 0A C1 20 E5 44 03 00 00 00 00 00 00  佯踉.?......
0012FA9C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

這樣的話基本上就可以看出輸入的每兩個字符組成16進制,通過一定的映射關系,映射到對應的值,而且每兩個字符之間互不影響。這樣的話就可以列舉0x00-0xFF所有值,找到每個值的映射關系,制成一張表,就可以通過查表來看出

3C 81 64 30 E8 EE 0A 90 20 1B 46 52 C8 20 FE D4 8C FE

對應什么字符串了。

方法二:追碼
剛剛也有提到,兩個算法是一樣的

00401649   .  E8 B2F9FFFF   call CrackMe1.00401000                   ;  下面是開始兩個算法
0040164E   .  8B4C24 34     mov ecx,dword ptr ss:[esp+0x34]
00401652   .  33D2          xor edx,edx
00401654   .  895424 20     mov dword ptr ss:[esp+0x20],edx
00401658   .  895424 24     mov dword ptr ss:[esp+0x24],edx
0040165C   .  894C24 1C     mov dword ptr ss:[esp+0x1C],ecx
00401660   >  8A21          mov ah,byte ptr ds:[ecx]                 ;  這里的al是輸入的內容
00401662   .  895424 10     mov dword ptr ss:[esp+0x10],edx          ;  bh就是上面的算法計算出來的

這樣的話就可以在00401649處的call下斷點,查看BH的值,就可以得知要輸入的字符串是什么了。

得到:
838EFBFFE7D9CDDFCFC4C1C5C7CFC9CBB3C9

在i春秋里提交:
flag{838EFBFFE7D9CDDFCFC4C1C5C7CFC9CBB3C9}

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

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

相關文章

【DeepLearning】Exercise:Learning color features with Sparse Autoencoders

Exercise:Learning color features with Sparse Autoencoders 習題鏈接&#xff1a;Exercise:Learning color features with Sparse Autoencoders sparseAutoencoderLinearCost.m function [cost,grad,features] sparseAutoencoderLinearCost(theta, visibleSize, hiddenSize,…

win7 64位系統下 PL/SQL無法連接的問題

第一步&#xff1a;下載oracle客戶端 由于 PLSQL Developer 沒有64位版本&#xff0c;所以在64位系統上運行該程鏈接64位Oracle時就會報錯&#xff0c;筆者為這個問題糾結了好幾天&#xff0c;后來通過請教Google 動手實踐&#xff0c;終于搞定了這個問題。現在把筆者解決的過…

SQL2008R2 express版本不支持維護計劃

SQL2008R2 express版本不支持維護計劃轉載于:https://www.cnblogs.com/toSeeMyDream/p/4218626.html

SHA1算法詳解

0x00 前言 SHA1算法也是哈希算法的一種&#xff0c;只要理解了MD5算法&#xff0c;SHA1也很快就能理解。 MD5算法可以參考&#xff1a;MD5算法詳解 MD5算法得出的MD5值長度為16個字節&#xff08;8*16128位&#xff09; SHA1算法得出的SHA1值長度為20個字節&#xff08;8*2…

HTML5 地理位置定位(HTML5 Geolocation)

地理位置&#xff08;Geolocation&#xff09;是 HTML5 的重要特性之一&#xff0c;提供了確定用戶位置的功能&#xff0c;借助這個特性能夠開發基于位置信息的應用。今天這篇文章向大家介紹一下HTML5 地理位置定位的基本原理及各個瀏覽器的數據精度情況。 在訪問位置信息前&a…

2016騰訊安全挑戰賽第一輪-PC游戲方向

0x00 查殼 無殼的VC程序 0x01 測試 沒有消息彈窗&#xff0c;嘗試對函數下斷點。 OD載入后&#xff0c;CtrlN查找函數&#xff0c;找到GetDlgItem 程序運行起來&#xff0c;等輸入完后點擊確定后程序斷下。一路F8就來到這里 00401EED . E8 6A5B0000 call Tenc…

49-今日交易總結.(2015.1.13)

49-今日交易總結今天交易情況不好&#xff0c;主要犯了虧損時還連續加倉的錯誤。作為一個交易者&#xff0c;虧損時&#xff0c;繼續加倉&#xff0c;認為市場會向交易的方向變化&#xff0c;一次性把虧損的全部撈回來&#xff0c;還能賺一筆。這是一種賭徒心理。永遠不要再虧損…

電商導購過冬:蘑菇街醞釀出售 美麗說轉型時尚

一度紅火的第三方導購網站正因為阿里巴巴過山車式的態度而呈現出急劇下滑的軌跡。 2011年&#xff0c;以美麗說、蘑菇街為代表的導購網站蜂擁而起。彼時&#xff0c;兩者還能頻繁出現在阿里巴巴的官方活動中。然而&#xff0c;2012年5月&#xff0c;阿里巴巴集團董事局主席馬云…

JavascriptDOM(三)

簡介 今天學習第二天的知識,js和BOM對象,再接再厲,fighting~學習原則 腳踏實地的走好每一步,要想學好高級部分,基礎知識必須扎實呀 掌握基本語法,完成小案例,寫博客作總結,基本就是這個節奏,下面我們一起快速入門吧JavaScript快速入門 1. js簡介 1.js基于對象和事件驅動的腳本語…

看雪 2016CrackMe 攻防大賽 - 1-Crack_Me-涼颼颼

環境&#xff1a; Windows xp 工具&#xff1a; IDA EXEINFOPE OD 0x00 查殼 EXEINFOPE查殼&#xff0c; 無殼 0x01 分析 if ( (unsigned __int16)wParam 0x40B ) // 成功{*(_OWORD *)v22 xmmword_41DB98;v25 0;v23 xmmword_41DBA8;v24 xmmword_41DBB8;memset_4039D0…

JS 或css教程 識別 IE版本的幾種方法

今天收藏了這幾種關于識別ie版本的幾種代碼&#xff0c;有需要的朋友參考一下&#xff1a;var isIE!!window.ActiveXObject;var isIE6isIE&&!window.XMLHttpRequest;var isIE8isIE&&!!document.documentMode;var isIE7isIE&&!isIE6&&!isIE8;if…

使用CSDN-markdown編輯器

這里寫自定義目錄標題歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants創建一個自定義列表如何創建一個注…

C++ vector類詳解

轉自http://blog.csdn.net/whz_zb/article/details/6827999 vector簡介 vector是STL中最常見的容器&#xff0c;它是一種順序容器&#xff0c;支持隨機訪問。vector是一塊連續分配的內存&#xff0c;從數據安排的角度來講&#xff0c;和數組極其相似&#xff0c;不同的地方就是…

ViewPager的使用方法和實現過程

看圖先&#xff1a; 頁面中填充內容是隨機關鍵詞飛入和飛出動畫效果&#xff0c;隨后會更新&#xff0c;現在請先無視吧 首先是 導入jar包 下載地址&#xff1a; android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopyprint?<android.support.v4.vi…

如何通過瀏覽器在所有響應內容中查找文本

使用瀏覽器的開發者工具查找響應文件的內容 ** Chrome ** 版本&#xff1a; 快捷鍵&#xff1a;CtrlShiftF 可以看到已經查找出來了 ** firefox ** 版本

【Leetcode】【Easy】Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 解題&#xff1a; 本題為典型的KMP算法考察題&#xff0c;KMP算法描述為&#xff1a; 設主串S&#xff0c;匹配串P&#xff0c;i為S的索引下…

Android Animations動畫使用詳解

一、動畫類型 Android的animation由四種類型組成&#xff1a;alpha、scale、translate、rotate XML配置文件中 alpha漸變透明度動畫效果scale漸變尺寸伸縮動畫效果translate畫面轉換位置移動動畫效果rotate畫面轉移旋轉動畫效果Java Code代碼中 AlphaAnimation漸變透明度動畫效…

Jenkins入門指南

新手學習使用Jenkins 安裝好Jenkins后如何運行腳本 1.新建item 2.輸入任務名稱&#xff0c;選擇項目類型&#xff0c;點擊確定 3.填個描述就好了&#xff0c;新手學jenkins&#xff0c;其他都不看&#xff0c;跑起來再說 4.點這個高級&#xff0c;選擇你要運行的腳本所在…

Sublime Text 3 史上最性感的編輯器

↑ ↑ ↑ ↑ ↑ 請看文件夾 ↑ ↑ ↑ ↑ ↑ 下載 / 安裝 windows / MAC OS 官網下載&#xff0c;雙擊安裝&#xff0c;這個都會吧&#xff5e; linux linux下安裝&#xff0c;一種辦法是從官網下載 tar.bz &#xff0c;手動安裝。 這里介紹用 apt-get 自己主動安裝方法&#xf…

[轉]怎么查看和修改 MySQL 的最大連接數?

使用 MySQL 數據庫的站點&#xff0c;當訪問連接數過多時&#xff0c;就會出現 "Too many connections" 的錯誤。出現這種錯誤有兩種情況&#xff0c;一種是網站訪問量實在太大&#xff0c;服務器已經負擔不起&#xff0c;此時就應該考慮負載均衡或者其它減少服務器壓…