首页 > 代码库 > ISCC2014--basic+web+misc

ISCC2014--basic+web+misc

之前也没做过这一部分的题,但觉得这些题挺有意思的,比赛时间又长,就边学边做,也学到不少东西。

 

Basic

兵者诡道

进入关卡后

一番胡乱猜测后就没着了,大牛提示用GET,但是web小白没玩过抓包啊,学习一番,用WinsockExpert得到了Key:Welcome-to-ISCC

 

 

知己知彼

只有两种字符,首先就猜测是摩尔密码,翻译为7个字符“mwggerw”,提交不对,试试移位密码,得到“isccans”,OK!

 

正则指令

 

又是完全不会的东西,不过上课无聊,就百度了一下,看了看教程,哈哈,就得到了一个网址www.[xyz]outu[bc][de].com/watch?v=5x1vNTjbwcs&list=PL3ZQ5CpNulQm1cXMJ5M6tX3O5vyXnCYFd

脑补了一下

www.youtube.com/watch?v=5x1vNTjbwcs&list=PL3ZQ5CpNulQm1cXMJ5M6tX3O5vyXnCYFd

直接打开还不行,还得翻墙

 

 

指令暗战

获得机器码可以通过vcOD,但都需要删除‘\x66’,可能是调试状态下生成的多余机器码,在OD得到机器码更容易些。

 

知兵之将

IDA秒破。

 

 

 

经之五事索其情

为了做这题,又把密码学和信息安全数学基础的课本翻出来复习了一番,n=2537,p=43,q=59

e=13,辗转相除法得到d=937,win7自带的科学计算器计算得704

 

择人任势

这应该是一道逆向题,可是没有vbs逆向的经验,颇费了一番功夫。用记事本看文件为

 

dim swpu:swpu="fi dnerre xobgsmeslefi dneko xobgsmneht 41=x fitxenfi dnerof tixerre xobgsmesle1+x=xneht )))i(bdwp+i(lbt(tnI=))i(adwp+))1,i-41,rts(dim(csa(tnI fi31 ot 0=i rofneht )41=)rts(nel( fi)"" ,"" ,"码密入输请YEK看查"(xobtupni=rts0=b:0=a:0=x★"!YEK是就码密的入输你"=ko★"!误错码密"=rre)| ,13|881|202|79|43|21|991|631|76|49|53|152|701|6|42|751(tilps=bdwp)| ,54-|11-|721|83|73-|93-|88|64|22|811|25|441|54|49(tilps=adwp)|,202|77|7|732|111|5|431|151|491|671|681|86|92|352|751|611|901|441|67|65|521|45|412|45|561|741|591|79|9|13|81|211|981|031|071|44|741|371|051|23|37|16|611|68|001|642|642|61|5|921|011|581|69|851|051|631|491|921|27|501|36|32|471|48|601|57|93|22|212|371|042|12|31|152|47|402|901|801|471|322|1|302|26|3|84|691|251|35|22|222|361|532|751|61|31|36|312|832|031|93|91|122|732|401|802|391|54|581|201|12|02|06|4|111|381|98|141|812|27|151|86|911|052|4|78|09|702|74|591|761|14|932|94|67|731|59|651|312|142|291|5|09|751|87|911|89|55|12|03|37|771|69|65|141|38|59|33|942|981|052|191|561|332|81|22|75|101|641|781|442|08|52|921|19|722|12|631|931|721|361|831|071|531|641|13|612|151|46|35|861|591|37|52|11|942|96|271|72|691|142|981|87|032|341|941|332|461|89|83|202|081|431|621|602|43|431|501|821|151|421|28|902|932|251|422|832|042|58|722|451|341|881|811|331|35|131|231|141|291|222|6|732|89|28|371|481|121|032|502|73|5|521|681|941|711|65(tilps=lbtx,i,rts,rre,dwp,lbt mid":execute(replace(replace(strreverse(swpu), Chr(-23646), Chr(34)), "", vbCrLf))

 

还都是反向的,将最后的“execute(replace(replace(strreverse(swpu), Chr(-23646), Chr(34)), "", vbCrLf)) ”改为“call SaveData(replace(replace(strreverse(swpu), Chr(-23646), Chr(34)), "", vbCrLf))

