網(wǎng)鼎杯blend wp

記錄一次菜的摳腳的學習過程

題目是一個bin文件,首先通過file命令看一下文件格式

$ file blend/main.bin
blend/main.bin: DOS/MBR boot sector

拖到IDA Pro 可以識別其中的匯編梦鉴,但需要快捷鍵p創(chuàng)建函數(shù)才可以使用空格揭保,靜態(tài)可能看不太明白,因為它和我們常見的程序不太一樣存筏,函數(shù)調(diào)用都是通過軟件斷點形式實現(xiàn)味榛,動態(tài)調(diào)一下就會明白程序流程。

程序的調(diào)試可以使用qemu

$ qemu-system-i386 -s -drive format=raw,file=./main.bin

程序就可以執(zhí)行起來藕溅,可以通過gdb進行調(diào)試继榆,程序默認加載地址為0x7c00,所以下端點的時候地址為偏移地址+0x7c00集币。由于是16為匯編所以gdb的插件可能會有bug翠忠,只是pwndbg是這樣,建議使用原生gdb,gdb調(diào)試流程如下

$ gdb
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set architecture i8086
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default i8086 settings.

The target architecture is assumed to be i8086
(gdb) set disassembly-flavor intel
(gdb) target remote:1234

注意要執(zhí)行這句set architecture i8086,否則匯編也會出錯跨细。其他就沒什么區(qū)別了冀惭,正常調(diào)試即可。通過調(diào)試可知其實程序一直會在一個循環(huán)里運行散休,默認走綠色分支戚丸。



當輸入夠20個字符會進入紅色的分支,輸入保存在0x1234處猴鲫,這一分支也就是對輸入flag進行驗證的地方谣殊,也是需要我們重點關注的部分。程序首先會對前4字節(jié)進行判斷宜狐,靜態(tài)可知前4字節(jié)為flag蛇捌。緊接著對0x1238處的輸入進行驗證,匯編為SSE浮點匯編俭驮,沒接觸過的可能有些難度春贸,多用Google搜索,看幾個例子相信你對每句匯編就理解了萍恕。程序首先會對你的輸入進行一個亂序處理,實現(xiàn)這一操作的是pshufd指令允粤,如果可以動態(tài)調(diào)試其實可以不用理細節(jié)翼岁,可以直接看執(zhí)行完的xmm0寄存器琅坡。緊接著和內(nèi)存中的數(shù)進行相與

0xffffffffffffff00  0xffffffffffffff00
0xffffffffffff00ff  0xffffffffffff00ff
0xffffffffff00ffff  0xffffffffff00ffff
0xffffffff00ffffff  0xffffffff00ffffff
0xffffff00ffffffff  0xffffff00ffffffff
0xffff00ffffffffff  0xffff00ffffffffff
0xff00ffffffffffff  0xff00ffffffffffff
0x00ffffffffffffff  0x00ffffffffffffff

寫出來應該可以看明白相與之后的結果了吧飘庄。相與之后與xmm5做一個絕對差求和的運算购撼,將最終的結果與程序的數(shù)據(jù)進行比較

0x03110304
0x02d902cd
0x02d402db
0x02c402e2
0x02ce02e2
0x02d802ed
0x02dc02e8
0x02dd02f6

注意這三句匯編其實它的效果是進行了一次高低位交換


image.png

如果相等繼續(xù)下次循環(huán)迂求,一共要循環(huán)8次,每次循環(huán)xmm0不變揩局,變得只有xmm5凌盯,xmm5其實就是上一次循環(huán)的結果。所以整個算法邏輯就是這樣驰怎,如果可以動態(tài)調(diào)試是很好理解的县忌,最初沒找到合適的調(diào)試方法,靜態(tài)看有點吃力症杏。

要解整個題很難逆推回去,因為算法不是一個可逆算法穴豫。所以自然想到暴力破解,當然暴力破解也有技巧绩郎,可以借助z3,可以提高效率肋杖。直接上最后的python腳本(python3執(zhí)行)

from z3 import *

s = Solver()
a = Int('a') 
b = Int('b') 
c = Int('c') 
d = Int('d') 
e = Int('e') 
f = Int('f') 
g = Int('g') 
h = Int('h') 
i = Int('i') 
j = Int('j') 
k = Int('k') 
l = Int('l') 
m = Int('m') 
n = Int('n') 
o = Int('o') 
p = Int('p')

s.add(a < 127)
s.add(b < 127)
s.add(c < 127)
s.add(d < 127)
s.add(e < 127)
s.add(f < 127)
s.add(g < 127)
s.add(h < 127)
s.add(i < 127)
s.add(j < 127)
s.add(k < 127)
s.add(l < 127)
s.add(m < 127)
s.add(n < 127)
s.add(o < 127)
s.add(p < 127)

s.add(a > 32)
s.add(b > 32)
s.add(c > 32)
s.add(d > 32)
s.add(e > 32)
s.add(f > 32)
s.add(g > 32)
s.add(h > 32)
s.add(i > 32)
s.add(j > 32)
s.add(k > 32)
s.add(l > 32)
s.add(m > 32)
s.add(n > 32)
s.add(o > 32)
s.add(p > 32)

