前言:
这篇就拿来自己方便查阅kernel题的一些东西了。
正文:
解包:
1 | mv ../rootfs.cpio rootfs.cpio.gz |
编译exp:
1 | gcc exploit.c -static -o exploit (-masm=intel) |
打包:
1 | find . | cpio -o --format=newc > rootfs.cpio |
ROP:
1 | ROPgadget --binary ./vmlinux > g2 |
提取vmlinux:
1 | ./extract-vmlinux ./bzImage > vmlinux |
gdb调试:
1 | 加上-s或-gdb tcp:port即可 |
添加符号表:
1 | add-symbol-file ****.ko textaddr |
查看printk
信息,关闭dmesg_restrict
:
1 | echo 0 > /proc/sys/kernel/dmesg_restrict |
增加核数、线程等:
1 | -smp 2,cores=2,threads=1 |
还要在虚拟机中打开虚拟化:
还需要在init、start.sh修改一些东西:
1 | 关闭定时关机 |
多线程:
1 | int pthread_create(pthread_t * tid, const pthread_attr_t * attr, void * ( * func) (void * ), void * arg); |
创建线程需要的参数:
- 线程变量名:
pthread_t *
类型,是标示线程的id,一般是无符号整形,这里也可以是引用类型,目的是用于返回创建线程的ID - 线程的属性指针:制定线程的属性,比如线程优先*级,初始栈大小等,通常情况使用的都是指针。
- 创建线程的程序代码:一般是函数指针,进程创建后执行该函数指针只想的函数。
- 程序代码的参数:若线程执行的函数包含由若干个参数,需要将这些参数封装成结构体,并传递给它指针。
结束进程的函数定义如下:
void pthread_exit (void *status);
参数是指针类型,用于存储线程结束后返回状态。
线程等待:
1
2 > int pthread_join (pthread_t tid, void ** status);
>
- 第一个参数表示要等待的进程的id;
- 第二参数表示要等待的进程的返回状态,是个二级指针。
线程创建后怎么执行,新线程和老线程谁先执行这些不是程序来决定,而是由操作系统进行调度的,但是在编程的时候我们常常需要多个线程配合工作,比如在结束某个线程之前,需要等待另外一个线程的处理结果(返回状态等信息),这时候就需要使用线程等待函数,这个函数的定义如下:
参考链接:
- http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/
- https://veritas501.space/2018/06/04/0CTF%20final%20baby%20kernel/
- http://p4nda.top/2018/10/11/ciscn-2017-babydriver/
- http://eternalsakura13.com/2018/03/31/b_core/
- https://whereisk0shl.top/NCSTISC%20Linux%20Kernel%20pwn450%20writeup.html
- http://myhackerworld.top/2019/01/06/%E5%86%85%E6%A0%B8pwn-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/
- https://xz.aliyun.com/t/2306#toc-3
- https://veritas501.space/2018/06/03/kernel%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/
- 文章:https://www.blackhat.com/presentations/bh-usa-03/bh-us-03-cesare.pdf
- kernel pwn资料:http://eternalsakura13.com/2018/03/29/kernel/
- https://ctf-wiki.github.io/ctf-wiki/pwn/linux/kernel/basic_knowledge/