The ring of fortune&Coding the world&Clear mind

04月 22

New Start

0x00 今天开始正式全面转战Android
0x01 虽然从XCTF开幕赛RCTF开始,就出现了mobile的题型,但是作为一个web狗,只是稍微看一点Android。随着事态发展,发现本来就是很有趣的东西,为何不让它更加interesting呢:)
So,那就全面开战吧。
0x02 为什么是Android而不是ios呢?因为Android有趣啊,可玩性高,每个人都能随意折腾;虽然目前Android生态圈比较乱,但乱世出英雄啊:)(反正我一直不喜欢iPhone
0x03 之前web主审计,虽然还没什么成绩,但,也不至于说是落荒而逃吧?hhh
那么,Android,就先从逆向开始,待有了成效,逐渐靠拢Android安全(话说Android安全东西也是好多,hhh
0x04 都是废话。Start my coding.

12月 07

Android之smali

0x00因为一些原因,做了次简单的Android逆向,看了会儿smali的东西,随手整理一下别人的东西,就当是做一个整合。
0x01原始类型(变量类型?)

V void (只能用于返回值类型)
Z boolean
B byte
S short
C char
I int
J long
F float
D Double

对象类型
Lpackage/name/ObjectName; 相当于java中的package.name.ObjectName

L 表示这是一个对象类型
package/name 该对象所在的包
ObjectName 对象名称
; 标识对象名称的结束

数组的表示
[I 表示一个int型的一维数组,相当于int[];
增加一个维度增加一个[,如[[I表示int[][]
数组每一个维度最多255个;
对象数组表示也是类似,如String数组的表示是[Ljava/lang/String

寄存器与变量
v表示本地寄存器,p表示参数寄存器,关系如下
如果一个方法有两个本地变量,有三个参数
v0 第一个本地寄存器
v1 第二个本地寄存器
v2 p0 (this)
v3 p1 第一个参数
v4 p2 第二个参数
v5 p3 第三个参数
如果是静态方法的话就只有5个寄存器了,不需要存this
.registers 使用这个指令指定方法中寄存器的总数
.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行

方法的表示
Lpackage/name/ObjectName;——>methodName(III)Z

字段的表示
Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;

声明成员
.field private name:Lpackage/name/ObjectName;

指令执行
move v0, v3 //把v3寄存器的值移动到寄存器v0上
const v0, 0x1//把值0x1赋值到寄存器v0上
invoke-direct {p0}, Lcom/paul/test/a;->d()V//调用com.paul.test.a的d()方法;

if-eq p1, v0, :cond_8 //表示如果p1和v0相等,则执行cond_8的流程;
if-ne p1, v0, :cond_b //表示不相等则执行cond_b的流程;
if-ge vA, vB, :cond_** //如果vA大于等于vB则跳转到:cond_**
if-lt vA, vB, :cond_** //如果vA小于vB则跳转到:cond_
if-gt vA, vB, :cond_**  //如果vA大于vB则跳转到:cond_**
if-le vA, vB, :cond_**  //如果vA小于等于vB则跳转到:cond_**
if-eqz vA, :cond_**   //如果vA等于0则跳转到:cond_**
if-nez vA, :cond_**  //如果vA不等于0则跳转到:cond_**
if-ltz vA, :cond_**   //如果vA小于0则跳转到:cond_**
if-gez vA, :cond_**  //如果vA大于等于0则跳转到:cond_**
if-gtz vA, :cond_**   //如果vA大于0则跳转到:cond_**
if-lez vA, :cond_**   //如果vA小于等于0则跳转到:cond_**

invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V;
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z; //调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法,最后 return v0;
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I //执行方法sum(),v4,v5的值分别作为sum的参数

input-object vx, vy, 字段ID //根据字段ID将vx寄存器的值存入实例的对象引用字段,vy寄存器中是该实例的引用
add-int/lit8 v1,v2,1    //计算v2加1的值,并存入v1中
const /4 vx, lit4       //表示存入4位常量到vx寄存器
add-int/2addr vx,vy    // 计算vx+vy,并将结果放入vx中
add-int/2addr v0,v1    //计算v0 + v1,结果存入v0中
sub-int/2addr vx,vy    //计算vx-vy,并将结果放入vx中
sub-int/2addr v0,v4    //计算v0 - v4,结果存入v0中
mul-int/2addr vx,vy    //计算vx*vy,并将结果放入vx中
mul-int/2addr v0, v1   //计算v0 * v1,结果存入v0中
div-int/2addr vx,vy    // 计算vx/vy,并将结果放入vx中
div-int/2addr v0, v1   //计算v0 / v1,结果存入v0中
rem-int/2addr vx,vy    //计算vx%vy,并将结果放入vx中
rem-int/2addr v0, v1   //计算v0 % v1,结果存入v0中
and-int/2addr vx,vy    //计算vx AND vy,并将结果放入vx中
and-int/2addr v0, v1   //计算v0 AND v1,结果存入v0中
or-int/2addr vx,vy     //计算vx OR vy,并将结果放入vx中
or-int/2addr v0, v1    //计算v0 OR v1,结果存入v0中
xor-int/2addr vx,vy    //计算vx XOR vy,并将结果放入vx中

持续更新中······

借鉴:
http://blog.sina.com.cn/s/blog_65380c300101dn8f.html
http://mobile.51cto.com/aprogram-464015.htm
href='http://www.cnblogs.com/lee0oo0/p/3728271.html
http://blog.csdn.net/lpohvbe/article/details/7981386
http://www.eoeandroid.com/home.php?mod=space&uid=1226144&do=blog&id=42054&_dsign=cd173b76&mobile=no(这一个比较乱)

12月 07

HCTF2015

0x00上个周末是HCTF(完全被吊打了啊sigh),表示下赛后···
0x01首先说的就是它的第一关--登录(开个玩笑),官方说明是平台被D了:-(,但是第二天做了负载均衡不是还挺顺的么。再吐槽一下它的开题形式--买题!并且不知道题目类型,于是我这个web狗连开几个re和pwn后,被杜神吐槽:最佳开pwn手。不过这种形式确实有点意思(找抽受虐
0x02一个小题目,送分题,但刚开始平台太卡···杜神curl了一下看到flag(听说这题是反spider的,所以curl很有效,其实直接复制粘贴链接(不得已),也是可以的,这是后来的笑谈)。
第一题,fuck===,MD5的东西,刚开始以为是碰撞,后来Google的时候发现一个点:MD5无法处理数组。于是,构造?a[]=1&b[]=2得到flag。
第二题,一个简单的隐写题(萌新不要点)。扔到winhex看一下,找到一串无序却有规律的数字+字母,事出反常必有妖:

R1k0RE1NWlhHUTNETU4yQ0daQ1RNUkpUR0UzVEdOUlRHVkRETVFaWEdNMlVNTlpUR01ZREtSUlRHTVpUSU5aVEc0NFRFTUpYSVE9PT09PT0

看起来是base64,于是decode,然后去一个“=”,base32,再hex->ascii,ok,得到flag。
第三题,PersonalBlog,说flag在source里,找各种点没有,有一个admin登录也是一个幌子,于是打算抓包看看。于是,在response里发现server是github,上github上搜一下,找到了源码,进一步得到flag。!
第四题,nes,赤色要塞,无聊打游戏通关了,看到了flag,但flag被挡了,(同时也被隐藏了一个字母),杜神说不方!分析色盘读出了flag。!
![少了一个A的flag.png]
第五题,Andy,看到题目基本猜是Android逆向。于是dex2jar,jd-gui,看了下大致流程,如下
!
不开心的是make()那一个方法,因为做了代码混淆,所以jd-jui就比较尴尬。无奈转smali,开始读smali文件,还好推出了流程,成功逆了一波。!
其实这个make刚开始就猜到了,只不过不敢确定。可以猜想arrary1是作为检查input必须为字母,数字及等号,arrary2就像是一个盒子里的东西,给了一定位置arrary1的输入,就给出对应位置的arrary2的output。事实也确实这样啦,不过趁机了解一下smali,还是很好的:)

arrarystring1:0123456789abcdefghijklmnopqrstuvwxyz=ABCDEFGHIJKLMNOPQRSTUVWXYZ
arrarystring2:WpX45BqA6aV3rbUsEdCcDOtTYv9Q2e8PfhJNguKkHxLwRIjiylmSM10On2G7=FZ

0x03这些就是能做的事情了,至于其他的题目,有的是没有看,有的是看了也不会(毕竟自己是蒻:-(
PS:传说中的所有题目:
https://www.zybuluo.com/lightless/note/183904
传说中的writeup:
http://bobao.360.cn/ctf/learning/157.html

总言而之,继续努力吧:)
以上。

11月 15

RCTF2015

0x00 XCTF的揭幕战--RCTF,在这个周末,结束了。。。(揭幕战果然不简单 么?
0x01 MISC01:一串貌似混乱的字符串,但仔细想一下,keyboard!每段字串在键盘上是什么形状呢!于是,就这样,成功签到。。。
MISC02:nginx log。没什么东西,看一下就行了,不就是一堆盲注的SQL么:

/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),1,1))>51),SLEEP(1),3720)
/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),1,1))>48),SLEEP(1),3720)
/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),1,1))>49),SLEEP(1),3720)
/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),1,1))!=49),SLEEP(1),3720)
/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),2,1))>51),SLEEP(1),3720)
/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),2,1))>48),SLEEP(1),3720)
/phpcode/rctf/misc/index.php?id=1 AND 3720=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(*) AS CHAR),0x20) FROM misc.flag),2,1))>1),SLEEP(1),3720)
===========================================================================
/phpcode/rctf/misc/index.php?id=1%20AND%207500%3DIF%28%28ORD%28MID%28%28SELECT%20IFNULL%28CAST%28flag%20AS%20CHAR%29%2C0x20%29%20FROM%20misc.flag%20ORDER%20BY%20flag%20LIMIT%200%2C1%29%2C29%2C1%29%29%21%3D125%29%2CSLEEP%281%29%2C7500%29

