自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(798)
  • 收藏
  • 关注

原创 x86汇编逆向分析基础

但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。如果“1”的个数为偶数,则PF的值为1,否则其值为0。CPU的指令系统中也有专门的指令来改变标志位IF的值。

2022-11-14 13:31:37 642

原创 Windows保护模式(八)TLB&控制寄存器

这是因为 Cr3 刷新前,0 地址第一次被val1访问时,线性地址与物理地址的对应关系被写入了 TLB 中,因此在对 val2 赋值时,TLB 的记录没有被刷新,访问的还是原来的物理页。在上一实验代码的基础上使用 INVLPG 指令刷新 0 地址对于的 TLB 数据,结果在 PLT 的 G 位置 1 的情况下依然能刷新。当CPU访问某个无效页面时,会产生缺页异常,此时,CPU会将引起异常的线性地址存放在CR2中。当CPU访问某个无效页面时,会产生缺页异常,此时,CPU会将引起异常的线性地址存放在CR2中。

2022-10-20 00:18:27 791

原创 Windows保护模式(七)2-9-9-12分页

当RET执行返回的时候,如果把堆栈里面的数据指向一段提前准备好的数据,那么就会产生任意代码执行的后果。相对于 10-10-12 分页,2-9-9-12分页增大了 PDE,PTE 等结构的长度,使其描述的地址范围更大(64G),并且增加了 PTPTT一级,使得页表内不需要存储 CR3 的值,增加安全性。2-9-9-12 的线性地址到物理地址转换过程与 10-10-12 分页相似,只不过多了一层 PDPTE。当XD=1时,软件产生了溢出也没有关系,即使EIP蹦到了危险的“数据区”,也是不可以执行的。

2022-10-19 21:37:35 1218

原创 Windows保护模式(六)10-10-12分页

判断 PDE 中的 PS 位是否为 1 ,如果 PS 为 1 则 PDE 直接指向一个 4MB 大小的物理页的基址,直接将线性地址的低 22 位加上该物理页的基址即可得到物理地址。字节,因此可以将线性地址划分为 10bit ,10bit ,12bit 三部分,前两部分按照 4 字节寻址,后一部分按照 1 字节寻址,这样便可以通过 10-10-12 分页将线性地址转换为物理地址。代码如下,调用门提权后判断 0 地址对应 PDE 和 PTE 是否有效,若无效则将 buf 对应结构的内容写入。

2022-10-18 00:32:19 1462

原创 Windows保护模式(五)任务段&任务门

call 加载 TSS 的指令格式为call 16位TSS段选择子:无效EIP,因此可以在 GDT 中构造一个段选择子然后指向自己构造的 TSS 然后 call 过去。利用 call 指令进行 TSS 加载时会将 EFLAGS 寄存器中的 NT 位置 1 ,表示中断嵌套,根据 NT 位是否为 1,iretd 返回时会选择根据 Previous Task Link 选择 TSS 还是根据堆栈返回。如果在切换任务函数中使用了int 3断点会将 NT 位置 0 导致返回时根据堆栈返回触发蓝屏。

2022-10-16 00:07:25 1573

原创 Windows保护模式(四)中断门&陷阱门

继续运行代码,成功在 test 函数断下来,并且完成提权,栈结构也与前面描述的相符。中断门和调用门堆栈变化的不同点是多压了一个 EFLAGS 标志寄存器,因此返回使用的是 iretd 而不是 retf。指令会平衡堆栈,而中断门没有参数,因此会造成堆栈不平衡。在 IDT 表 0x100 偏移处构造一个中断门,对应中断号为 0x20。在 IDT 表 0x100 偏移处构造一个陷阱门,对应中断号为 0x20。Windows 系统没有使用调用门,但使用了中断门。中断门执行时,会将IF标志位清零,但陷阱门不会。

2022-10-12 13:15:18 661

原创 Windows保护模式(三)长调用与短调用&调用门

跨段调用时,一旦有权限切换,就会切换堆栈CS的权限一旦改变,SS的权限也要随着改变,CS与SS的等级必须一样如果不是一致代码段或者利用 TSS ,JMP FAR 只能同级跳转,但CALL FAR可以通过调用门提权,提升CPL的权限RETF,IRETD 只能在同级跳转,或者只能降低权限SS 与 ESP 的值来自与 TSS 段RETF 指令根据 CS 指向的段描述符是否为们以及是否提权来确定调用时是压入的 4 个值还是 2 个值。

2022-10-11 01:31:29 1084

原创 Windows保护模式(二)代码跨段跳转

