day0为近几天的总结,明日正式开始。
crackme160
1.打开程序是一个弹窗,点击确定后是一个窗口程序,第一个按钮是用户名和序列号验证,第三个按钮是序列号明文查找。首先要去掉弹窗,直接对MessageBoxA下断点,运行程序,在MessageBoxA的调用处停下,单步执行到调用处,观察并执行到最外层的封装函数调用处,直接爆破即可去掉弹窗(P.S.最开始我是直接在调用MessageBoxA处爆破,但之后发现这是个被封装的函数,爆破后所有弹窗都不会出现)。明文查找较为简单,所以先进行,随便输入运行一下,发现错误后弹窗,可以对MessageBoxA下断点或查找"Faild"和"Try Again"字符串定位到序列号验证附近,下断点到函数开头,单步执行,执行到一次函数调用时,eax寄存器中为输入字符串,edx为"Hello Dude!",猜测这是比较函数,eax和edx分别为两个参数,跟进函数,发现直接比较 ,所以明文即为"Hello Dude!"。最后是用户名与序列号算法,同样通过关键字符串或MessageBoxA定位到验证序列号附近,下断点到函数开头。观察分析后逆出算法。
2
pwnable.kr
1.fd,观察源代码,要求输入一个命令行参数,让它减去0x1234作为文件标识符读数据并与"LETMEWIN"比较,相同输出flag。fd为0时表示标准输入流,所以先输入0x1234的十进制整数,再输入"LETMEWIN"即可得到flag。
2.collision,观察源代码,有一个简单的hash函数,它返回输入参数的所有4字节和,主函数调用这个hash函数对我们输入的值进行映射,若这个映射值等于0x21DD09EC则输出flag,且命令行参数必须为20字节。要比较的hash值为4字节,而输入为20字节,所以判断流程为将20字节分为5组每组4字节然后相加。0x21DD09EC / 5 = 0x6c5cec8(取整后);0x21dd09ec-0x6c5cec8*4 = 0x6c5cecc;可以看到hash值可以由4个0x06c5cec8和1个0x06c5cecc组合而成,由于二进制数无法用键盘输入,所以利用python输入:python -c "print 4*'xc8xcexc5x06'+'xccxcexc5x06'" | xargs ./col
3.bof,观察源代码,要求输入数据到一个字符数组,但条件判断是否打印flag时与我们的输入毫无关系,即通过必定不会输出,所以需要利用栈溢出。通过输入来覆盖key使key等于0xdeadbeef即可获得flag。将flag二进制文件反汇编,即可知道其堆栈情况,算出占位字符有0x34字节,直接覆盖即可。(python2 -c "print 0x34*'a'+'xbexbaxfexca'";cat) | nc pwnable.kr 9000,这里加上cat命令是可以向nc多次输入,而不是输入一次就断开。
bandit
1.ssh连接成功后即可用cat命令查看flag
2.密码文件名为-,在命令中-会识别为对参数选择,所以不能直接查看,使用./-即可表示这是当前文件夹下的文件
3.密码文件的名字包含空格,直接使用键盘输入空格会使得命令识别为多个参数,用tab键补全发现空格用 转义
4.密码文件名以 . 开头,变为当前文件夹中的隐藏文件,使用ls -a即可查看隐藏文件
5.有许多文件,使用grep命令查找当前文件夹下带有password内容的文件,grep -r "password" .
6.提示密码文件大小为1033bit,使用find命令查找符合这个属性的文件,find -size 1033c
7.提示为owned by user bandit7, owned by group bandit6, 33byte,同样用find命令查找,find -user bandit7 -group bandit6 -size 33c
8.文件有大量数据,提示密码在million那一行,使用grep命令过滤
9.文件中有许多重复的字符串,提示为密码只出现一次,通过sort+uniq命令获取单行。cat data.txt | sort | uniq -u
10.文件中大部分数据不可读,提示密码前有等号,使用string命令与grep过滤
11.文件使用base64加密,使用cat data.txt | base64 -d解密并输出
12.文件使用13偏移的移位加密,可用脚本还原,也可使用tr命令
13.多层压缩,熟悉gz,bz2,tar命令
14.ssh使用rsa公钥进行远程登陆,使用-i参数附带证书文件(即私钥)
15.向本机30000端口提交本关密码,使用nc命令完成