盒子
盒子
文章目录
  1. 前言:
  2. 正文:
  3. 参考链接:

Kernel_Pwn_Knowledge

前言:

这篇就拿来自己方便查阅kernel题的一些东西了。

正文:

解包:

1
2
3
mv ../rootfs.cpio rootfs.cpio.gz
gunzip ./rootfs.cpio.gz
cpio -idmv < rootfs.cpio

编译exp:

1
gcc exploit.c -static -o exploit   (-masm=intel)

打包:

1
find . | cpio -o --format=newc > rootfs.cpio

ROP:

1
2
3
ROPgadget --binary ./vmlinux > g2

ropper --file ./vmlinux --nocolor > g1

提取vmlinux:

1
./extract-vmlinux ./bzImage > vmlinux

gdb调试:

1
加上-s或-gdb tcp:port即可

添加符号表:

1
2
3
4
5
add-symbol-file ****.ko textaddr
# textaddr可以在qemu中这么查看
cat /proc/module

cat /sys/modules/core/section/.text

查看printk信息,关闭dmesg_restrict

1
echo 0 > /proc/sys/kernel/dmesg_restrict

增加核数、线程等:

1
-smp 2,cores=2,threads=1

还要在虚拟机中打开虚拟化:

2018-03-30-172405

还需要在init、start.sh修改一些东西:

1
2
关闭定时关机
增大指定内存,从64mb到128mb等

多线程:

1
2
int pthread_create(pthread_t * tid, const pthread_attr_t * attr, void * ( * func) (void * ), void * arg);
其返回值是一个整数,若创建进程成功返回0,否则,返回其他错误代码,也是正整数。

创建线程需要的参数:

  • 线程变量名:pthread_t *类型,是标示线程的id,一般是无符号整形,这里也可以是引用类型,目的是用于返回创建线程的ID
  • 线程的属性指针:制定线程的属性,比如线程优先*级初始栈大小等,通常情况使用的都是指针。
  • 创建线程的程序代码:一般是函数指针,进程创建后执行该函数指针只想的函数。
  • 程序代码的参数:若线程执行的函数包含由若干个参数,需要将这些参数封装成结构体,并传递给它指针。

结束进程的函数定义如下:

void pthread_exit (void *status);
参数是指针类型,用于存储线程结束后返回状态。

线程等待:

1
2
> int pthread_join (pthread_t tid, void ** status);
>
  • 第一个参数表示要等待的进程的id;
  • 第二参数表示要等待的进程的返回状态,是个二级指针。

线程创建后怎么执行,新线程和老线程谁先执行这些不是程序来决定,而是由操作系统进行调度的,但是在编程的时候我们常常需要多个线程配合工作,比如在结束某个线程之前,需要等待另外一个线程的处理结果(返回状态等信息),这时候就需要使用线程等待函数,这个函数的定义如下:

参考链接:

支持一下
扫一扫,支持v1nke
  • 微信扫一扫
  • 支付宝扫一扫