一致代码段(共享的段)特权级高的程序不允许访问特权级低的数据:核心态不允许访问用户态的数据特权级低的程序可以访问到特权级高的数据,但特权级不会改变:用户态还是用户态非一致代码段(普通代码段)只允许同级访问绝对禁止不同级别的访问:核心态不是用户态,用户态也不是核心态直接对代码段进行JMP 或者 CALL的操作,无论目标是一致代码段还是非一致代码段,CPL都不会发生改变.如果要提升CPL的权限,只能通过调用门。

2022-10-09 23:05:50 361

原创 Windows保护模式(一)段寄存器&GDT表

段式内存管理是将内存划分成若干段,处理器在访问一个内存单元时通过“段基址+偏移”的方式计算出实际的物理地址。在Intel x86处理器中,有专门的段寄存器,指定每条指令在访问内存时指定在哪个段上进行,以及该段的长度,读写属性,特权级别等。段式内存管理与页式内存管理关系如下图。Windows采用了页式内存管理方案,在Intel x86处理器上,Windows不使用段来管理虚拟内存,但是,Intel x86处理器在访问内存时必须要通过段描述符,这意味着Windows将所有的段描述符都构造成了从基地址0开始

2022-10-08 20:58:57 2476

原创 2022 年实验班选拔试题(正式赛)

邀请码:chouxiaogong。

2022-10-07 01:39:06 1090

原创 linux 堆利用基础知识

ptmalloc2 是目前 Linux 标准发行版中使用的堆分配器。malloc 函数返回对应大小字节的内存块的指针。此外,该函数还对一些异常情况进行了处理:用以扩展 chunk,相邻 chunk 闲置且空间充足则会进行合并,否则会重新分配 chunk。即通过 realloc 我们可以完成对一个 chunk 的 free,也就是说在特殊情况下 realloc 是可以当作 free 使用的,其中,在size 为 0 的情况下,realloc 函数会调用 free 释放该 chunk。该函数在分配时会清空 ch

2022-07-13 20:23:01 3644 1

原创 在 PyCharm 中写 IDAPython 脚本

IDA版本为7.6,python版本为3.8,PyCharm版本信息如下图。IDA 自带的 IDE 是在是反人类,基本相当于 txt 写代码。这里提供一个可以在 PyCharm 上使用智能补全功能编写 IDAPython 脚本的方法。

2022-06-27 23:23:00 1823 5

原创 ollvm 学习笔记

环境配置编译 ollvm先将 GitHub 上的 ollvm 下载下来。git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git创建文件夹,作为编译 ollvm 的目录。mkdir ollvmcd ollvm加载 ollvm 项目。cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ~/obfuscator然后编译项目。make -j

2022-04-28 00:13:32 4394 1

原创 angr 学习笔记

附件,参考1,参考2符号执行原理基本概念即初始参数用变量代替,模拟程序执行过程,维护执行到各个位置时的状态(用各个变量之间的代数关系表示)。符号状态(Symbolic State)当前状态所有参数的集合,用 σσσ 表示。集合中的每个元素用表示初始参数的变量表示。路径约束(Path Constraint)到达当前路径需要表示初始参数满足的关系,通常用 PC 表示。例如下面的程序:#include <bits/stdc++.h>using namespace std;

2022-04-26 10:53:25 1667

原创 pintool

基本介绍pin 是 Intel 开发的一个动态二进制插桩工具,提供了丰富的 API 接口,可以监控一些程序运行状态,也可以模拟一些现有处理器不支持的指令。pintool 是指经过 pin 框架开发后的工具,可以用来完成具体的程序分析和仿真验证。对于逆向题目,如果 flag 的正确前缀长度与执行指令数量呈正相关,可以借助统计执行指令数量的 Pintool 进行逐字符爆破。环境搭建linux首先在官网上下载 pin 。将下载好我文件解压。pin-/source/tools/ 的目录下提供了很多已经

2022-04-22 11:39:17 2989

原创 Midnight Sun CTF 2022 pwnhub

漏洞分析主要有如下功能:┍━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ │ ---------- menu ---------- │▒│ ┌────────────────────────┐ │▒│ │ 1) read │ │▒│ │ 2) leak │ │▒│ │ 3) alloc │ │▒│ │ 4) quit │ │▒│ └───────────────

2022-04-07 14:53:37 2931

原创 linux IO_FILE 利用

基本结构_IO_FILE_plus定义如下:struct _IO_FILE_plus{ FILE file; const struct _IO_jump_t *vtable;};包括一个结构体 file 和一个指针 vtable 。其中 vtable 指向一个函数指针表,很多 IO_FILE 的攻击都是围绕它展开的。_IO_FILE_plus 类型的结构有 _IO_2_1_stdin_ 、 _IO_2_1_stdout_ 和 _IO_2_1_stderr_ 。另外有头指针 _IO_

2022-03-29 16:17:32 41843 2

