1. 程式人生 > >看雪CTF2017第一題簡單分析

看雪CTF2017第一題簡單分析

本題比較簡單,無殼、無VM、無密碼學,適合入門練習

中午一覺睡醒,逛逛論壇才發現有ctf比賽,就隨便看了一下

動態調一下就好了,發現確實是多解,下面我就簡單說一下自己的分析流程吧

0x00 定位關鍵跳轉

首先拿到CrackMe,就直接隨便輸入了一串字串“111111”


看到是有彈窗提示的,根據報出的“error字串就能直接定位到關鍵跳轉位置了。

下面就通過字串搜尋,找到“error位置,發現是在004012c6位置跳轉的:


0x01  判斷輸入值的長度

那麼我們繼續往上分析,可以檢視到我們輸入後傳入值的部分,並通過strlen來獲取其長度是否為4,不為4則直接跳轉到004012CF


現在可以確定key

的長度為4

0x02 驗證key2位的值

這裡驗證key的值是否都為字串“0”,如果4位的key又一個為“0”,則直接跳轉到“error”彈出框

然後接著就是繼續驗證key2位字串的值,即給出字串的前2位為“15”

如果key的前2位的值不為“15”,則直接跳轉到“error”彈出框
00401229   . /0F85 A0000000 jnz WannaLOL.004012CF
0040122F   . |6A 30         push 0x30
00401231   . |59            pop ecx
00401232   . |384D E4       cmp byte ptr ss:[ebp-0x1C],cl //判斷key第1個字元是否為“0”
00401235   . |0F84 94000000 je WannaLOL.004012CF
0040123B   . |384D E5       cmp byte ptr ss:[ebp-0x1B],cl //判斷key第2個字元是否為“0”
0040123E   . |0F84 8B000000 je WannaLOL.004012CF
00401244   . |384D E6       cmp byte ptr ss:[ebp-0x1A],cl //判斷key第3個字元是否為“0”
00401247   . |0F84 82000000 je WannaLOL.004012CF
0040124D   . |384D E7       cmp byte ptr ss:[ebp-0x19],cl //判斷key第4個字元是否為“0”
00401250   . |74 7D         je short WannaLOL.004012CF
00401252   . |807D E4 31    cmp byte ptr ss:[ebp-0x1C],0x31 //判斷key第1個字元是否等於“1”,不等於則直接跳轉彈出“error”
00401256   . |75 77         jnz short WannaLOL.004012CF
00401258   . |807D E5 35    cmp byte ptr ss:[ebp-0x1B],0x35 //判斷key第2個字元是否等於“5”,不等於則直接跳轉彈出“error”
0040125C   . |75 71         jnz short WannaLOL.004012CF
0040125E   . |74 03         je short WannaLOL.00401263
00401260   . |75 01         jnz short WannaLOL.00401263


這裡得到前2key的值為“15”

0x03 分析演算法

這裡運作流程:

1、取key中第3位的十六進位制值,然後減去0x30,這裡則假定值為a

2、取key中第1位值為“1”的十六進位制值即0x31,然後減去0x300x31-0x30 =1

3、取key中第2位值為“5”的十六進位制值即0x35,然後減去0x300x31-0x30 =5 ,接著就是1除以5得出浮點數0.2

4、取key中第4位的十六進位制值,然後減去0x30,這裡則假定值為b

