本文最早发布在TSRC,详细地址:http://security.tencent.com/index.php/blog/msg/55
这道题目就给出了一个文件下载地址:http://41.231.53.40/for1.pcapng
文件后缀是pcapNG的,当然玩ctf的时候,看见的并不一定就是真的,我们可以通过file命令和一些hex工具来查看一下,信息如图:
通过上面信息可以确定该文件的确是pcapng格式,google了一下这个文件类型就是pcap格式的扩展,目前还只是实验阶段,可以使用wireshark打开分析。心急的朋友可能直接使用wireshark打开这个文件开始分析了,22M这得多少网络包呀。取证中经常用到一个方法就是使用strings查看文件中有什么字符串,运行结果如下图:
我们发现熟悉的flag字符串,提交,搞定了。
这一题给出了一个.c文件(下载地址:http://41.231.53.40/main.c),没有任何提示。
最初我们拿到这个文件后,编译,执行,得到一串无意义的字符串,当然这肯定不是flag。
接下来我们尝试了调换代码顺序,再编译执行,还是不对。
最后通过观察网页上面展示的代码段(这里有一个坑:工具打开.c文件会自动缩进好),我们发现缩进有问题,如图:
为了进一步确认,我们查看该文件的HEX,如图:
正常的缩进使用的空格,而有几行代码缩进使用的是\t。因此我们尝试注释掉\t缩进的代码段,再编译执行,效果如图:
提交,搞定。
题目:
http://41.231.53.40/Forensics100.zip flag format == Pwnium{md5[ip:port]} Be careful this file may harm your computer
这道题目肯定是这个文件会干什么操作。于是我们先用Total uninstall来监控注册表和C盘文件,然后运行exe文件,发现没有任何操作,那么exe肯定是进行网络操作。打开Wireshark可以看到如下的网络请求:
ip:193.95.68.245,port:81,按照题目的提示md5一下,提交就搞定了。
ps:文件是一个木马,更简洁的方法可以扔给各种在线木马检测网站试一下,根本不用自己分析。懒人必备。
这题也只给出一个rar文件,下载地址:
https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/look-closer/Misc1.rar?raw=true),没有任何提示。
下载后,我们发现无法打开,提示是错误的格式,于是Hex查看一下文件的格式,如图:
图7 Hex查看misc1.rar
文件头很明显告诉我们这个是一个jpg文件,于是修改后缀,flag就在图片中,如图:
提交,搞定。
这题同样只给出一个zip文件(下载地址:
https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/so-basic/Misc75.zip?raw=true)。
我们将下载的zip文件进行解压,里面有40个小文件,每个文件中是一个数字,给人感觉就是这个是ASCII值。
首先将所有文件中的文本合并到一个文件中:
cat ./* > misc75.txt
然后转换成对应字符串看看,得到如图的结果:
图9 unhexlify的结果
看上去很像flag,但是顺序是乱的。我们找到字符P对应的文件“cfcd208495d565ef66e7dff9f98764da”,文件名很像是MD5加密的,于是我们尝试破解一下,解密后是字符0。那么大胆猜测所有的文件名其实是0~39的MD5密文。那么我们修改一下程序:
图10 修改后的Py代码
YEAH!!搞定。
题目中给出一个字符串:
“QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=”
经验告诉我们这个是一个经过Base64编码的字符串,于是我们尝试使用Base64解码,解码后结果含有不可见字符,说明这还不是Flag。
在这里有一些不知所措,于是乎我们将前面可见部分字符在google中进行搜索了一下,发现有相关文章说这是bz2文件格式的头部,通过对比bz2文件格式的头部和尾部,我们可以确认上面的字节流的确是经过bzip2压缩后的内容,现在就就简单了,再解压缩一次:
提交,搞定了。
题目提示如下:
Crackme Fast The binary http://41.231.53.44:9393/ Send the password in less than 2 secondshttp://41.231.53.44:9393/check.php?p={p@55}
访问题目中的地址,可以得到一个文件,打开之后如图:
文件头是个LPCK,不知道啥格式,不过在之后看到了MZ头。把MZ头之前的部分统统删掉,成功得到一个exe。
要求输入Password。没有办法了,直接扔进ida….找到关键部分如下:
.text:00401363 mov [esp+5Ch+var_5C], offset aPassword ;
"Password :"
.text:0040136A call puts
.text:0040136F lea eax, [esp+5Ch+var_3E]
.text:00401373 mov [esp+5Ch+var_58], eax
.text:00401377 mov [esp+5Ch+var_5C], offset aS ; "%s"
.text:0040137E call scanf
.text:00401383 mov [esp+5Ch+var_14], 0
.text:0040138B jmp short loc_4013B1
.text:0040138D ; ---------------------------------------------------------------------------.text:0040138D
.text:0040138D loc_40138D: ; CODE XREF:
main+8F j
.text:0040138D mov eax, [esp+5Ch+var_14]
.text:00401391 mov eax, [esp+eax*4+5Ch+var_34]
.text:00401395 mov ecx, eax
.text:00401397 xor ecx, 1
.text:0040139A lea edx, [esp+5Ch+var_3E]
.text:0040139E mov eax, [esp+5Ch+var_14]
.text:004013A2 add eax, edx
.text:004013A4 mov al, [eax]
.text:004013A6 movsx eax, al
.text:004013A9 cmp ecx, eax
.text:004013AB jnz short loc_4013C7
.text:004013AD inc [esp+5Ch+var_14]
.text:004013B1
.text:004013B1 loc_4013B1: ; CODE XREF:
main+57 j
.text:004013B1 mov ebx, [esp+5Ch+var_14]
.text:004013B5 lea eax, [esp+5Ch+var_3E]
.text:004013B9 mov [esp+5Ch+var_5C], eax
.text:004013BC call strlen
.text:004013C1 cmp ebx, eax
.text:004013C3 jb short loc_40138D
.text:004013C5 jmp short loc_4013C8
.text:004013C7 ; ---------------------------------------------------------------------------.text:004013C7
.text:004013C7 loc_4013C7: ; CODE XREF:
main+77 j
.text:004013C7 nop
.text:004013C8
.text:004013C8 loc_4013C8: ; CODE XREF:
main+91 j
.text:004013C8 lea eax, [esp+5Ch+var_3E]
.text:004013CC mov [esp+5Ch+var_5C], eax
.text:004013CF call strlen
.text:004013D4 cmp eax, 8
.text:004013D7 jnz short loc_4013E8
.text:004013D9 cmp [esp+5Ch+var_14], 8
.text:004013DE jnz short loc_4013E8
.text:004013E0 mov [esp+5Ch+var_10], 1
.text:004013E8
.text:004013E8 loc_4013E8: ; CODE XREF:
main+A3 j
.text:004013E8 ; main+AA j
.text:004013E8 cmp [esp+5Ch+var_10], 1
.text:004013ED jnz short loc_4013FD
.text:004013EF mov [esp+5Ch+var_5C], offset aGoodBoySendTha ; "Good Boy ! Send That pass to server to "...
.text:004013F6 call printf
.text:004013FB jmp short loc_401409
.text:004013FD ; ---------------------------------------------------------------------------
.text:004013FD
.text:004013FD loc_4013FD: ; CODE XREF:
main+B9 j
.text:004013FD mov [esp+5Ch+var_5C], offset
aSorryIncorrect ; "Sorry ! Incorrect pass"
.text:00401404 call printf
大概理解一下:这里输入的字符串为8个字符,然后以esp+5Ch+var_34为地址之后的8个DWORD,取低8位字符,然后都xor 1,结果与输入的串比较,相等则正确。
来看看esp+5Ch+var_34的数据怎么得到:
.text:00401345 lea edx, [esp+5Ch+var_34]
.text:00401349 mov ebx, 402000h
.text:0040134E mov eax, 8
.text:00401353 mov edi, edx
.text:00401355 mov esi, ebx
.text:00401357 mov ecx, eax
.text:00401359 rep movsd
看样子是从0x402000h复制过来的,于是跟过去:
看样子把这些东西xor 1一下就可以得到password了然后提交就可以得到Flag了。
结果却是”Too late”,好吧题目写了少于2s。
那就把VA转换成文件偏移,得到0x1310,写个脚本自动破解吧。
题目如下:
Rot 90, Rot -90, Rot 90, Rot -90... nc 41.231.53.40 9090
每次连上去后会得到一个base64的字符串,解码后是一个png文件格式的字节流,可以还原成如图:
仔细观察一发,应该只要把左右两部分折叠拼凑在一起就行,而且题目中不是也说rot90。
运行后的结果如下:
自动提交,搞定。
题目:
Find the key ! http://41.231.53.43:8383/
题目是一个web页面,而New post功能的post内容存在sql延时盲注。Flag内容存在于数据库中,利用注入得到库名表名字段名,然后查询得到flag内容。盲注得到库名为web200,表名列名为flag:flag。
盲注sql语句:
test‘, ‘1‘ and (select if(ascii(mid((select flag from web200.flag where flag!=‘‘ limit 0,1),1,1))=100,sleep(5),0)))#
写一个脚本就来完成这个过程,就轻松搞定了。
题目:
Find the key http://41.231.53.44/web100/index.php
目前题目已经无法访问了,所以这里就简单说一下情况。在登陆的时候,我们使用万能登录“’ or ‘1’=’1”,成功以管理员身份登录后,再搜索“’ or ‘1’=’1”,得到的结果中就有flag。是不是很简单呀?其实ctf中很多题目只要你有思路都很简单的。
题目:
a baybe crackme http://41.231.53.44/tasks/re10.zip
如果上面地址无法下载,那么可以从这里
https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/baybe-crackme/re10.zip?raw=true下载。
运行下载后的文件,无限输出“baby crackme”,用IDA逆向一下,可以得到如下代码:
程序大致的意思是在没有参数运行的时候会无限输出Baby Crackme,当有参数的时候就会输出Flag。
莫非答案就是G00d_B0y,提交试一下,正确了。好吧,10分的题目。
题目:
The third Tick gives you the answer ;) http://41.231.53.40/kernel
备用下载地址:
https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/kernel-land/kernel?raw=true
运行下载后的文件,出现“segment fault”,而IDA调试刚连上去就自己断开,现在只能扔IDA里开始逆吧。
从启动函数开始看,一路设置GDT,IDT,IRQ,然后开个定时器,主线程就结束了,没发现啥和flag有关的。。。。把定时器翻出来看看,代码如下:
.text:00100958 public timer_tick
.text:00100958 timer_tick proc near ; DATA XREF:
timer_init+3 o
.text:00100958 sub esp, 14h
.text:0010095B mov eax, ds:1060C0h
.text:00100960 lea edx, [eax+1]
.text:00100963 mov ds:1060C0h, edx
.text:00100969 push eax
.text:0010096A push offset aDTick__ ; "%d Tick..\n"
.text:0010096F call printf
.text:00100974 movzx ecx, byte ptr ds:1060C0h
.text:0010097B add esp, 10h
.text:0010097E mov eax, 0
.text:00100983
.text:00100983 loc_100983: ; CODE XREF:
timer_tick+42 j
.text:00100983 mov edx, ecx
.text:00100985 xor dl, byte ptr ds:flag[eax]
.text:0010098B add edx, 1
.text:0010098E mov byte ptr ds:flag[eax], dl
.text:00100994 add eax, 1
.text:00100997 cmp eax, 28h
.text:0010099A jnz short loc_100983
.text:0010099C add esp, 0Ch
.text:0010099F retn
.text:0010099F timer_tick endp
这里的flag只和tick进行运算,而tick是个char,也就是说现在flag可能的取值一共有256种,那么穷举一下看看结果就知道哪一个是Flag了。
运行结果:
搞定了。
PwniumCTF2014 - JJSN总结,布布扣,bubuko.com
原文:http://www.cnblogs.com/huangjacky/p/3859786.html