原创 Codeforces Round #779 (Div. 2)

A.Marin and Photoshoot对于任意 222 个 0 之间要保证有至少 222 个 1 。#include <bits/stdc++.h>using namespace std;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n; cin &gt

2022-03-28 14:58:12 415

原创 2022虎符 mva

程序分析main 函数经典虚拟机__int64 __fastcall main(__int64 a1, char **a2, char **a3){ __int16 f; // [rsp+1Ah] [rbp-246h] __int16 is_run; // [rsp+1Ch] [rbp-244h] unsigned __int16 t; // [rsp+20h] [rbp-240h] unsigned int op; // [rsp+24h] [rbp-23Ch] int nex

2022-03-24 01:24:56 4361 2

原创 2022 虎符 babygame

分析主程序:首先执行 game 函数,返回结果大于 0 则执行 vul 函数。__int64 __fastcall main(__int64 a1, char **a2, char **a3){ char buf[256]; // [rsp+0h] [rbp-120h] BYREF unsigned int v5; // [rsp+100h] [rbp-20h] int suc; // [rsp+104h] [rbp-1Ch] unsigned __int64 v7; // [rsp+

2022-03-22 11:10:40 805 2

原创 2022虎符 the_shellcode

ida attach 到进程上,然后把数据改为代码形式然后 F5 反汇编。主体逻辑如下:int __usercall sub_1711BF@<eax>(int a1@<edi>, int a2@<esi>){ unsigned int v3; // ebx _DWORD *v4; // eax _DWORD *v5; // edi unsigned int v6; // esi unsigned int i; // ecx signed i

2022-03-21 23:28:15 1320 3

原创 UTCTF2022 Failed Hash Function

#!/usr/bin/env python3import sys, osdef trailing(x): a = 0 for _ in range(15): if x & 1: break x >>= 1 a += 1 return adef print_hash(s): for x in s: for y in s: print(he

2022-03-16 09:22:16 229

原创 UTCTF2022 Sunset

import randomimport hashlibN = 111MOD = 10**9+7def get_secret_key(): key = [] for i in range(1, N): x = random.randrange(1,10) key += [i] * x random.shuffle(key) return keydef compute_arr(arr, sk): for x in sk:

2022-03-16 09:13:40 278

原创 SUSCTF2022 tttree

首先将 0x140010074 ,0x140017EFA ,140018C67 起始处的数据转换为汇编。观察汇编,发现很多代码块之间相互跳转,因此先按照 retn 划分代码块。代码块中存在大量类似 push rcx;pop rcx 的无用操作,将其去除后继续分析。def simplify_asms(asms): left_asms = [] for asm in asms: if asm.startswith("pop") and len(left_asms)

2022-03-12 19:02:39 2694

原创 SUSCTF Ez_Pager_Tiper

data中是部分解密的文件,文件名是一个日期的base64加密。经过对比发现这个日期就是文件内容开头的日期。因此也就确定了加密文件前 244 比特的明文内容(包括日期后面的\r\n)。经过分析可知 confusion 函数可以做如下化简:def bit_count(self, x): res = 0 while x: if x & 1: res += 1 x >>= 1 return resdef confusion(se

2022-03-03 14:45:07 586

原创 SUSCTF rain

分析代码mainvoid __fastcall __noreturn main(__int64 a1, char **a2, char **a3){ int num; // [rsp+14h] [rbp-Ch] int *info; // [rsp+18h] [rbp-8h] sub_401D2F(a1, a2, a3); while ( 1 ) { info = init_info(); while ( 1 ) { while ( 1 )

2022-03-03 02:29:18 769

原创 SUSCTF happytree

分析代码main函数void __fastcall __noreturn main(__int64 a1, char **a2, char **a3){ __int64 v3; // rax int num; // [rsp+0h] [rbp-10h] BYREF unsigned int data; // [rsp+4h] [rbp-Ch] unsigned __int64 v6; // [rsp+8h] [rbp-8h] v6 = __readfsqword(0x28u);

2022-03-02 01:27:57 294

原创 linux 堆利用

堆利用Unlink假设正常情况下,每申请一个 chunk 会保存一个指向该 chunk 内存块的指针。在 chunk1 中构造 fake chunk ,需要注意:为了绕过if (__builtin_expect(FD->bk != P || BK->fd != P, 0)) malloc_printerr(check_action, "corrupted double-linked list", P, AV);令:fake

2022-02-18 14:47:09 5200 1

原创 linux 格式化字符串漏洞

格式化字符串漏洞格式化字符串介绍常见格式化字符串函数函数基本介绍printf输出到stdoutfprintf输出到指定FILE流vprintf根据参数列表格式化输出到stdoutvfprintf根据参数列表格式化输出到FILE流sprintf输出到字符串snprintf输出指定字节数到字符串vsprintf根据参数列表格式化输出到字符串vsnprintf根据参数列表格式化输出指定字节到字符串常用格式化字符串形式%[p

2022-02-04 20:08:21 2204

原创 linux 栈溢出

栈基础知识栈结构函数调用过程32位为例:KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲& \text{push a…函数参数传递32位程序普通函数传参:参数基本都压在栈上(有寄存器传参的情况,可查阅相关资料)。syscall传参:eax对应系统调用号,ebx、ecx、edx、esi、edi、ebp分别对应前六个参数多余的参数压在栈上。64位程序:普

2022-02-01 20:57:34 4028

原创 [MRCTF2020]VirtualTree

主程序int __cdecl main(int argc, const char **argv, const char **envp){ int i; // [esp+8h] [ebp-24h] char *v5; // [esp+14h] [ebp-18h] BYREF __int64 v6; // [esp+18h] [ebp-14h] int v7; // [esp+20h] [ebp-Ch] char v8; // [esp+24h] [ebp-8h] __int16 v

2022-01-27 17:03:24 901

原创 [MRCTF2020]Shit

main函数int __cdecl main(int argc, const char **argv, const char **envp){ int v3; // eax int v4; // eax char v5; // al int v6; // eax int v7; // eax int v8; // eax char v10[52]; // [esp+4h] [ebp-38h] BYREF v3 = sub_401890(); std::ostream

2022-01-18 01:30:20 936

原创 SM4加密算法

其中参数flag为true是解密,false是加密。ECB模式struct SM4 { typedef unsigned int ui;#define Rotl(_x, _y)((_x)<<(_y)|(_x)>>(32-(_y)))#define SboxTrans(_A) (Sbox[(_A)>>24&0xFF]<<24|Sbox[(_A)>>16&0xFF]<<16|Sbox[(_A)>>

2022-01-09 19:02:50 4507

原创 TEA,XTEA,XXTEA

#include<bits/stdc++.h>using namespace std;struct TEA { typedef unsigned int ui; const ui delta = 0x9E3779B9; inline void encryptData(vector<ui> &v, vector<ui> k) { assert(v.size() % 2 == 0); while (k.

2022-01-08 11:14:31 568

原创 [网鼎杯 2020 青龙组]singal

主程序现将byte_403040中的内容复制到v4,然后再调用vm_operad函数检验输入。int __cdecl main(int argc, const char **argv, const char **envp){ int v4[117]; // [esp+18h] [ebp-1D4h] BYREF __main(); qmemcpy(v4, byte_403040, 456u); vm_operad(v4, 114); puts("good,The answer for

2022-01-07 10:19:11 2281

原创 [GUET-CTF2019]number_game 1

由于flag可能的数量为 510<1075^{10}<10^7510<107 且单次判断复杂度很小,因此可以直接爆破flag。#include<bits/stdc++.h>using namespace std;char a14[26] = "14#2330#1#0#23##3##042##1";int dword_601080;#define pr(x) cout<<#x<<": "<<x<<endltypedef

2022-01-07 10:01:09 811

原创 Base64,Base58

#include<bits/stdc++.h>using namespace std;struct Base64 { string table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; string encode(string s) { string res; int n = (int) s.size(); s.push_ba

2022-01-04 16:49:42 351

原创 2021CCPC湘潭邀请赛

B.Binary Number记 S(x)S(x)S(x) 为将 xxx 变成 000 的操作步数。贪心考虑,如果可以直接通过将 111 右移得到 yyy ,则采取该操作最优,此时操作数为 S(x)−S(y)S(x)-S(y)S(x)−S(y) 。如果对于某个位置,xxx 左边的 111 数量小于 yyy 左边 111 的数量,则 xxx 不能直接通过移动 111 到达 yyy ,此时需要通过减 111 操作增加 111 的个数。显然根据贪心原则,从高到低位,如果 111 能通过移动匹配就直接匹配,这

2021-11-19 21:37:18 701

原创 2021CCPC广州 H. Three Integers

题目链接You are given three non-negative integers aaa, bbb, and ccc. Find three positive integers xxx, yyy, and zzz that satisfy x mod y=ax\bmod y=axmody=a, y mod z=by\bmod z=bymodz=b, and z mod x=cz\bmod x=czmodx=c.InputThe first line contains an integer t

2021-11-17 01:03:08 2184 4

原创 仙人掌图生成

#include<bits/stdc++.h>using namespace std;mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());const int N = 2e5 + 10;int n = 5, m = n - 1;int a[N], b[N], top[N], fa[N];int head[N], ver[N << 1], Next[N << 1], tot;b

2021-11-12 10:36:11 461

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除