分类目录归档:记录

CMU 15-445/645 – Homework assignment #1 SQL

0x00. Desciption

execute sql queies in SQLite in IMDB database.

0x01. Evn setup

I’m using Ubuntu20.04 VM for this homework. The VM is installed on VMware Workstation Pro 15. There’re several steps to prepare:

  1. install SQLite, sudo apt-get install sqlite3 libsqlite3-dev

  2. Download dataset, wget https://15445.courses.cs.cmu.edu/fall2019/files/imdb-cmudb2019.db.gz

  3. verify dataset, md5 imdb-cmudb2019.db.gz

  4. Unzip and execute it, gunzip imdb-cmudb2019.db.gz and sqlite3 imdb-cmudb2019.db

继续阅读

ECE9609 – Notes for Sudo Heap-based Buffer Overflow (CVE-2021-3156)

Sudo Heap-based Buffer Overflow (CVE-2021-3156)

Background

Common Vulnerabilities & Exposures, so-called CVE, is a dictionary of system vulnerabilities that has been disclosed to the public. Normally, it consists of CVE-ID, a description, and a list of references. Specifically speaking, the CVE-ID specifies the identity of a particular CVE, the description field explains the detail of this CVE, and the references list all reports from each department that found this CVE. In this presentation, we are going to explore the latest CVE, CVE-2021-3156. It reported that the command “sudoedit -s” and any command that ends with a single backslash character will mistakenly promote the user’s permission as well as the root.

继续阅读

Limit GPU memory growth in tensorflow 2.4.x by setting environment variable

Simplest way(TensorFlow 2.2+)

import tensorflow as tfgpus = tf.config.experimental.list_physical_devices('GPU')for gpu in gpus:  tf.config.experimental.set_memory_growth(gpu, True)

Or set environment variable

set TF_FORCE_GPU_ALLOW_GROWTH to true.

if TensorFlow 2.0 and 2.1

import tensorflow as tftf.config.gpu.set_per_process_memory_growth(True)

Source:

  1. https://www.tensorflow.org/guide/gpu#limiting_gpu_memory_growth
  2. https://stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory/34200194#34200194

ECE9609 – assignment 1, PicoCTF easy challenges

Web Exploitation

dont-use-client-side

from the title of the challenge, I could know that the exploit is most likely on the client side, which is the web page of the challenge.
After open the web page provided in the description, it’s a simple login form asking for a credential. Since it’s a web page, I open dev tool in Chrome to look at the source.
And then, I discoverd the following JS code. The js is to valid the string input from the form. and valid the string by spliting the string. So just append the string together would be the flag I need(at the order of the splitting).

function verify() {
    checkpass = document.getElementById("pass").value;
    split = 4;
    if (checkpass.substring(0, split) == 'pico') {
      if (checkpass.substring(split*6, split*7) == '723c') {
        if (checkpass.substring(split, split*2) == 'CTF{') {
         if (checkpass.substring(split*4, split*5) == 'ts_p') {
          if (checkpass.substring(split*3, split*4) == 'lien') {
            if (checkpass.substring(split*5, split*6) == 'lz_7') {
              if (checkpass.substring(split*2, split*3) == 'no_c') {
                if (checkpass.substring(split*7, split*8) == 'e}') {
                  alert("Password Verified")
                  }
                }
              }
      
            }
          }
        }
      }
    }
    else {
      alert("Incorrect password");
    }
    
  }

the flag is picoCTF{no_clients_plz_7723ce}(the reassemble of the flag could be done by a simple program, but it’s just very short string, I just glued it together by hand).

继续阅读

项目服务器选择,Linode vs Vultr vs Upcloud

0. intro

最近新的项目需要一台VPS,要求域名不需要备案,带宽以及流量大,国内访问速度尚可,稳定。经过考虑,首先排除了国内的商家(阿里云,腾讯云境外机房贵而且带宽小),其次排除国内外小商家(oneman),以免随时跑路。最终还是在Linode, Vultr 和 Upcloud等几个商家中。

除了上面提到的几个外,可选的还有例如Amazon Lightsail,GCE,DO,Krypt等,但是这几个都不符合我的要求,要么线路太差,要么价格太贵。

我需要缓存一定量的数据到内存中,内存大小也是我一个重要的考虑因素,虽然如此,但这几家的内存大小都和价格一致,也没什么办法了。在寻找VPS的过程中,我发现了一家德国公司Contabo,他们公司新开了一个美国机房,虽然线路不好,但是套个Cloudflare也不是不可用。Contabo可以做到13 usd给16G内存,400G的SSD,6个vCore(部分还是EYPC)以及400Mb的不限量带宽,非常诱人。

