OpenSource Hardware, Back-End, CTF

Tag Cloud

tag1 tag2 tag3 tag4

About

关于关于关于关于关于关于关于

查看更多

Feeds

RSS feed
FreeBSD上使用VIM
17 November 2017

安装完整VIM

pkg install vim

安装Git

需要通过Git获取vimrc和相关的插件

pkg install git

下载vimrc

下载我的vimrc,并复制到用户目录

git clone https://github.com/knowncold/vim.git
cd vim
cp .vimrc ~/.vimrc
cp colors ~/.vim/colors

安装Vundle

可以参考之前的文章Windows安装Vundle

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

vim插件

打开vim,使用PluginInstall命令

自动补全


CodeFest CTF 2017
23 September 2017

这次开学打的第一个CTF,网站巨卡无比,挂了VPN也没用
甚至傍晚的时候整个学院教育网炸了

cr4ck

拿到一个文件,用binwalk看一下文件的结构

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
1536          0x600           PNG image, 640 x 400, 8-bit/color RGBA, non-interlaced
1659          0x67B           Zlib compressed data, best compression
122104        0x1DCF8         LZMA compressed data, properties: 0x89, dictionary size: 16777216 bytes, uncompressed size: 100663296 bytes
122296        0x1DDB8         LZMA compressed data, properties: 0xA3, dictionary size: 16777216 bytes, uncompressed size: 100663296 bytes
122488        0x1DE78         LZMA compressed data, properties: 0xBF, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes

明显能看到的是里面有个图片,就用dd直接分离出来

dd if=cr4ck of=test.png bs=1 skip=1536 count=120568

打开图片就能看到flag

flag{didin’tknowflagscouldbeinimages}

受这个意思印象,提交的时候还忘记加flag{}格式,以至于花了一节数据库的课来查后面的LZMA

malicious

zip压缩文件,直接解压的话,只会解压出一个README.txt
内容是

WE NEED TO GO DEEPER!!

用binwalk又能看到后面还藏着一个zip文件

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Zip archive data, at least v2.0 to extract, compressed size: 25, uncompressed size: 23, name: README.txt
121           0x79            End of Zip archive
143           0x8F            Zip archive data, at least v2.0 to extract, compressed size: 44, uncompressed size: 52, name: flag.txt
279           0x117           End of Zip archive

还是用dd分离出来

dd if=malicious_0a5aca19667459c2b75c384d7a6af48f.zip of=flag.zip bs=1 skip=143

得到这个zip文件,然后解压出来是flag.txt
内容是

666c61677b6b3333705f75705f793075725f7a6970703372357d

十六进制的ascii转成字母就得到了flag

flag{k33p_up_y0ur_zipp3r5}

SimplyBlack

对于一张全黑的图片

直接用Stegsolve看就能看出flag

flag{LETHAL}

JS Security

在这个网站 https://grab-the-fwag.herokuapp.com
看一下网页源代码

<!doctype html>
<html>
    <head>
        <title>CodeFest '17 CTF</title>
        <script type="text/javascript" src="md5.js"></script>
        <script type="text/javascript" src="kernel.js"></script>
    </head>
    <body>
        <h3>Provide the granted username</h3>
        <form method="POST" onSubmit="return validateLogin(this)" action="secure_login.php">
            <table border=0 align="center">
                <tr>
                    <td><label for="user"><b>User:</b></label></td>
                    <td><input type="text" name="user" id="user"></td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><p><input type="submit" value="Get Access"></p></td>
                </tr>
            </table>
        </form>
    </body>
</head>

可以看到主要是两个js,md5.jskernel.js,前者只是一个md5的加密的库,后者一开始没仔细看以为是没内容,结果学长提醒才发现前面全是空行,最下面是

// JS too insecure, re-implementing in PHP
function validateLogin(formToBeValidated) {
    if (formToBeValidated.user.value == null || formToBeValidated.user.value == "") {
        alert("Username must be filled out!");
    } else {
        if (md5(formToBeValidated.user.value) == "da61a45edbd65ef661a6108b39fc04b6")
            return true;
        else
            alert("User not granted!");
    }
    return false;
}

//function keyRetrieved() {
//    window.location = "secure_login.php";
//}

很显然就是一个md5的加密,这一串拿去解密就能得到表单应该填的14075064,提交表单之后就会得到

Congratulations! The key is flag{17_w45_hidd3n_in_p14in_5igh7}.

flag{17_w45_hidd3n_in_p14in_5igh7}

anonymous

对于一个网站/askauth
只有一个按钮,直接单击按钮没什么用会一直被重定向

