首页 > 代码库 > PwniumCTF2014 - JJSN总结

PwniumCTF2014 - JJSN总结

Write-ups

本文最早发布在TSRC,详细地址:http://security.tencent.com/index.php/blog/msg/55

Forensics

USB is FUN

这道题目就给出了一个文件下载地址:http://41.231.53.40/for1.pcapng

文件后缀是pcapNG的,当然玩ctf的时候,看见的并不一定就是真的,我们可以通过file命令和一些hex工具来查看一下,信息如图:

image

image

通过上面信息可以确定该文件的确是pcapng格式,google了一下这个文件类型就是pcap格式的扩展,目前还只是实验阶段,可以使用wireshark打开分析。心急的朋友可能直接使用wireshark打开这个文件开始分析了,22M这得多少网络包呀。取证中经常用到一个方法就是使用strings查看文件中有什么字符串,运行结果如下图:

image

我们发现熟悉的flag字符串,提交,搞定了。

Altered Code

这一题给出了一个.c文件(下载地址:http://41.231.53.40/main.c),没有任何提示。

最初我们拿到这个文件后,编译,执行,得到一串无意义的字符串,当然这肯定不是flag。

接下来我们尝试了调换代码顺序,再编译执行,还是不对。

最后通过观察网页上面展示的代码段(这里有一个坑:工具打开.c文件会自动缩进好),我们发现缩进有问题,如图:

image

为了进一步确认,我们查看该文件的HEX,如图:

image

正常的缩进使用的空格,而有几行代码缩进使用的是\t。因此我们尝试注释掉\t缩进的代码段,再编译执行,效果如图:

image

提交,搞定。

Find the owner

题目:

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可以看到如下的网络请求:

image

ip:193.95.68.245,port:81,按照题目的提示md5一下,提交就搞定了。

ps:文件是一个木马,更简洁的方法可以扔给各种在线木马检测网站试一下,根本不用自己分析。懒人必备。

MISC

Look Closer

这题也只给出一个rar文件,下载地址:

https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/look-closer/Misc1.rar?raw=true),没有任何提示。

下载后,我们发现无法打开,提示是错误的格式,于是Hex查看一下文件的格式,如图:

image

图7 Hex查看misc1.rar

文件头很明显告诉我们这个是一个jpg文件,于是修改后缀,flag就在图片中,如图:

image

提交,搞定。

So basic

这题同样只给出一个zip文件(下载地址:

https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/so-basic/Misc75.zip?raw=true)。

我们将下载的zip文件进行解压,里面有40个小文件,每个文件中是一个数字,给人感觉就是这个是ASCII值。

首先将所有文件中的文本合并到一个文件中:

cat ./* > misc75.txt

然后转换成对应字符串看看,得到如图的结果:

image

图9 unhexlify的结果

看上去很像flag,但是顺序是乱的。我们找到字符P对应的文件“cfcd208495d565ef66e7dff9f98764da”,文件名很像是MD5加密的,于是我们尝试破解一下,解密后是字符0。那么大胆猜测所有的文件名其实是0~39的MD5密文。那么我们修改一下程序:

image

图10 修改后的Py代码

YEAH!!搞定。

Crypto

Break me

题目中给出一个字符串:

“QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=”

经验告诉我们这个是一个经过Base64编码的字符串,于是我们尝试使用Base64解码,解码后结果含有不可见字符,说明这还不是Flag。

image

在这里有一些不知所措,于是乎我们将前面可见部分字符在google中进行搜索了一下,发现有相关文章说这是bz2文件格式的头部,通过对比bz2文件格式的头部和尾部,我们可以确认上面的字节流的确是经过bzip2压缩后的内容,现在就就简单了,再解压缩一次:

image

提交,搞定了。

Programming

2048

Crack me fast

题目提示如下:

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}

访问题目中的地址,可以得到一个文件,打开之后如图:

image

文件头是个LPCK,不知道啥格式,不过在之后看到了MZ头。把MZ头之前的部分统统删掉,成功得到一个exe。

image

要求输入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复制过来的,于是跟过去:

image

看样子把这些东西xor 1一下就可以得到password了然后提交就可以得到Flag了。

结果却是”Too late”,好吧题目写了少于2s。

那就把VA转换成文件偏移,得到0x1310,写个脚本自动破解吧。

image

ROT

题目如下:

Rot 90, Rot -90, Rot 90, Rot -90... nc 41.231.53.40 9090

每次连上去后会得到一个base64的字符串,解码后是一个png文件格式的字节流,可以还原成如图:

image

仔细观察一发,应该只要把左右两部分折叠拼凑在一起就行,而且题目中不是也说rot90。

image

运行后的结果如下:

image

自动提交,搞定。

Web

Guest book

题目:

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)))#

写一个脚本就来完成这个过程,就轻松搞定了。

Xwebsite

题目:

Find the key http://41.231.53.44/web100/index.php

目前题目已经无法访问了,所以这里就简单说一下情况。在登陆的时候,我们使用万能登录“’ or ‘1’=’1”,成功以管理员身份登录后,再搜索“’ or ‘1’=’1”,得到的结果中就有flag。是不是很简单呀?其实ctf中很多题目只要你有思路都很简单的。

Reverse

Baby crack me

题目:

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逆向一下,可以得到如下代码:

image

程序大致的意思是在没有参数运行的时候会无限输出Baby Crackme,当有参数的时候就会输出Flag。

莫非答案就是G00d_B0y,提交试一下,正确了。好吧,10分的题目。

Kernel Land

题目:

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了。

image

运行结果:

image

搞定了。