function SaveData(str)

Dim fso, f1

Set fso = CreateObject("Scripting.FileSystemObject")

Set f1 = fso.CreateTextFile("D:1.txt", True)

f1.write(str)

end function

会将代码写入D盘的1.txt中,如下

 

dim tbl,pwd,err,str,i,x

tbl=split("56|117|149|186|125|5|37|205|230|121|184|173|82|98|237|6|222|192|141|132|131|53|133|118|188|143|154|227|85|240|238|224|152|239|209|82|124|151|128|105|134|34|206|126|134|180|202|38|98|164|233|149|143|230|78|189|241|196|27|172|69|249|11|25|73|195|168|53|64|151|216|31|146|135|170|138|163|127|139|136|21|227|91|129|25|80|244|187|146|101|57|22|18|233|165|191|250|189|249|33|95|83|141|56|96|177|73|30|21|55|98|119|78|157|90|5|192|241|213|156|95|137|76|49|239|41|167|195|47|207|90|87|4|250|119|68|151|72|218|141|89|183|111|4|60|20|21|102|185|45|193|208|104|237|221|19|39|130|238|213|63|13|16|157|235|163|222|22|53|152|196|48|3|62|203|1|223|174|108|109|204|74|251|13|21|240|173|212|22|39|75|106|84|174|23|63|105|72|129|194|136|150|158|96|185|110|129|5|16|246|246|100|86|116|61|73|32|150|173|147|44|170|130|189|112|18|31|9|97|195|147|165|54|214|54|125|56|76|144|109|116|157|253|29|68|186|176|194|151|134|5|111|237|7|77|202","|")

pwda=split("94|45|144|52|118|22|46|88|-39|-37|38|127|-11|-45", "|")

pwdb=split("157|24|6|107|251|35|94|67|136|199|12|34|97|202|188|31", "|")

err="密码错误!"

ok="你输入的密码就是KEY"

x=0:a=0:b=0

str=inputbox("查看KEY请输入密码", "", "")

if (len(str)=14) then

for i=0 to 13

if Int(asc(mid(str,14-i,1))+pwda(i))=Int(tbl(i+pwdb(i))) then

x=x+1

else

msgbox err

exit for

end if

next

if x=14 then

msgbox ok

end if

else

msgbox err

end if

 

python将上边的代码写出来运行

#vbs.py

tbl="56|117|149|186|125|5|37|205|230|121|184|173|82|98|237|6|222|192|141|132|131|53|133|118|188|143|154|227|85|240|238|224|152|239|209|82|124|151|128|105|134|34|206|126|134|180|202|38|98|164|233|149|143|230|78|189|241|196|27|172|69|249|11|25|73|195|168|53|64|151|216|31|146|135|170|138|163|127|139|136|21|227|91|129|25|80|244|187|146|101|57|22|18|233|165|191|250|189|249|33|95|83|141|56|96|177|73|30|21|55|98|119|78|157|90|5|192|241|213|156|95|137|76|49|239|41|167|195|47|207|90|87|4|250|119|68|151|72|218|141|89|183|111|4|60|20|21|102|185|45|193|208|104|237|221|19|39|130|238|213|63|13|16|157|235|163|222|22|53|152|196|48|3|62|203|1|223|174|108|109|204|74|251|13|21|240|173|212|22|39|75|106|84|174|23|63|105|72|129|194|136|150|158|96|185|110|129|5|16|246|246|100|86|116|61|73|32|150|173|147|44|170|130|189|112|18|31|9|97|195|147|165|54|214|54|125|56|76|144|109|116|157|253|29|68|186|176|194|151|134|5|111|237|7|77|202"

tbl2=tbl.split(‘|‘)

 

pwda="94|45|144|52|118|22|46|88|-39|-37|38|127|-11|-45"

pwda2=pwda.split(‘|‘)

print(pwda[1])

 

pwdb="157|24|6|107|251|35|94|67|136|199|12|34|97|202|188|31"

pwdb2=pwdb.split(‘|‘)

 

for i in range(0 ,14):

   x=int(tbl2[i+int(pwdb2[i])])

   y=int(pwda2[i])

