C++反汇编与逆向分析实战

今天开始学习这本书,做一些笔记,之前有一些基础,理解的部分便少做些记录了。

IDA Pro 常用快捷键

快捷键 功能
A 结实光标的地址为一个字符的首地址
B 十六进制和二进制进行转换
C 解释光标处地址为一条指令
D 解释光标为止为数据
G 快速查找大对应地址
H 十六进制和十进制转换
K 将数据解释为栈变量
; 添加注释
M 解释为枚举成员
N 重新命名
O 解释数据为一个数据读研偏移量
T 解释数据为一个结构体成员
X 切换师徒到交叉参考模式
Shift +F9 添加结构体

利用python连接并控制SSH

使用pexpect来连接ssh

(该工具只能在linux下使用)

python连接ssh并且执行命令,显示输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/python
import pexpect
PROMPT = ['# ','>>> ','> ','\$ ']
def send_command(child,cmd):
child.sendline(cmd)
child.expect(PROMPT)
print child.before

def connect(user,host,password):
ssh_newkey = 'Are you sure you want to continue connecting (yes/no)?'
connStr = 'ssh ' + user + '@' + host
child = pexpect.spawn(connStr)
ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])
if ret == 0:
print '[-] Error Connecting'
return
if ret ==1:
print "send yes to server!\n"
child.sendline('yes')
ret = child.expect([pexpect.TIMEOUT,'[P|p]assword: '])
if ret == 0:
print '[-] Error Connecting'
return
child.sendline(password)
child.expect(PROMPT)
return child
ss = connect("root","heiyiren.top","heiyiren312429020!@#")
send_command(ss,'cat /etc/shadow | grep root')

CloudStack安装部署

整整折腾了一个星期,终于将CloudStack的安装部署搞定了

整个流程下来遇到很多问题,也学到很多东西,果然遇到问题还是不要逃避才能学到知识。

对其进行二次开发做虚拟化的想法萌生出来,感觉这种方式来尽心信息安全实验开发环境开发是一件很有意义的事情。

有时间重新部署一遍,然后把过程记录下来,二次开发的话暂时不考虑,得等软件逆向这块知识啃下来之后再考虑,学校的事情也比较多,毕业设计也还没做!!!

python之端口扫描

使用python脚本进行tcp全连接测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from socket import *
from threading import Thread
import optparse

def connPort(ipAddr,port):
setdefaulttimeout(1)
try:
conn = socket(AF_INET,SOCK_STREAM)
conn.connect((ipAddr,port))
conn.send(b"python\r\n")
print("[+] %d/tcp open"%port)
results = conn.recv(100)

print("[+] %s"%str(results,encoding="utf-8"))
except Exception as e:
#print(e)
pass

if __name__ == "__main__":
parser = optparse.OptionParser("python portscan.py -H <host ip addr> -p <port>")
parser.add_option("-H",dest='hAddr',type='string',help='specify ip addr')
parser.add_option("-p",dest='port',type='string',help='specify port')
(options,args) = parser.parse_args()
if options.hAddr==None or options.port==None:
print(parser.usage)
else:
ports = str(options.port).split(",")
for i in ports:
t = Thread(target=connPort,args=(options.hAddr,int(i)))
t.start()

python破解zip密码

今天写了个小脚本,用于暴力破解zip密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import zipfile
from threading import Thread
import optparse

def testZipPasswd(zfile,passWord):
try:
zfile.extractall(pwd=passWord)
print("[+] Found Password: "+str(passWord,encoding="utf-8"))
except Exception as e:
#print(e)
pass
def decodeZipPasswd(zfile,passfile):
with open(passfile) as f:
zfile = zipfile.ZipFile(zfile)
for i in f.readlines():
i = i.replace("\n","")
t = Thread(target=testZipPasswd,args=(zfile, i.encode(encoding="utf-8")))
t.start()
if __name__ == "__main__":
parser = optparse.OptionParser("python zip.py -f <zipfile> -p <passfile>")
parser.add_option("-f",dest='zname',type='string',help='specify zip file')
parser.add_option("-p",dest='passwd',type='string',help='specify password file')
(options,args) = parser.parse_args()
if options.zname ==None or options.passwd==None:
print(parser.usage)
exit(0)
else:
decodeZipPasswd(options.zname,options.passwd)

