zoukankan      html  css  js  c++  java
  • PwniumCTF2014

    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

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

    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.. "

    .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

    搞定了。

  • 相关阅读:
    Kettle使用kettle.properties
    kettle 获取文件名
    连接池的补充设置,应用到上面所有数据源中
    kettle 获取某个目录下所有的文件
    不小心删库了怎么办,用binlog可以恢复
    江北的KETTLE学习日志
    Python3 中,bytes 和 str
    kettle入门(四) 之kettle取昨天时间&设置任意时间变量案例
    30-Day Leetcoding Challenge Day17(构造并查集)
    30-Day Leetcoding Challenge Day16
  • 原文地址:https://www.cnblogs.com/huangjacky/p/3859786.html
Copyright © 2011-2022 走看看