3k words
翻到以前的笔记,整理一下 堆 使用动态分配的内存 多线程与Arena 维护多个堆 chunk的结构 Bin的结构 内存分配流程 内存释放流程 堆 elf中的堆和算法提到的堆不是一个东西,elf中提到的堆是被分配到的一块内存区域,和栈的区别主要是在于堆内存是动态分配的。也就是说,程序可以从heap段请求一块内存,或者释放一块内存 堆内存是全局的,即在程序的任意位置都可以访问堆,并不一定是要在malloc那个函数里访问,因为C语言使用指针指向动态分配的内存。但相比访问栈上的静态局部变量,使用指针也会带来一定的开销 (从低地址 $$\rightarrow$$ 高地址) 使用动态分配的内存 GLibc采用ptmalloc2内存分配器管理堆内存,增加了对多线程的支持 mmap 用于创建私有的匿名映射段,主要是为了分配一块新的内存,且这块内存只有调用mmap的进程可以使用,所以为私有的,与之相反的操作是munmap(),删除一块内存区域上的映射 多线程与Arena 每个线程要维护一些独立的数据结构,并且对这些数据结构的访问是需要加锁的。在ptmalloc2中,每个线程拥有自己...
1k words
今天看到一道题,checksec的时候会检测出Canary,但是实际上栈上并没有canary的值,故还是可以栈溢,好奇怎么实现的 起初我是采用__attribute__((noreturn)),这个是GCC的一个属性,用于告诉编译器该函数不会返回到调用者,可以帮助编译器进行优化,并消除用于函数缺少返回语句而可能产生的警告 void __attribute__((noreturn)) __stack_chk_fail_local(void) { } 我想着将__stack_chk_fail_local函数重定义为空,但是这样编译时会出错 (.text+0x0): multiple definition of `__stack_chk_fail_local'; /tmp/ccZi1uB3.o:test.c:(.text+0x0): first defined here collect2: error: ld returned 1 exit status 于是我想着编译时--wrap来对__stack_chk_fail_local函数进行替换 gcc -s...
2k words
Analyse 文件分析 exe程序,可以通过exeinfo对其架构进行查看 可以看到程序为64位,检测出存在UPX加壳 解题 1. 脱壳 存在UPX加壳,尝试使用UPX脱壳工具,但是均未果 这道题采用了一些技巧防止直接脱壳,也是一个可以学习的知识点,具体可以看参考链接 使用010editor打开Re2.exe,观察发现 这里需要对UPX加壳后的数据特征有一定的了解。UPX在加壳时,会修改文件的结构,以便在运行时动态地解压原始的代码和数据。为实现这一点,UPX会在加壳后的文件中添加一些新的段。 UPX0:这个段包含了被压缩的原始数据,在文件中,这个段的大小通常是0,因为它只是一个占位符,当程序运行时,这个段会被解压到内存中 UPX1:这个段包含了被压缩的原始代码。和UPX0一样,它在文件中的大小也可能是0,但在程序运行时,这个段会被压到内存中 UPX2:(如果存在的话)这个段包含了UPX的解压缩代码。当加了壳的程序启动时,这段代码首先会被执行,以解压UPX0,UPX1的数据和代码 所以这里UPX脱壳失败的原因应该是将区段名UPX0,UPX1修改成了FUK0,F...
5.1k words
Handmake Analyse 1. 查看文件类型 m1sceden4@DESKTOP-H37I3CV:/reverse/Handmake$ file challenge challenge: ASCII text, with CRLF line terminators 发现是文本文件,cat一下 可以看到这是go代码,篇幅很长,共有15w行之多。将文件后缀改为.go,通过任意编辑器打开文件 2. 分析文件内容 这段go代码定义了很多很多函数,在不知道题目意思的情况下,大概可以感觉这些函数应该是起到混淆和加大逆向难度的作用 找到main函数,代码如下: func main() { var nFAzj, CuSkl string jjxXf := []byte{ 37, 73, 151, 135, 65, 58, 241, 90, 33, 86, 71, 41, 102, 241, 213, 234, 67, 144, 139, 20, ...
Uncategorized
4.9k words
Analyze from Crypto.Util.number import * from secret import flag def encrypt1(n): n1 = hex(n>>200).encode() n2 = str(hex(n))[20:].encode() return n1,n2 def encrypt2(m , n_1): c_1 = pow(m,e_1,n_1) print('c_1 = '+str(c_1)) def encrypt3(m , n_2): c_2 = pow( m , e_2 , n_2) print('c_2 = '+str(c_2)) def encrypt4(m): k = getPrime(512) m = m % k c_3 = pow(m, e_2, n_3) print('c_3 = ' + str(c_3)) print('m = ' + str(m)) print('k = ' + str(k)) ...
Uncategorized
7.3k words
概述 1.两种信息流:数据信息流,控制信息流$\left { \begin{aligned} 指令信息\状态信息\时序信息 \end{aligned} \right.$ 2.五个部件:运算器,存储器,控制器,输入设备,输出设备 3.冯诺依曼体系结构计算机的特点: 硬件由五大部分组成运算器,控制器,存储器,输入设备,输出设备 软件以二进制表示 采用存储程序 所有的程序预先存放在存储器中 指令采用串行执行的方式 4.计算机系统的层次结构 graph BT; 数学模型,算法应用程序 --> 作为软件资源的应用程序 --> 语言处理程序 --> 操作系统级 --> 机器语言(指令系统) --> 微程序控制器,硬连逻辑部件 5.机器语言,汇编语言,高级语言 机器语言:二进制代码表示的机器语言,最底层,机器直接执行 汇编语言:一种需要助记符表示的与机器语言一一对应的语言,需要汇编后才能执行 高级语言:接近人类语言,与计算机结构无关,需要经过解释和编译 6.编译程序与解释程序最大区别在于:前者生成目标代码,后者不生成 7.汇编程序即汇编写的程序,与编译程序,...
Uncategorized
4.5k words
1.linux文件权限一共10位长度 第一段指文件类型 第二段指拥有者所具有的权限 第三段指所属组的成员对于这个文件具有的权限 第四段指其他人对于这个文件有没有任何权限 2.shell是一种命令解释程序 3.>将标准输出信息写入一个新文件(重定向),>>将标准输出信息添加到一个已存在的文件中 4.ctrl+alt+F1:图形界面切换到文字终端界面 5.whereis -b [filename]:查找系统中指定文件名的二进制文件 6.free显示系统中已用资源和空闲资源,m参数以mb为单位显示系统中的资源,t显示系统中的资源并最后进行统计 7.关闭linux的命令: halt:立刻关机 shutdown -h now:立刻关机(root) poweroff:立刻关机 8.less显示文件内容时可以上下滚动而more不可以 9./proc/cpuinfo获得CPU的相关信息 10.grub可以引导windows操作系统.grub是引导装入器,负责装入内核并引导Linux系统,也可以引导其他操作系统.如果引导器不能很好的工作或者不具有弹性,那么很可...