达克效应

今天不想做任何事情,下班后就开始逛网站。

自己的自信心受到了一些打击,觉得自己好菜,什么都不会,然后反省一下,入门渗透的这段时间自己膨胀的厉害。

百度上看着看着,发现一个达克效应,具体描述如下图所示:

感觉自己差不多算是在愚昧山峰了,啥时候能走下来,走到绝望之谷之后才会有更多的进步吧,忙完这段时间要开始学习逆向和代码审计了,其实还有好多想做的事情没去做,比如 MSF渗透工具的使用,各种kali攻击技巧的学习,都没时间去做,甚至想针对PHP进行深入学习,亦或是加强自己C++编程能力,学习编译原理等等。

总结一下,就是前段时间有点膨胀了,觉得自己入门了渗透,有点迷之自信,现在想想自己果然还是菜鸡,在每个方面都只是知道了点皮毛,但却有点那种我好像知道这个东西是做什么,以后可以慢慢学,学了就可以会的那种心态。

在这里给自己立一个flag,今年要学完基础的linux软件调试和 Android的软件调试,要进行一次简单CMS框架的代码审计,要学会使用MSF渗透工具和Kali常用渗透工具的基本用法,还要保证自己每周最少健身一次,每周最少有1天的学习时间。

希望自己接下来的每一周都能做一些笔记,每天拿出1个小时的时间逛freebuf等技术论坛。

密码学咱现在先不去动他。。。编译原理。。。编程。。。也都丢一边去。。先从脚本小子开始吧。

Linux密码加密方式之salt

今天学了关于Linux密码加密的方式,以及如何通过密文来暴力破解明文(需要强大的字典或者算力)

密码发展

密码从最开始的明文 -> 单向哈希加密 -> 带有盐的单向加密方式

最开始数据库中的数据

username password
admin 123

到后来的单向哈希加密

username password
admin 202cb962ac59075b964b07152d234b70

再到后来的带有盐的单向加密

username salf password
admin salf b3d513356bdf68b968b2eb69148cecdd

python获取网卡信息

Python获取本机IP地址的一般方法为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import socket

IP = socket.gethostbyname(socket.gethostname())
  通过gethostname获取主机名,再用gethostbyname将主机名转换为IP地址。

  那么,问题来了。如果主机有多个网卡/IP,怎样获取某个指定的IP地址呢?

  一个方法是通过socket.gethostbyname_ex获取主机IP地址列表,然后遍历列表取得自己需要的IP。

import socket

#多网卡情况下,根据前缀获取IP(Windows 下适用)
def GetLocalIPByPrefix(prefix):
localIP = ''
for ip in socket.gethostbyname_ex(socket.gethostname())[2]:
if ip.startswith(prefix):
localIP = ip

return localIP


print(GetLocalIPByPrefix('192.168'))

更简单的方法(不用修改代码,还是用socket.gethostname函数),是通过配置hosts文件改变IP优先级。

上面的方法只支持IPv4,如果要获取IPv6信息,参考socket.getaddrinfo。

1、用系统库获取单机 mac 地址。

import uuid

针对单网卡

1
2
3
4
def GetMAC():
addr = hex(uuid.getnode())[2:].upper()

return '-'.join(addr[i:i+2] for i in range(0, len(addr), 2))

2、用第三方库 psutil 打印网络适配器信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import psutil

# 打印多网卡 mac 和 ip 信息
def PrintNetIfAddr():
dic = psutil.net_if_addrs()
for adapter in dic:
snicList = dic[adapter]
mac = '无 mac 地址'
ipv4 = '无 ipv4 地址'
ipv6 = '无 ipv6 地址'
for snic in snicList:
if snic.family.name in {'AF_LINK', 'AF_PACKET'}:
mac = snic.address
elif snic.family.name == 'AF_INET':
ipv4 = snic.address
elif snic.family.name == 'AF_INET6':
ipv6 = snic.address
print('%s, %s, %s, %s' % (adapter, mac, ipv4, ipv6))