德国的厂商只用过Netcup的VDS,给我的印象是他们对客户的身份审核非常认真,Netcup我发送了信用卡以及护照+驾照的翻译件才通过审核(国际驾照翻译即可),所以对德国商家还是印象不错的。不过Contabo我需要的这款需要5 EUR的设置费,十分难受,就没有测试,如果之后10 usd的2G内存不够用,再考虑迁移吧。

继续阅读

CentOS 7/8 修改默认SSH端口(开启SELinux)

使用root账户编辑ssh配置文件

[root@izj6c209wscy81xkfbtpacz ~]# vi /etc/ssh/sshd_config

输入“:/Port“,在VIM中搜索Port关键词

找到如下内容:

取消注释,增加一行配置设置新端口

输入”:/wq”保存所做的修改

在终端输入”systemctl restart sshd”重启ssh服务

如果没有任何输出,那么表示重启成功,可以使用新设置的端口链接服务器了(新端口22111)。

测试新端口可以连接,重新打开配置文件,在Port 22前方添加:**#**,注释掉,这样就无法使用22端口登入服务器。

把端口号加入到防火墙中,同时删除掉22端口的防火墙白名单

加入新端口:

firewall-cmd --zone=public --add-port=22111/tcp --permanent

firewall-cmd --zone=public --remove-port=22/tcp --permanent

重启firewalld服务:

firewall-cmd --reload

安装semanage工具

yum -y install policycoreutils-python

输入semanage检查是否安装成功,输出如下表示安装成功

添加端口:

semanage port -a -t ssh_port_t -p tcp 22111

检查是否添加成功:

semanage port -l | grep ssh_port

如果你使用的是阿里云/腾讯云,请自行添加端口到防火墙安全组中修改,禁用端口完成。

go语言中对闭包的理解和实例演示

go中的函数闭包(Function Closures)对于我来说比较难理解, 在之前的开发中也没有用到其他语言的闭包特性, 所以特意认真学习了一下. 下面我会详细解释我对go中闭包的理解和一个实例用法.

简单来说, 闭包在go中的实现方法就是在函数中嵌套另一个子函数, 如下代码片段所示(摘自官方教程):

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

可以看到, 创建了一个名为adder()的函数, 函数中有一个局部变量sum, 闭包的第一个特性就是可以直接访问父函数的变量, 所以在内部函数中直接使用了sum.

ad := adder()
fmt.Println(ad(10))

这样子就是对闭包特性的一次使用. 函数也是一个变量存在到内存中的, 所以可以把ad作为函数的reference, 在println语句中, 是ad第一次调用, 这里通过函数的reference传入的值实际上是传到了adder()中的匿名函数里, 即x = 10.

我在初次学习中对这里有疑惑, 不理解ad := adder(), 其实这句话可以根据字面意思理解, 即把adder()的返回值赋给ad, 由于adder()的返回值是一个匿名函数, 那么我们就拿到了匿名函数的reference, 下面使用ad(10)传入值也就理所当然了.

下面我用一个更好的例子来解释:

func minusValue(a, b int) func(int) int {
	fmt.Println("this is from minusValue, and a is", a, "b is", b)
	sum := a + b
	return func(para int) int {
		sum += para
		fmt.Println("this is from inner func and sum is", sum)
		return sum
	}
}

我直接使用minusValue(1,2)调用它, 那么控制台只会输出this is from minusValue, and a is 1 b is 2. 这里大家都理解. 当我用下面的方法调用, 就体现出了闭包的另一个特性, 闭包匿名函数中返回的变量只要还有reference在用, 那么它就会一直存在到内存中, 请看下面的调用和结果输出:

f := minusValue(1,2)
f(10)
f(10)
fmt.Println("----------------")
n := minusValue(10,20)
n(100)

输出:

这就是闭包的用法以及特性, 那么在实际的生产中, 也有着很多作用(我也是才知道), 例如(来源):
编写一个程序,具体要求如下:

编写一个函数 makeSuffix(suffix string) ,可以接收一个文件后缀名(比如.jpg),并返回一个闭包;
调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如 .jpg),则返回 文件名.jpg,如果有 .jpg后缀,则返回源文件名;
strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。

答案:

package main

import (
	"fmt"
	"strings"
)
func makesuffix(suffix string) func(string) string {
	return func(name string) string {
		//如果name没有指定的后缀,则加上,否则就返回原来的名字
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

func main() {
	f2 :=makesuffix(".jpg")
	fmt.Println("文件名处理后=", f2("winter"))
	fmt.Println("文件名处理后=", f2("bird.jpg"))
}

通过使用闭包的特性, 预先”设置”一个要处理的后缀, 之后通过不断调用闭包的reference, 就可以达到所需要求.