之前也没做过这一部分的题,但觉得这些题挺有意思的,比赛时间又长,就边学边做,也学到不少东西。
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
直接打开还不行,还得*
指令暗战
获得机器码可以通过vc或OD,但都需要删除‘\x66’,可能是调试状态下生成的多余机器码,在OD得到机器码更容易些。
知兵之将
用IDA秒破。
经之五事索其情
为了做这题,又把密码学和信息安全数学基础的课本翻出来复习了一番,n=2537,p=43,q=59
e=13,辗转相除法得到d=937,用win7自带的科学计算器计算得704
择人任势
这应该是一道逆向题,可是没有vbs逆向的经验,颇费了一番功夫。用记事本看文件为
dim swpu:swpu="fi dne★rre xobgsm★esle★fi dne★ko xobgsm★neht 41=x fi★txen★fi dne★rof tixe★rre xobgsm★esle★1+x=x★neht )))i(bdwp+i(lbt(tnI=))i(adwp+))1,i-41,rts(dim(csa(tnI fi★31 ot 0=i rof★neht )41=)rts(nel( fi★)"" ,"" ,"码密入输请YEK看查"(xobtupni=rts★0=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=lbt★x,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
还是有一点麻烦的,于是我用python将ascii码都打印出来
#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时才正确
恭喜
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。