/phpcode/rctf/misc/index.php?id=1%20AND%207500%3DIF%28%28ORD%28MID%28%28SELECT%20IFNULL%28CAST%28flag%20AS%20CHAR%29%2C0x20%29%20FROM%20misc.flag%20ORDER%20BY%20flag%20LIMIT%200%2C1%29%2C30%2C1%29%29%21%3D5%29%2CSLEEP%281%29%2C7500%29
/phpcode/rctf/misc/index.php?id=1 AND 7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),30,1))!=5),SLEEP(1),7500)

从这里就可以看出来是怎么回事了:从misc.flag中跳ascii码出来,limit的位置,就是字符位。然后根据ascii码对应出字符,就是flag:ROIS{miSc_An@lySis_nG1nx_L0g}
MISC03:福利,虽然说那张图片是个福利吧(笑,但是说好的恺撒变形,并没有思路搞出来;(看完writeup再回来留个念= =
0x02 Mobil:说起来挺尴尬的,从第一天就知道第一个是ab文件,但第二天才找到工具提取出里面的东西(因为它是Android Backup 4 0 null,虽然没加密,但因为v4,找不到适用的工具。)工具:Andriller - Android Forensic Tools:http://andriller.com/,提出来之后,找到两个apk:zi和backup,但是输入user,pass爆incorrect,所以打算把apk逆向一下,于是,就这样开始做apk逆向了。。。(未得到flag)第二个Mobil,“好吧,其实这是misc”,同第一题,仍然apk逆向了一波,在mainactivity里边审代码,发现了规则,输入得到官方吐槽?“好吧,其实这是misc”╮(╯﹏╰)╭然而已经到了尾声,就这样结束了。
0x03 CRYPTO01:得到一个cip_***文件,winhex打开发现base64 decode就行了,于是根据每个密文后面的那个‘\n’,写Python脚本跑一下,
import base64
import string

f0 = open('cip.txt')
r = f0.read()
br = r.split('\n')
#print br
for x in br:
    x = base64.decodestring(x)
    print x
f0.close()
print 'ok!'

读出DES加密的py脚本,然后发现,这和github上的码有什么区别么?github地址:https://raw.githubusercontent.com/n0fate/chainbreaker/master/pyDes.py(或许有,但没仔细找到。
:-(,没办法,之后就做不动了。。。
0x04 Web:其实我是web狗啊!!!然而这次并没有怎么做web,毕竟队伍还有人可以搞web,于是简单说一下体验。
web01,文件上传?NO!它本质上是文件名注入,因为有回显给用户的内容,就可以看到注出来的东西,虽然要手动一个一个字符的注出来。(拖动验证好烦人)
web02,首先要admin登录,这里可用万能密码呵!(关于万能密码再起一文)然后发现了命令执行,队友试了之后,发现只有upload可用,于是这是真的要上传绕过了。根据试过的上传,得出验证逻辑大概是:后缀名(需要是php文件,但不能是php) -> 文件内容检测。(上传绕过也需要写一下了:-(
web03,nosql,其实第一天就看了这题,但只是发现了cookie里边base64,czo1OiJndWVzdCI7 -> “s:5:"guest";”,于是想把它更换成admin,czo1OiJhZG1pbiI7,就是一个“s:5:"admin";”,但登录没有进,应该有其他处理么?结束时在群里听说似乎是这个洞:https://bugs.php.net/bug.php?id=69892,这样的话,再研究喽(゜ー゜)
0x05 这次虽然flag得的少,但是学到的确实好多的。果然参加比赛很有趣。Interesting!
附上六星的writeup:http://m.bobao.360.cn/appctf/appdetail/155.html
以上。

10月 15

XDCTF2015

0x00 十一佳节,XDCTF,在假期与玩乐中挣扎。
0x01 P总出审计啦!
作为他的狂热热爱分子,怎么可以不去做这题!?但是作为一个代码小白,连git都没接触过!于是,在学习了两天git之后,连源码都没有获取到(囧)。P总给出了writeup:

https://www.leavesongs.com/PENETRATION/XDCTF-2015-WEB2-WRITEUP.html

(真不愧是P总)
(此处只是一个mark,具体此后见解)
0x02 web
作为一个web狗,自然是要玩一玩的,即使做不出来。说web1,简单的PHP弱类型问题。关于PHP弱类型,wooyun drops上有很好的文章。(虽然我也会总结)。同时我认为还有一个代码习惯吧,即逻辑判断的‘===’与‘==’(以等为例)。简单说明一下,if($i == true)为真时,则$i只需不为0;但if($i === true)时,则$i必须为‘true’,即完全相同。其他的题目,也就不看了(因为并没有思路)。
0x03 misc400
因为其它的真的没思路,所以就这一题了。首先因为没有文件类型,所以先winhex打开看了一下。然后发现应该是wireshark的pcap,于是添加文件后缀,用wireshark打开。filter里http后,读了几个包发现,flag并不在里面(居然还有一个含flag的HTML页面,然而你想骗谁呢!)再对整个文件分析后,找到了FTP连接传输(虽然有很多混乱的信息扰乱),一个一个读下去后,发现有一个app被每个包1460byte传输,后来官方发了hint也说明了FTP流,那就是这样了。于是开心的继续玩P总的代码审计!(虽然仍没有得到源码)具体解题可见writeup(不贴地址了,毕竟没有自己的)。
0x04 XDCTF是很棒的,它有一群可爱的出题人,有很多有趣的题目(即使做不出),玩得开心。CTF-time never goes die.