跨平台的根据前缀获取 ip 的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import psutil

# 多网卡情况下,根据前缀获取IP
# 测试可用:Windows、Linux,Python 3.6.x,psutil 5.4.x
# ipv4/ipv6 地址均适用
# 注意如果有多个相同前缀的 ip,只随机返回一个
def GetLocalIPByPrefix(prefix):
localIP = ''
dic = psutil.net_if_addrs()
for adapter in dic:
snicList = dic[adapter]
for snic in snicList:
if not snic.family.name.startswith('AF_INET'):
continue
ip = snic.address
if ip.startswith(prefix):
localIP = ip

return localIP


print(GetLocalIPByPrefix('192.168'))

QT weight开发

1.新建项目

新建项目时选择QT Dialog

2.更换icon

修改.pro文件

将ico文件放到项目目录。

添加 RC_ICONS = myico.ico

3.模态对话框

模态使用 exec 非模态使用 show

4.添加按钮点击事件

添加信号槽即可进行按钮点击事件的编写

5.print函数无法输出

使用 fflush(stdout); 刷新一下数据

搭建CTFD平台

安装Flask

1
pip install Flask

下载安装CTFD

1
2
3
4
5
git clone https://github.com/isislab/CTFd.git
cd CTFd
./prepare.sh #需手动排查各种依赖包
需先安装 libicu-dev包 apt-get install libicu-dev
python serve.py

优化CTFD

1
2
pip install gunicorn
gunicorn --bind 0.0.0.0:8000 -w 4 "CTFd:create_app()"

Docker的基本使用

Docker常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
docker ps   #  docker进程管理系统

-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。

docker run

-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
-m :设置容器使用内存最大值;

docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器

docker kill : 强行关闭一个容器

docker rm :删除一个或多少容器

docker rmi :删除一个或多少镜像

docker images :查看所有镜像


docker save lnmp -o lnmp.tar
docker load -i lnmpp.tar

以上方法用于保存整个docekr

docker export [OPTIONS] CONTAINER # -o :将输入内容写到文件。
docker import my_ubuntu_v3.tar runoob/ubuntu:v4


docker build -t runoob/ubuntu:v1 .

docker tag 打标签

Debian安装docker

1.更新源

1
apt-get update

这里使用的是163的源

2.安装工具

1
apt-get install      apt-transport-https      ca-certificates      curl      gnupg2      software-properties-common

3.下载添加GPG

1
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

4.添加仓库

1
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

5.更新源

1
apt-get update

6.安装docker

1
apt-get install docker-ce

代码审计

代码审计工具: Seay RIPS

php配置常量 含义
PHP_INI_USER 该配置项可在用户的PHP脚本或者windows注册表配置
PHP_INI_PERDIR 该配置项可在php.ini .htaccess 或者 httpd.conf中设置
PHP_INI_SYSTEM 改配置项可在php.ini 或者httpd.conf中设置
PHP_INI_ALL 该配置项可在任何地方配置
php.ini only 该配置项仅可在php.ini中配置

PHP安全配置

PHP 安全配置多达百项,这里只列出和安全相关的配置项。

一、代码审计基础

1. register_globals(全局变量注册开关)

该选项设置为ON的情况下,会直接把GET、POST等方式传递的参数注册为全局变量并初始化为参数对应的值,使得提交的参数可以直接在脚本中使用。

register_globals 在PHP版本小于等于4.2.3版本时设置为PHP_INI_ALL,从PHP5.3.0起都被废弃,不推荐使用,在PHP5.4.0中移除了该选项。

Readme.md

本博客采用hexo+markdown生成、使用git同步博客内容

由于之前写笔记没有写时间的习惯,导致很多笔记的时间已经忘了,后来根据大概时间,给笔记强加了个时间,笔记可能有些混乱,后面的笔记尽量做到按时间线记录。