def abs(x):
    return If(x >= 0,x,-x)

s.add(abs(d-0x22)+abs(c-0xf)+abs(b-0x2)+abs(a-0xc8)+abs(h-0x83)+abs(g-0xfb)+abs(f-0xe0)+abs(0-0x83) ==0x304)
s.add(abs(p-0xc0)+abs(o-0x20)+abs(n-0xf)+abs(m-0x10)+abs(l-0xcd)+abs(k-0x00)+abs(j-0x13)+abs(0-0xb8) ==0x311)

s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(0-0x3)+abs(e-0x4) ==0x2cd)
s.add(abs(p-0x0)+abs(o-0x0)+abs(n-0x00)+abs(m-0x0)+abs(l-0x0)+abs(k-0x00)+abs(0-0x3)+abs(i-0x11) ==0x2d9)

s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(0-0x0)+abs(f-0x2)+abs(e-0xcd) ==0x2db)
s.add(abs(p-0x0)+abs(o-0x0)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(0-0x00)+abs(j-0x2)+abs(i-0xd9) ==0x2d4)

s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(0-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xdb) ==0x2e2)
s.add(abs(p-0x0)+abs(o-0x0)+abs(n-0x0)+abs(m-0x0)+abs(0-0x0)+abs(k-0x00)+abs(j-0x2)+abs(i-0xd4) ==0x2c4)

s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(0-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xe2) ==0x2e2)
s.add(abs(p-0x0)+abs(o-0x0)+abs(n-0x0)+abs(0-0x0)+abs(l-0x0)+abs(k-0x00)+abs(j-0x2)+abs(i-0xc4) ==0x2ce)

s.add(abs(d-0x0)+abs(c-0x0)+abs(0-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xe2) ==0x2ed)
s.add(abs(p-0x0)+abs(o-0x0)+abs(0-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x00)+abs(j-0x2)+abs(i-0xce) ==0x2d8)

s.add(abs(d-0x0)+abs(0-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xed) ==0x2e8)
s.add(abs(p-0x0)+abs(0-0x0)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x00)+abs(j-0x2)+abs(i-0xd8) ==0x2dc)

s.add(abs(0-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xe8) ==0x2f6)
s.add(abs(0-0x0)+abs(o-0x0)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x00)+abs(j-0x2)+abs(i-0xdc) ==0x2dd)
if s.check() == sat:
    model = s.model()
    answer = [model[a],model[b],model[c],model[d],model[e],model[f],model[g],model[h], model[i],model[j],model[k],model[l],model[m],model[n],model[o],model[p],0]
    flag = ""
    answer_str = ""
    for i in range(len(answer)-1):
        answer_str += chr(int(str(answer[i]))) 
    print(answer_str)
else:
    print('unsat')
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末状植,一起剝皮案震驚了整個濱河市浊竟,隨后出現(xiàn)的幾起案子津畸,更是在濱河造成了極大的恐慌振定,老刑警劉巖肉拓,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暖途,居然都是意外死亡,警方通過查閱死者的電腦和手機驻售,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺栗,“玉大人,你說我怎么就攤上這事迟几。” “怎么了类腮?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長存哲。 經(jīng)常有香客問我,道長祟偷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任修肠,我火速辦了婚禮,結果婚禮上嵌施,老公的妹妹穿的比我還像新娘。我一直安慰自己吗伤,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布足淆。 她就那樣靜靜地躺著礁阁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姥闭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天棚品,我揣著相機與錄音,去河邊找鬼铜跑。 笑死,一個胖子當著我的面吹牛疼进,可吹牛的內(nèi)容都是我干的薪缆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼拣帽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了减拭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤修陡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后可霎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡拾因,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年旷余,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片正卧。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡炉旷,死狀恐怖惠遏,靈堂內(nèi)的尸體忽然破棺而出骏啰,到底是詐尸還是另有隱情,我是刑警寧澤判耕,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布壁熄,位于F島的核電站,受9級特大地震影響草丧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烛亦,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一煤禽、第九天 我趴在偏房一處隱蔽的房頂上張望岖赋。 院中可真熱鬧檬果,春花似錦唐断、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扁藕,卻和暖如春疚脐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棍弄。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痕支,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓另绩,卻偏偏與公主長得像花嘶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子车海,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理侍芝,服務發(fā)現(xiàn)闸度,斷路器蚜印,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 1、文件和目錄: # cd /home 進入 '/home' 目錄 # cd .. ...
    XDgbh閱讀 2,010評論 0 1
  • 今天下午哟冬,我們?nèi)ド衔膶W戲劇課忆绰。老師讓我們?nèi)艘唤M表演《我是霸王龍》。我扮演小翼龍翰灾,故事是這樣的:在很久很久以前...
    露露09閱讀 430評論 0 0
  • 大概六十天不止吧 回家過著無聲的生活 不想說話也懶得對某人說 房子還是老樣子 外面大雨 里面中雨 什么都沒改變 我...
    驛動的心_974d閱讀 171評論 0 2