编写评测过程零碎知识点

1.lua gettable pushstring

先pushstring压住键值 此时栈中有键值和table
然后gettable(L , -2)从table中获取值并覆盖掉键值放入栈中
之后从-1的栈顶获取值进行操作pop

2.seccomp

seccomp限制fork不会影响到execve

3.linux内核

我看的博客

1.关于fork

fork()用于创建子进程
fork()的返回值有以下三种:

a)在父进程中,fork() 返回新创建子进程的 PID;

b)在子进程中,fork() 返回0;

c)如果 fork() 调用出错,则返回负值

2.关于wait

wait是进程相关,当父进程调用wait后会立刻阻塞自己,子进程中如果有结束的就收集子进程的消息并销毁,没有就将阻塞在这
四种wait wait() waitpid() wait3() wait4()

wait()会等待所有子进程的消息
waitpid(pid_t,*status,options)

pid_t<-1 等待进程组ID等于|pid|的子进程
pid_t=-1 等待任何子进程
pid=0 等待当前进程的任何子进程
pid>0 等待任何子进程ID为pid的子进程

options:
image

waitpid() 返回值

a) 正常返回时,waitpid()返回子进程pid

b) 调用出错返回-1

c) 设置了WNOHANG的情况下如果没有结束的进程会返回0

wait3()wait4()
image

3.phread_

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine) (void *),
                   void *arg);

创建线程

4.dup2

参考的博客
用于输入输出的重定向
image
例如原本有printf("%d",i);
应当输出到终端里
我们将STDOUT_FILENO指向文件,那将输出重定向到文件里了
newfd原本是终端,执行dup2后终端输出关闭,并且将oldfd的fd赋值给了newfd使得输出到了文件中

5.execve

execve我弄的不是很清,我遇到的问题是相当多的
execve 会保留setuid之后的uid
第一个参数传可执行文件或python/java的解释器路径
第二个参数,传一个以空字符结尾的字符指针数组的指针,以NULL结尾,按照惯例,第一个元素应该是执行程序的名称
第三个参数,环境变量
比如运行python类型文件:

argv[]={"python","./helloworld.py",NULL};//解释器路径的名称+参数
execve("/usr/bin/python3",argv,envp);

运行c的二进制文件

argv[]={"helloword",NULL};//可执行文件的名称,这里直接传NULL也行
execve("./helloworld",argv,envp);//

运行会直接覆盖掉原进程,然后若运行失败会有返回值-1

posted @ 2022-09-23 13:07  znsbc  阅读(8)  评论(0)    收藏  举报