看网站的源代码和其他的HTTP头都没什么信息,然后发现有个cookie是flag:True,尝试改成False,重定向到了一个新的页面/ask_username

需要一个新的Username,又想到题目描述是需要用root登录,又重定向到了一个新的页面/ask_password

发现又多了一个cookie,pass:7af32ff30622da6d6dafc8f5bd202ae6,用md5解码,得到aunty,尝试登录,就得到了flag

Congtraulations, You have entered the restricted section.

The flag is the password.

flag{aunty}


Baking-Pi OK01
20 September 2017

OK01这个教程会从零开始尝试把树莓派的RCA和USB口附近的那个’ACT’LED点亮,并搭建好环境为接下来的教程做好铺垫。

准备

在实际动手之前,需要你先看完前一篇教程,并下载安装了必要的GUN工具链以及代码的模版文件OS Template

文件结构

在模版文件夹里面你会看到这样的文件目录:

build/
    (empty)
source/
    main.s
kernel.ld
LICENSE
Makefile

找个编辑器打开main.s文件,我们就可以开始写汇编代码了,树莓派使用的汇编是ARMv6,我们要写的汇编也就是ARMv6。

把下面这些代码复制粘贴进去:

.section .init
.globl _start
_start:

这些代码对树莓派没有直接的作用,它们是写给汇编器看的,汇编器是一个把我们将要写的汇编代码转换成树莓派能直接运行的机器码的程序。在汇编代码中,每一行都是一条新的命令,这里的第一行告诉汇编器和链接器把我们的代码放到哪里去,.init这里的代码会和模版文件组合,最终被放到输出代码的最前面。这一点很重要,因为我们要保证哪部分代码首先运行,如果我们不这么做的话,代码会按照字母表的顺序运行。
.section命令只是告诉了汇编器从这一点到下一个.seciton是代码的链接后的位置,而后面的两行告诉了工具链程序的入口。

第一行代码

把下面的代码拷贝粘贴进去

ldr r0,=0x20200000

在汇编代码中,计算机会简单的从上往下运行代码,每一行都是一个指令,除非遇到某些指令发生跳转。 这第一行代码告诉处理器,把0x20200000这个数字存储到r0这个寄存器里面,0x20200000显然是个十六进制的数字,那么什么是寄存器?

寄存器是处理器内部的一些用来存数据的小部件,可以理解成一个个的抽屉,有些寄存器会有一些特定的功能,在树莓派上有13个通用寄存器,每一个可以存储一个32比特的数字(从0到4,294,967,295 ),从r0一直到r12,对于这13个寄存器,做任何操作和运算都没关系,在这一行代码中,换成其他寄存器也没关系。

这行代码把0x20200000存到r0,是为了接下来的控制GPIO,而GPIO控制器的位置恰好就是0x20200000,这一点可以通过参考中的数据手册来查到。

指令

ldr reg,=val  
把val存到对应的寄存器中

设置GPIO的输出模式

