逆向
將exe文件放入ida之中運(yùn)行,然后使用f5將其轉(zhuǎn)換成類似c語(yǔ)言的形式,在使用R鍵將那些串轉(zhuǎn)換成字符日月,再按照strcmp指示,得出flag染乌。
將文件按照txt格式打開(kāi)山孔,可得到匯編代碼。
注釋加的可能有些錯(cuò)誤
進(jìn)行題目的時(shí)候匯編了解不多荷憋,也沒(méi)有將這些東西重新變回所執(zhí)行的操作台颠,只是簡(jiǎn)單的類似翻譯英文時(shí)直接按照字典的方法,把一個(gè)一個(gè)單詞翻譯成漢語(yǔ)勒庄。但沒(méi)有理解其中所表達(dá)的意思串前。
附注:十六進(jìn)制轉(zhuǎn)換表
那么轉(zhuǎn)換思想把其轉(zhuǎn)換成c語(yǔ)言的代碼,兩者結(jié)合去理解這些匯編語(yǔ)言实蔽。
之后荡碾,再次進(jìn)行解題
1,第一次發(fā)現(xiàn)在其中有0x1c的數(shù)局装,正好對(duì)應(yīng)input數(shù)組中所有的元素個(gè)數(shù)坛吁,說(shuō)明應(yīng)該是對(duì)數(shù)組中所有數(shù)操作。
2铐尚,之后在后方有一個(gè)jle<28的判斷說(shuō)明確實(shí)按照此操作進(jìn)行拨脉,當(dāng)>28時(shí)執(zhí)行結(jié)束
(其中 rdx——rax
edx——rcx
rcx——rdx 作為累加)
3 ,之后判斷操作是什么宣增,其中有xor玫膀,該指令是異或操作
4,因?yàn)橹荒芸炊@些爹脾,但具體如何落實(shí)到每一個(gè)數(shù)組中的元素便要繼續(xù)更細(xì)致解讀
5帖旨,結(jié)合c語(yǔ)言傳入形參數(shù)組時(shí)的操作進(jìn)行(因?yàn)椴惶靼讌R編的進(jìn)程)
6箕昭,那么按照c語(yǔ)言的形式,其中func函數(shù)傳入兩個(gè)形參input[28]解阅,另外一個(gè)為28
7落竹,第一行是進(jìn)棧
8,三四兩句便是存入兩個(gè)參數(shù)
9瓮钥,其它按照注釋進(jìn)行筋量,那么意思便是將一個(gè)數(shù)和當(dāng)前位置進(jìn)行異或運(yùn)算
10,但不明白異或運(yùn)算進(jìn)行時(shí)應(yīng)該是否轉(zhuǎn)換成二進(jìn)制在進(jìn)行
11碉熄,在判斷時(shí)桨武,我看成是把當(dāng)前元素和前面的元素進(jìn)行異或運(yùn)算,但發(fā)現(xiàn)結(jié)果實(shí)在是出乎意料
12锈津,繼續(xù)鉆空子呀酸,因?yàn)檫@是ctf題目,提交的時(shí)候我可以確定前面五個(gè)和最后一個(gè)應(yīng)該是什么琼梆,flag{}
13性誉,那么我便把這些按照表中的字符一 一對(duì)應(yīng),找到應(yīng)該是那些數(shù)字
14茎杂,找到規(guī)律错览,通過(guò)這種方式,找到func()函數(shù)是怎么進(jìn)行的
15煌往,先是用c語(yǔ)言嘗試出結(jié)果但因?yàn)閐ev編譯器上的異或運(yùn)算似乎有錯(cuò)誤倾哺,便沒(méi)有繼續(xù)進(jìn)行
16,在之后看了一點(diǎn)python
17刽脖,得到flag
下方附上這道題用上的東西:
1.movsxd 指令為擴(kuò)展至零
將32位的寄存器和內(nèi)存操作數(shù)符號(hào)擴(kuò)展到64位的寄存器
2.邏輯異或運(yùn)算指令 XOR
XOR OPRD1,OPRD2
實(shí)現(xiàn)兩個(gè)操作數(shù)按位‘異或’(異為真,相同為假)運(yùn)算,結(jié)果送至目的操作數(shù)中.
OPRD1<--OPRD1 XOR OPRD2
3.JLE
小于等于時(shí)轉(zhuǎn)移
- rdx——rax
edx——rcx
rcx——rdx 作為累加
input = [0x67,0x6e,0x62,0x63,0x7e,0x74, 0x62, 0x69, 0x6d, 0x55, 0x6a, 0x7f, 0x60, 0x51, 0x66, 0x63, 0x4e, 0x66, 0x7b,0x71, 0x4a, 0x74, 0x76, 0x6b, 0x70, 0x79, 0x66 , 0x1c]
十進(jìn)制為:input={0,103,110,98,99,126,116,98,105,109,85,106,127,96,81,102,99,78,102,123,113,74,116,118,107,112,121,102};
c語(yǔ)言解出:
include<stdio.h>
int main()
{
int i,j=1;
int a;
int input[28]={0,103,110,98,99,126,116,98,105,109,85,106,127,96,81,102,99,78,102,123,113,74,116,118,107,112,121,102};
for(i=1;i<28;i++)
{
a=input[i]^i;
printf("%c",a);
}
return 0;
}
1, qword 八個(gè)字節(jié)
2羞海,dword 四個(gè)字節(jié)
腳本跑出flag:
https://c.runoob.com/compile/6
python:
a = [0x67,0x6e,0x62,0x63,0x7e,0x74, 0x62, 0x69, 0x6d, 0x55, 0x6a, 0x7f, 0x60, 0x51, 0x66, 0x63, 0x4e, 0x66, 0x7b,0x71, 0x4a, 0x74, 0x76, 0x6b, 0x70, 0x79, 0x66 , 0x1c]
b = ""
for x in range(1,29):
b=b+chr(a[x-1] ^ x)
print b
flag{read_asm_is_the_basic}
總結(jié):
1,在關(guān)鍵位置判斷失誤曲管,看成了和前面的元素進(jìn)行異或運(yùn)算
2却邓,在用c語(yǔ)言運(yùn)行的時(shí)候,沒(méi)有發(fā)現(xiàn)錯(cuò)誤院水,英語(yǔ)不好腊徙,沒(méi)發(fā)現(xiàn)用的是八進(jìn)制
3,把所有的東西轉(zhuǎn)換成自己知道的