avatar
文章
49
标签
19
分类
9

主页
归档
标签
分类
H4wk1ns's blog
搜索
主页
归档
标签
分类

H4wk1ns's blog

数位dp
发表于2021-09-11|算法|算法•编程
前言 之前刷其他的题目的时候,看到过数位dp解法,但是太菜了,根本看不懂! 今天刷leetcode的每日一题时,题目虽然用了别的方法做出来,但是太丑了,非常多的判断。在看别人的解析的时候,突然看到数位DP模板级解法,一下突然懂了。 特别记录一下这个瞬间,自己又进步了一点。🚩 数位dp 首先,我们正式的(不讲人话)的介绍一下数位dp算法 数位dp算法是用来解决如下问题的算法求出在给定区间[A,B]内,符合条件f(i)的数$i$的个数。条件f(i)一般与数的大小无关,而与数的组成有关 这就是一般的数位dp算法的介绍,然后后面就直接跟例题和代码了,大家都是谜语人么? 这里我再介绍一下数位dp的一种通用解法,从而更好的理解这个优美的算法 数位dp通用解法 一方面,由于前面介绍的条件f(i)与数大小无关,而仅仅与数的组成有关,因此数位dp需要通过动态规划的方法,预处理出一个dp[i][j]的数组,dp[i][j]表示长度为i,最高位为j的符合条件f(num)的个数 另一方面,数位dp更多的可以理解为一种根据其数的组成的遍历顺序——该遍历顺序可以让我们有效的结合动态规划解决 ...
巧妙的爆破
发表于2021-09-10|ctf|信息安全•ctf
前言 有一说一,题目漏洞很简单,看明白wp后整个题目也不难。但是这个爆破一开始着实没什么思路,特别记录并且总结一下。 实例 timu 点击附件链接 保护分析 首先查看一下程序相关的保护机制 基本上除了栈不可执行以外,就没有开启什么保护机制 漏洞分析 这道题目的逻辑结构格外的简单,如下所示 12345678910111213141516171819202122232425262728293031323334353637383940int __cdecl read_num(void *buf, size_t nbytes){ ssize_t v3; // [esp+8h] [ebp-10h] ssize_t i; // [esp+Ch] [ebp-Ch] v3 = read(0, buf, nbytes); for ( i = 0; i < v3; ++i ) { if ( (*((char *)buf + i) <= 0x2F || *((char *)buf + i) > 0x39) && *((_ ...
malloc_consolidate和unlink
发表于2021-09-08|ctf|信息安全•ctf
前言 做题过程中遇见的一道堆风水,一开始确实完全没想到思路。借此机会复习一下malloc_consolidate和unlink攻击相关的知识点 难点malloc_consolidate 实际上,在菜单堆中,我个人还是比较少见利用malloc_consolidate的,或者纯粹是我太菜,基本在考虑时下意识的忽略掉这么一个过程,这里特别拉出来研究一下。 源代码 要想分析清楚malloc_consolidate函数的逻辑,自然需要查看其源代码信息,这里给出glibc2.31版本下的malloc_consolidate函数源代码,如下所示 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102/* ------------------------- ...
操作系统-设计与实现-五
发表于2021-09-07|手写|手写•操作系统
前言 这几节课加深了对于操作系统的某些方面的了解,下面简单介绍一下进程抽象的相关问题,并实现课程中的M3实验 进程抽象fork系统调用 之前我们一直将进程当作一个状态机。那么如果我们想要创建一个新的进程,也就是创建一个新的状态机即可。 在Linux中,操作系统提供了fork系统调用,其会将当前的进程,即当前的状态机(包括内存和寄存器),完整的复制一份,从而创建了新的进程。 具体的,可以根据man 2 fork,查看接口信息,如下所示 123456789#include <unistd.h>/*On success, the PID of the child process is returned in the parent, and 0 isreturned in the child. On failure, -1 is returned in the parent, no childprocess is created, and errno is set to indicate the error.*/pid_t fork(void); for ...
tcache中的double free
发表于2021-09-03|ctf|信息安全•ctf
前言 第一次参加组内月赛,借这个机会正好熟悉一下glibc2.31下的tcache攻击的相关套路 难点 相比较前面,tcache增加了如下代码,检查可能的double free123456789101112131415161718192021222324252627282930313233#if USE_TCACHE { size_t tc_idx = csize2tidx (size); if (tcache != NULL && tc_idx < mp_.tcache_bins) { /* Check to see if it's already in the tcache. */ tcache_entry *e = (tcache_entry *) chunk2mem (p); /* This test succeeds on double free. However, we don't 100% trust it (it also matches random payload d ...
操作系统-设计与实现-四
发表于2021-08-10|手写|手写•操作系统
前言 jyy老师太强了。这一章介绍一下并发控制中互斥相关的内容,并实现课程中的L1实验 互斥 实现共享内存上的互斥,并不是一个非常简单的事情: 系统不能同时读/写共享内存(除了原子指令),即load时不能写,只能单纯的读;而写的时候,无法进行读(即使类似于addq $1, [sum]这种指令,其也是分为读值、计算和写值三部分)。从而当一个线程完成状态读取和状态设置时,其实这两者之间可能状态已经发生了变化(另一个线程完成了状态读取和状态设置) 系统可能乱序执行指令。可能有些精妙的算法可以规避1.中的问题,例如Peterson算法。但是现代操作系统可能的指令乱序执行(即可能在读之前完成写),也会导致互斥的失败 可以看到,单纯的从软件上实现共享内存的互斥是非常困难的一件事情,因此这就往往需要硬件上进行协调配合! 硬件可以通过诸如锁总线的方式,原子的实现load-exec-store指令,从而为我们实现共享内存上的互斥提供了有效的解决方法。 这些原子指令,完美的解决了上面的两个难点,因此很容易就实现共享内存的互斥。这些方案往往简洁,且很好理解,如下面基于xchg的自选锁实现的共 ...
1…6789
avatar
H4wk1ns
coder && ctfer
文章
49
标签
19
分类
9
Follow Me
最新文章
中断简介2025-01-22
热迁移简介2024-12-17
libvirt基础知识2024-12-04
glib的事件循环2024-11-07
virtio简介2024-08-23
分类
  • ctf5
  • 信息安全2
  • 内核6
  • 手写23
  • 杂谈1
  • 算法1
  • 编程1
  • 虚拟化8
标签
linux内核手写设置杂谈信息安全ctf虚拟化libvirt系统启动qemunodejshexo操作系统算法编程c++编译原理网络
归档
  • 一月 20251
  • 十二月 20242
  • 十一月 20241
  • 八月 20242
  • 七月 20242
  • 四月 20242
  • 九月 20231
  • 八月 20231
网站资讯
文章数目 :
49
本站访客数 :
本站总访问量 :
©2021 - 2026 By H4wk1ns
come to hack me!!
本地搜索