5、接著就是(a-0.2*b乘以16得出的結果為c

6、判斷c384是否相等,相等則Registration successful !,不相同則“error”

公式:(a-0.2)*b*16 = 384
求解ab
0040126B   .  0FBE45 E6     movsx eax,byte ptr ss:[ebp-0x1A] //取輸入key的第3位值
0040126F   .  2BC1          sub eax,ecx                      //減去0x30,得到a
00401271   .  8945 FC       mov dword ptr ss:[ebp-0x4],eax   //把得到的值儲存在[ebp-0x4]中
00401274   .  0FBE45 E4     movsx eax,byte ptr ss:[ebp-0x1C] //取輸入key的第1位值“1”
00401278   .  DB45 FC       fild dword ptr ss:[ebp-0x4]      //把[ebp-0x4]中儲存的值壓入到ST(0)中
0040127B   .  2BC1          sub eax,ecx                      //0x31減去0x30,則為1
0040127D   .  8945 FC       mov dword ptr ss:[ebp-0x4],eax   //把得到的值1儲存在[ebp-0x4]中
00401280   .  0FBE45 E5     movsx eax,byte ptr ss:[ebp-0x1B] //取輸入key的第2位值“5”
00401284   .  DB45 FC       fild dword ptr ss:[ebp-0x4]      //把[ebp-0x4]中儲存的值1壓入到ST(0)中
00401287   .  2BC1          sub eax,ecx                      //0x35減去0x30,則為5
00401289   .  8945 FC       mov dword ptr ss:[ebp-0x4],eax   //把得到的值5儲存在[ebp-0x4]中
0040128C   .  DA75 FC       fidiv dword ptr ss:[ebp-0x4]     //st(0)Z中的值1除以[ebp-0x4]中的值5,得到0.2儲存到st(0)中
0040128F   .  0FBE45 E7     movsx eax,byte ptr ss:[ebp-0x19] //取輸入key的第4位值
00401293   .  2BC1          sub eax,ecx                      //減去0x30,得到b
00401295   .  8945 FC       mov dword ptr ss:[ebp-0x4],eax   //把得到的值b儲存在[ebp-0x4]中
00401298   .  DEE9          fsubp st(1),st                   //st(1)-st並儲存在st(0)中,即(a-0.2)
0040129A   .  DA4D FC       fimul dword ptr ss:[ebp-0x4]     //st(0)乘以[ebp-0x4] 中儲存的值b,結果儲存在st(0)中
0040129D   .  D80D 1C714000 fmul dword ptr ds:[0x40711C]     //資料段ds:[0x40711C]值為16,這裡則是st(0)乘以16
004012A3   .  D95D FC       fstp dword ptr ss:[ebp-0x4]      //把上面得到值儲存在[ebp-0x4]中
004012A6   .  74 03         je short WannaLOL.004012AB
004012A8   .  75 01         jnz short WannaLOL.004012AB
004012AA      E8            db E8
004012AB   >  66:B8 0800    mov ax,0x8
004012AF   .  66:35 0700    xor ax,0x7
004012B3   .  D945 FC       fld dword ptr ss:[ebp-0x4]       //取出[ebp-0x4]中儲存的值
004012B6   .  D81D 18714000 fcomp dword ptr ds:[0x407118]    //得出的值與384比較是否相等


0x04 編寫演算法指令碼

這裡根據上面分析,寫了個簡單的指令碼,跑出了2個結果 “151N”"1555"
def test(Max):
	for i in range(Max):
		for j in range(Max):
			if((i - 0.2)*j ==24.0)
				b = chr(int(str(hex(i+48)),16))
				c = chr(int(str(hex(j+48)),16))
				print "key--->15%s"%b+"%s"%c
if __name__ == '__main__':
	test(255)

跑出來的結果:


相關推薦

CTF2017第一簡單分析

本題比較簡單,無殼、無VM、無密碼學,適合入門練習 中午一覺睡醒,逛逛論壇才發現有ctf比賽,就隨便看了一下 動態調一下就好了,發現確實是多解,下面我就簡單說一下自己的分析流程吧 0x00 定位關鍵跳轉 首先拿到CrackMe,就直接隨便輸入了一串字串“111111”

FCC初級演算法簡單分析並附上程式碼

1.Reverse a String 翻轉字串 要求:先把字串轉化成陣列,再借助陣列的reverse方法翻轉陣列順序,最後把陣列轉化成字串。你的結果必須得是一個字串。 這是一些對你有幫助的資源: Global String Object String.spl

Leetcode第一(簡單系列)

第一題:給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例:給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9

ctf2017 |WP Ericky.apk

前言 看雪的ctf還是很有水平的,我這菜雞表示只能看看 分析 用jeb開啟,發現做了很噁心的混淆,汗顏。使用n鍵對變數重新命名。 java層的分析我就不寫了,這題的考點在於so層演算法的分析以及指令的混淆。 ps:我幾乎用了一天的時間,去看

CTF 2016_第四分析

protect follow text cef 數據 crack update ase 時也 結合前輩們的分析,自己再作一個分析,算是當做學習筆記吧! OD 下GetDlgItemTextA 這個斷點 0040148C |. 83F8 1E cmp eax

CTF 2016_第五分析

一個 div git 範圍 代碼 進行 長度 每一個 語言 這個題是一道窮舉題,考察的應該是編程能力吧! 本題算法不是很難,也是挺好分析的。 這個程序可以下 GetDlgItem 這個api可以定位到關鍵地方。 00401183 > /8A54

.Wifi萬能鑰匙 2017CTF年中賽---第一

考察浮點數運算 1、OD載入,搜尋字串,查詢到錯誤或正確提示資訊,雙擊點進去。 找到以為的關鍵跳轉,下斷點,重新載入,輸入註冊碼,執行,竟然提示錯誤! 不死心的將關鍵跳轉NOP掉,儲存到檔案,執行, 結果依然報錯!果然爆破不行呀……那就老老實實檢視演算法吧。 2、在該段開始位置下斷點

2015阿里&移動安全挑戰賽-第一

2015阿里&看雪移動安全挑戰賽-第一題 題目傳送門:AliCrackme 網上已經有很多writeup,我也是按照烏雲上的2015移動安全挑戰賽(阿里&看雪主辦)全程回顧的基本思路來想的。但作為一個新手,就算照著教程來做也會踩到很多坑。所以

.Wifi萬能鑰匙 CTF 2017 第4分析linux double free及unlinking漏洞

我是在ubuntu16 64位除錯的 現在unlink函式加了個判斷需要繞過: 即必須保證FD->bk = P 並且 BK->fd = P` 為了繞過這個驗證,需要找到一個地址x,使*x=p, 釋放chunk前,檢查FD->bk=BK->f

CTF第八

else tar ops ini 指令 text 技術分享 __init__ str vm_context 00000000 vm_context struc ; (sizeof=0x70, mappedto_32) 00000000 r0

.TSRC 2017CTF秋季賽第三

truct item set 報錯 spring 現在 logs 封裝 檢測方法 看雪.TSRC 2017CTF秋季賽第三題 wp 這是一道很簡單的題,反調試的坑略多。這道題采用了很多常用的反調試手段,比如調用IsDebuggerPresent、進程名檢查等等。另外也有利用

【京東】2016研發工程師(第一沒做出來,動態規劃類似公共子串重點,反覆;第三沒有做出來自我檢討)

[程式設計題]年終獎 小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個6*6的棋盤上進行,上面放著36個價值不等的禮物,每個小的棋盤上面放置著一個禮物,他需要從左上角開始遊戲,每次只能向下或者向右移動一步,到達右下角停止,一路上的格子裡的禮物小東都能

倆數之和(leetcode簡單第一

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的 兩個 整數。 你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。 示例:給定 nums = [2, 7, 11, 15], target = 9 因為 nums

演算法設計與分析P8演算法實現第一

#include<stdio.h> #include<string.h> int main() { int n, t, i,temp; int count[10]; mem

360杯資訊保安技術大賽Web第一分析

原題如下,提示是 程式設計師的壞習慣 根據提示,在當前URL後加.bak,獲得原始碼 <?php error_reporting(0); function auth($password, $hidden_password){ $res=0; i

CTF 2017 第六設計思路和解題思路

這道題主要需要花時間搞清楚套路,就迎刃而解了。^_^ 1.java層稍作字串加密和類名方法名混淆處理(本來是打算java層也做點文章的@[email protected]) 解題:通過閱讀程式碼,可以知道check函式為關鍵函式,當返回為

wifi萬能鑰匙CTF年中賽 第四 writeup(2)

上一篇題解是學習的poyoten的姿勢,這個呢,是學習到了loudy大神的姿勢 首先呢:要把sys_rva和put_rva以及free_rva換成本地libc的偏移值,姿勢如圖 按照第一篇的方法,給程式碼加上gdb斷點 gdb.attach(p, 'b *0x4

2015阿里&移動安全挑戰賽-第二

2015阿里&看雪移動安全挑戰賽-第二題 題目傳送門:AliCrackme 網上已經有很多writeup,我也是按照烏雲上的2015移動安全挑戰賽(阿里&看雪主辦)全程回顧的基本思路來想的。但作為一個新手,就算照著教程來做也會踩到很多坑。所以

海量分頁的簡單分析

elk mic als emc usb won tm4 pop iap 此文僅個人理解,不到之處望指出 提出:easyui的datagrid組件有海量分頁的內容,通過查詢數據庫的所有數據在表格進行分頁瀏覽,因為數據量多,也叫海量分頁, 網

模擬(玩具謎NOIP 2016 提高組 Day 1 第一vijos2003)

順時針 std 字符 true cnblogs 中一 else point 整數和 描述 小南有一套可愛的玩具小人,它們各有不同的職業。 有一天,這些玩具小人把小南的眼鏡藏了起來。小南發現玩具小人們圍成了一個圈,它們有的面朝圈內,有的面朝圈外。如下圖: 這時sin