mov r1,#1
lsl r1,#18
str r1,[r0,#4]

要让这个ACT LED亮起来,首先和Arduino类似的要先设置这个引脚端口为输出模式,然后再让它输出高电平。
上面的代码就能让ACTLED这个GPIO16设置为输出模式,首先我们把1存到r1,然后通过lsl指令,得到二进制的1000000000000000000,其实也可以直接把这个数存到r1,但是为了后面的操作和代码,这样写更有意义。

在GPIO控制器中,有24个字节用来设置GPIO,前4个对应前10个GPIO,第二个4个对应第二个10个,总共有54个GPIO,所以我们需要6x4总共24个字节。
在4个一组里面,每三个比特对应一个GPIO,我们操作的是16号GPIO,所以我们需要操作第二个4字节中第六个3比特,也就是上面代码中18的由来。
其中的str指令,会把r1中的值,写到地址为r0的值加上4偏移的位置

指令

mov reg, #val  
把val存到对应的reg寄存器  
mov指令比ldr快,因为mov不牵涉到内存,而ldr是从内存把数存到寄存器,但是mov只能对某些数字做操作  

lsl reg, #val  
reg寄存器的值逻辑左移val位

str reg, [dest, #val]  
把reg寄存器重的值写到地址为dest寄存器的值+val

输出高电平

mov r1,#1
lsl r1,#16
str r1,[r0,#40]

现在GPIO已经准备好被点亮了,这意味着我们要让GPIO16输出低电平,没错是低电平,板子本身设计就是这样。
上面的指令都已经见过了,为了让GPIO16输出低电平,我们得让一个第十六位是1的数写到偏移GPIO控制器40的地址位置,这样就能输出低电平了。

死循环

需要的代码都写完了,应该结束了,但是假如就那样的话,只要有供电,处理器就会持续工作,如果不给他其他的任务,树莓派就会崩溃。

loop$:
b loop$

这里的第一行不是一个命令,是一个标签,或者说名字,这意味着我们可以通过loop$这个名字来找到这一行代码,代码编译完成之后标签都没有意义了会变成地址,对于写代码的我们则是又很重大的意义,b指令的作用是下一条执行的指令跳转到后面的标签所指代的代码块,在这里就会导致树莓派一直循环直到断电。

另外GNU工具链要求代码的最后有一个空行。

编译和运行

编译非常简单,用终端进入到代码的根目录,也就是Makefile的同级目录中,运行make,没什么问题的话,就会生成一个kernel.img的文件。

安装这个系统代码之前,首先需要一个已经装好了常规的Raspbian系统的树莓派SD卡,在SD卡的目录中很容易就能找到一个kernel.img的文件,把它替换成刚刚生成的新文件,然后插上电源,就能看到这个ACTLED亮起来了。

参考

数据手册


Docker化的mssql-server
16 September 2017

Docker是比虚拟机小的虚拟化容器技术,每个Docker镜像都有一个基本的特定的功能,比如配置好PHP环境的镜像、数据库系统。

通过Docker,不需要在实体机上安装一堆mssql或者虚拟机,相对而言更加优雅

Docker在windows上是运行在hyper-v上的,所以家庭版没有hyper-v是无法使用的,或者使用跑在virtualbox上的版本

Docker基本命令

docker ps -a    # 查看当前的所有容器
docker rm <Container ID> # 删除容器
docker start <Container ID> # 启动容器
docker stop <Container ID> # 停止容器

mssql-server

在Mac或者Windows上,需要将Docker的内存调到4GB

拉取镜像

docker pull microsoft/mssql-server-linux

运行容器镜像

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -e 'MSSQL_PID=Developer' --cap-add SYS_PTRACE -p 1401:1433 -d microsoft/mssql-server-linux

修改SA密码

docker exec -it <Container ID> /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<Old Password>' -Q 'ALTER LOGIN SA WITH PASSWORD="<New Password>";'

容器内部连接数据库

docker exec -it e69e056c702d "bash"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'

>1 CREATE DATABASE TestDB
>2 SELECT Name from sys.Databases
>3 go

>1 USE TestDB
>2 CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
>3 INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
>4 go

>1 QUIT

从容器外部连接数据库

sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'

可视化工具连接数据库

以DataGrip为例

参考

microsoft/mssql-server-linux
使用 Docker 运行 SQL Server 2017 容器映像
在 Docker 上配置 SQL Server 2017 容器映像


树莓派Zero掌机
24 August 2017

使用batocera配置树莓派Zero W掌机,batocera系统与其他游戏机系统相比性能要求低,非常适合用于Zero这种低配置的板子上使用。

下载镜像

这个网站,选择针对树莓派Zero W的镜像下载,Windows用Win32DIskImager直接烧写,Linux用dd命令即可。

初次配置

通过HDMI线连接电视机或者显示器,给树莓派正常供电,系统会自动分配空间,自动配置完,然后强制关机直接切断电源就行。

配置分辨率

考虑到我们需要用小屏幕来作为掌机的显示,系统不会默认就直接适配屏幕,以我的这个5寸屏幕为例,需要修改一些配置文件,这个步骤需要Linux系统或者虚拟机。

首先需要修改/RECALBOX目录下的config.txt

将下面这段加到里面去(可能需要sudo命令行)。

framebuffer_width=800
framebuffer_height=480
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt  800  480  60  6  0  0  0
device_tree=bcm2710-rpi-3-b.dtb
dtparam=spi=on

/SHARE/system/recalbox.conf中的两处CEA 4 HDMI改成DMT 87 HDMI

使用其他屏幕的时候用类似的操作就行了,配置成功之后应该可以使batocera的主屏幕和游戏界面都完全适配使用的硬件屏幕。

设置GPIO控制

修改/SHARE/system/recalbox.conf中的两行配置

controllers.gpio.enabled=1  
controllers.gpio.args=map=1,2 => controllers.gpio.args=map=1

重启之后就可以尝试用下面这张图的相关引脚了,默认是上拉的引脚,所以只要把引脚比如27号连一下GND,看他会不会有左滑的效果,如果有效果的话,就是说软件上配置成功了,硬件上还需要做一些事情,需要焊一块小型的掌机来操作才行。

总体思路就是在一块洞洞板上焊接需要数量的微动开关,然后

使用游戏机

正式玩游戏之前需要一些其他额外的配置,