做笔记的目的主要是因为自己的记性越来越差了。

内容同步

添加网盘功能.

添加项目列表

2018-12-12

1.莫斯密码

对照一下就出来了

2.栅栏密码

用栅栏密码解密,得到flag,栅栏数为2

3.OK

使用OOK在线解密工具即可

4.这不是莫斯

1
2
3
4
5
6
7
+++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.<
++++[ ->+++ +<]>+ +++.< +++[- >---< ]>--- .---- .<+++ ++++[ ->--- ----<
]>--- ----- ----- .<+++ ++++[ ->+++ ++++< ]>+++ ++.<+ +++++ +[->- -----
-<]>. <++++ ++++[ ->+++ +++++ <]>++ .<+++ [->-- -<]>- ----. <++++ +++[-
>---- ---<] >---- ----. +++++ +..++ +++.+ .<+++ [->-- -<]>- --.<+ +++++
+[->+ +++++ +<]>+ ++.++ +.+++ +++++ +.--- -.+++ ++.<+ ++[-> +++<] >++++
++.<

https://www.splitbrain.org/services/ook

brainfuck j加密

5. 简单加密

e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA

凯撒密码,带移位版本,在线工具:

https://tool.bugku.com/jiemi/

6.散乱的密文

lf5{ag024c483549d7fd@@1}
一张纸条上凌乱的写着2 1 6 5 3 4
1.建表

2 1 6 5 3 4
l f 5 { a g
0 2 4 c 4 8
3 5 4 9 d 7
f d @ @ 1 }

f25dl03fa4d1g87}{c9@544@

然后用栅栏密码解密

7.凯撒部长的奖励

凯撒密码

https://tool.bugku.com/jiemi/

8.

bugku 社工

1.密码

根据名字和生日猜

2.信息查找

用googlehack搜索
inurl: www.toutiao.com bugku.cn

3.简单个人信息收集

伪加密。

java -jar ZipCenOp.jar r 1.zip

4.社工

现在已经找不到社工库了。。

5.社工进阶

C语言编写网站目录扫描器实战

最近又开始入门渗透一波,网上有很多基于字典和爬虫的网站目录扫描器。

下载了个wwwscan,玩了几下,发现是一个别人修改过的版本。

渗透工具很多网上传来传去,最后有没有木马都不知道。

我希望能攒出自己的一套工具,顺带提高一下自己的C语言水平。

顺带把这些工具所提供的字典好好的收集一波(攒一下自己的字典)。

至于为什么用C语言是因为C语言写的工具效率会更高些。

php常见漏洞分析

目录绕过技巧

1.若存在字符检测,如strstr函数等,可以使用../http/../来绕过

其中http是strstr所检测字符

  1. ../ 效果等同于 ..//////

正则绕过技巧

在做一个比赛题目,需要绕过preg_match函数。

代码:

1
2
3
4
5
6
7
8
<?php
function is_php($data){
return preg_match('/<\?.*[(`;?>].*/is', $data);
}

if(!is_php($input)) {
// fwrite($f, $input); ...
}

正则匹配进行回溯过程的最大长度限制为100W,因此 构造 数据+ x*1000000可以绕过使正则匹配失效。

修复方法 使用 ===0 来对正则匹配的结果进行判断k


file(“./flag.php”) 读取文件
print_r() 输出变量
GLOBALS 全局变量!
php://filter/read/convert.base64-encode/resource=index.php

base16解题方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import base64
s = "633765666566653461316130643465386535613065366563653165376130653966336261613065366563653165376662623865346238623665346235623162346236623665326233623565316230653662326238623562336533653665336535623262336238623365346230623562336664"
s1 = str(base64.b16decode(s))[2:-1:1]
print(s1)
j = 0
s2 = ""
d = []
i = ''
for i in str(s1):
j = j + 1
s2 = s2 + i
if(j%2==0):
d.append(s2)
s2 = ""

for q in range(1,300):
s = ""
for i in d:
s = s + chr(int(i,16)%q)
if "flag" in s:
print (s)
print(d)