print(chr(x-y)

 

得到key : vB5_5cR1pT.Vb$

 

庙算多寡,胜负定矣

下载后发现,这又是一个逆向题,happy!

IDA很快就分析清题意,将一txt文件里的内容按照某种规则变换,然后重新写入该文件中。

该变换规则如下:

0040136D |.  E8 9E060000   |call <jmp.&msvcrt.fgetc>                ; \fgetc

00401372 |.  8845 EF       |mov byte ptr ss:[ebp-0x11],al

00401375 |.  807D EF FF    |cmp byte ptr ss:[ebp-0x11],0xFF         ;  -1

00401379 |.^ 74 D9         |je X加密程序.00401354

0040137B |.  807D EF 00    |cmp byte ptr ss:[ebp-0x11],0x0          ;  0

0040137F |.^ 74 D3         |je X加密程序.00401354

00401381 |.  807D EF 2F    |cmp byte ptr ss:[ebp-0x11],0x2F

00401385 |.  7E 0E         |jle X加密程序.00401395

00401387 |.  807D EF 60    |cmp byte ptr ss:[ebp-0x11],0x60

0040138B |.  7F 08         |jg X加密程序.00401395

0040138D |.  8D45 EF       |lea eax,dword ptr ss:[ebp-0x11]

00401390 |.  8000 35       |add byte ptr ds:[eax],0x35      ;  2f-0x60之间的加0x35

00401393 |.  EB 6F         |jmp X加密程序.00401404

00401395 |>  807D EF 2E    |cmp byte ptr ss:[ebp-0x11],0x2E

00401399 |.  7F 35         |jg X加密程序.004013D0           小写字母跳

0040139B |.  0FB64D EF     |movzx ecx,byte ptr ss:[ebp-0x11]

0040139F |.  66:0FBEC1     |movsx ax,cl

004013A3 |.  6BC0 BB       |imul eax,eax,-0x45

004013A6 |.  0FB7C0        |movzx eax,ax

004013A9 |.  C1E8 08       |shr eax,0x8

004013AC |.  00C8          |add al,cl

004013AE |.  88C2          |mov dl,al

004013B0 |.  C0FA 03       |sar dl,0x3

004013B3 |.  88C8          |mov al,cl

004013B5 |.  C0F8 07       |sar al,0x7

004013B8 |.  28C2          |sub dl,al

004013BA |.  88D0          |mov al,dl

004013BC |.  C0E0 02       |shl al,0x2

004013BF |.  00D0          |add al,dl

004013C1 |.  00C0          |add al,al

004013C3 |.  00D0          |add al,dl

004013C5 |.  88CA          |mov dl,cl

004013C7 |.  28C2          |sub dl,al

004013C9 |.  8D45 EF       |lea eax,dword ptr ss:[ebp-0x11]

004013CC |.  0010          |add byte ptr ds:[eax],dl

004013CE |.  EB 34         |jmp X加密程序.00401404

004013D0 |>  0FB64D EF     |movzx ecx,byte ptr ss:[ebp-0x11]  ;  对小写字符处理

004013D4 |.  66:0FBEC1     |movsx ax,cl

004013D8 |.  6BC0 87       |imul eax,eax,-0x79

004013DB |.  0FB7C0        |movzx eax,ax

004013DE |.  C1E8 08       |shr eax,0x8

004013E1  |.  00C8          |add al,cl

004013E3 |.  88C2          |mov dl,al

004013E5 |.  C0FA 05       |sar dl,0x5

004013E8 |.  88C8          |mov al,cl

004013EA |.  C0F8 07       |sar al,0x7

004013ED |.  28C2          |sub dl,al

004013EF |.  88D0          |mov al,dl

004013F1 |.  C0E0 04       |shl al,0x4

004013F4 |.  28D0          |sub al,dl

004013F6 |.  C0E0 02       |shl al,0x2

004013F9 |.  00D0          |add al,dl

004013FB |.  88CA          |mov dl,cl

004013FD |.  28C2          |sub dl,al

004013FF |.  8D45 EF       |lea eax,dword ptr ss:[ebp-0x11]

00401402 |.  2810          |sub byte ptr ds:[eax],dl

 

还是有一点麻烦的,于是我用pythonascii码都打印出来

#py

for i in range(1,127):

    str = str+chr(i)

print(str)

 

!"#$%&‘()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]

^_`abcdefghijklmnopqrstuvwxyz{|}~

 

对其进行加密,得

!#%‘)+-/135,.0 efghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂?

========================zzzzz

 

然后我将密文”+%=keky+%=jjnx”与原ascii字符串一一对应着找到了

“&#u606D&#u559C”,只是那个“=”对应多个字符,当我试到x时才正确

&#x606D&#x559C

 

 

Web

国君之争

 

虽然这是web100,但这明显是一道linux逆向题,哈哈。

程序一开始让输入序列号,然后拼接成http://www.ty-ing.org/script/1/cat.php?ty=序列号。。。

然后访问这个网址,输入错误返回“注册码错误”。

IDA中发现了这个函数echo(),在整个程序中都没有调用。

密码由这个函数计算出,就在原程序的一处函数调用做了一下修改,将CALL的地址改为了echo()函数的地址,在Linux中运行如下图,得到flag.

 

 

 

霸业蓝图

进入关卡后如图

这是让上传个jpeg图片,靠高手给的思路,考察的是xss漏洞,于是用工具修改了图片作者

提交,ok!

 

 

 

MISC

广纳谏言

此题为gif修复,百度一下gif文件格式,然后对该图片进行修复

在文件结尾去除“~~~What a pity,the flag is not here”删除,然后把开头的gif标志补全,即”GIF89a”,然后得打完整的gif图片。

Y2F0Y2hfdGhlX2R5bmFtaWNfZmxhZ19pc19xdWl0ZV9zaW1wbGU=

Base64解码后为”catch_the_dynamic_flag_is_quite_simple”

 

穆公亡马

大牛给的思路,就看icmp包,就那几个包,果然很快。

 

 

 

秦国未来

 

下载文件后发现这个elf文件只能在手机上跑,用IDA分析了下主要算法

                 LDR     R3, [R11,#var_8]

.text:00008284                 MOV     R2, R3,LSL#2

.text:00008288                 LDR     R3, [R11,#var_18]

.text:0000828C                 ADD     R3, R2, R3

.text:00008290                 LDR     R1, [R11,#var_8]

.text:00008294                 LDR     R2, [R11,#var_10]

.text:00008298                 ADD     R2, R1, R2

.text:0000829C                 LDRB    R2, [R2]

.text:000082A0                 MOV     R1, R2

.text:000082A4                 LDR     R2, [R11,#var_8]

.text:000082A8                 SUB     R0, R2, #1

.text:000082AC                 LDR     R2, [R11,#var_10]

.text:000082B0                 ADD     R2, R0, R2

.text:000082B4                 LDRB    R2, [R2]

.text:000082B8                 ADD     R2, R1, R2

.text:000082BC                 STR     R2, [R3]

.text:000082C0                 LDR     R3, [R11,#var_8]

.text:000082C4                 ADD     R3, R3, #1

.text:000082C8                 STR     R3, [R11,#var_8]

.text:000082CC

.text:000082CC loc_82CC                                ; CODE XREF: sub_821C+60j

.text:000082CC                 LDR     R2, [R11,#var_8]

.text:000082D0                 LDR     R3, [R11,#var_14]

.text:000082D4                 CMP     R2, R3

.text:000082D8                 BLT     loc_8280

.text:000082DC                 MOV     R3, #1

.text:000082E0

.text:000082E0 loc_82E0                                ; CODE XREF: sub_821C+30j

.text:000082E0                 MOV     R0, R3

.text:000082E4                 MOV     SP, R11

.text:000082E8                 LDR     R11, [SP+0x1C+var_1C],#4

.text:000082EC                 BX      LR

 

有通过几次输入明文与密文的比对发现,密文第一个字符明文第一个字符的ascii码,密文第二字符是明文前两字符ascii码之和,密文第三字符是明文第二、第三字符之和……..以此类推。

 

于是得到:Flag{Flag_for_ISCC2014}

Flag_for_ISCC2014就是最终的Flag