【manjaro】让manjaro虚拟机更好用-sagemath篇
前言sagemath,各位大手子都应该知道吧? 安装过程设置软件源: 1sudo pacman-mirrors -i -c China -m rank 同步数据库:1sudo pacman -Syy 安装软件1sudo pacman -S vim sagemath jupyter-notebook 1sage -n jupyter # 启动jupyter的sage
【BUUCTF】CRYPTO-刷题记录-RSA1
题目信息 解题步骤 题目给出了如下信息: 12345p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 650079570221683462110904235119326153065004384105625293093094966335862501688183284072806602615026469307610935487409984138045488171609777830726811691...
【BUUCTF】CRYPTO-刷题记录-Alice与Bob
题目信息 解题步骤 密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案。 注意:得到的 flag 请包上 flag{} 提交 寻找那对“命中注定”的素数给定的数字是: 198554799767 它看起来很大,但在现代计算面前,不过是小菜一碟。 如果这是 RSA 的模数 $n = p \times q$,那么 $p$ 和 $q$ 都是素数,且通常接近 $\sqrt{N}$。 于是我打开 Python,轻声说道:12345import mathN = 98554799767sqrt_N = int(math.isqrt(N))print(f"√N ≈ {sqrt_N}") 所以,我只需要从 313934 附近开始,向下寻找能整除 N 的素数。1234567p = sqrt_Nwhi...
【BUUCTF】REVERSE-刷题记录-reverse2
题目信息 解题步骤使用DIE分析: 使用IDA分析 12v8 = __readfsqword(0x28u); // Canary,防栈溢出pid = fork(); // 关键!创建子进程 fork() 的行为回顾 fork() 创建一个子进程,复制父进程的内存空间 子进程返回 0 父进程返回子进程 PID 之后两个进程独立运行 所以: 12if (pid) { /* 父进程 */ } else { /* 子进程 */ } flag 字符串到底被谁修改了?看这段代码: 12345678else{ for ( i = 0; i <= strlen(flag); ++i ) { if ( flag[i] == 105 || flag[i] == 114 ) flag[i] = 49; }} 105 → 'i' 114 → 'r' 49 → '1' 所以:子进程把 flag 中的 &#...
【BUUCTF】REVERSE-刷题记录-reverse1
题目信息 解题步骤 编译器为 MSVC 19.00,对应 Visual Studio 2015 或 2017 版本。 使用ida查看: 12345678for ( j = 0; ; ++j ){ v10 = j; if ( j > j_strlen(Str2) ) break; if ( Str2[j] == 111 ) Str2[j] = 48;} Str2 是一个字符串(全局变量或常量) 遍历 Str2,把所有字符 'o'(ASCII 111)替换成 '0'(ASCII 48) 条件是 j > j_strlen(Str2) 才跳出 → 实际是 j <= len 时继续 所以这是一个 字符串预处理:将 Str2 中的 o → 0 Str2 是“正确 flag”的模板,但被混淆了(用 o 代替 0) 12sub_1400111D1("input the flag:");sub_14001128F("%20s", Str1); sub_140...
【BUUCTF】REVERSE-刷题记录-easyre
题目信息 解题步骤先用DIE分析,发现是64位C程序 使用IDA分析: 也就是输入两个相同字符,就可以拿到flag 1flag{this_Is_a_EaSyRe}
【BUUCTF】PWN-刷题记录-ciscn_2019_n_1
题目信息 解题步骤 1234567[*] '/home/kali/Desktop/buuctf/ciscn_2019_n_1' Arch: amd64-64-little → 64位小端程序 RELRO: Partial RELRO → GOT表可写(可被劫持) Stack: No canary found → 无栈保护,可溢出 NX: NX enabled → 栈不可执行(不能直接执行shellcode) PIE: No PIE (0x400000) → 地址固定,无ASLR Stripped: No → 符号表未剥离,函数名可见 用 IDA 打开二进制文件,main 函数非常简单: 关键逻辑在 func(): v1[44]:输入缓冲区,位于 [rbp-0x30] v2:float 类型,位于 [rbp-0x4],初始值 0.0 使用 gets(v1) → ...
【BUUCTF】PWN-刷题记录-warmup_csaw_2016
题目信息 解题步骤 和上一题基本一样 123456789101112int __fastcall main(int a1, char **a2, char **a3){ char s[64]; // [rsp+0h] [rbp-80h] BYREF _BYTE v5[64]; // [rsp+40h] [rbp-40h] BYREF write(1, "-Warm Up-\n", 0xAu); write(1, "WOW:", 4u); sprintf(s, "%p\n", sub_40060D); // sub_40060D中,调用system cat了flag write(1, s, 9u); write(1, ">", 1u); return gets(v5);} 1234int sub_40060D(){ return system("cat flag.txt");} v5 是输入缓冲区:gets(v5),...
【BUUCTF】PWN-刷题记录-rip
题目信息 解题步骤 程序是amd64、小端程序,GOT表在运行时仍然可写,存在GOT覆盖风险,没有栈保护,栈可执行、程序基地址固定 使用ida进行分析: 上述代码中,我们注意: 12char s[15]; // [rsp+1h] [rbp-Fh]gets(s, argv); s 数组大小为 15 字节,位于栈上。 使用了 危险函数 gets():它会无限读取输入直到换行,完全不检查缓冲区边界。 gets(s) 会把你输入的所有字节写到栈上:先写入 s(15字节),接着覆盖 saved rbp(8字节),再覆盖 return address(8字节),后面跟着你继续写的字节都会保存在 return address 之后的栈上(函数返回时 ret 从栈上弹出的就是我们写入的返回地址)。 s 距离 rbp 仅 0xF = 15 字节,而 rbp 上方 8 字节是 返回地址(return address)。 因此,输入超过 15 + 8 = 23 字节 即可覆盖返回地址。 程序还有一个fun函数,调用了system函数,地址为0x401186 程序的system函数,地址为0...
【BUUCTF】PWN-刷题记录-test_your_nc
题目信息 解题步骤 nc 连接后,可以直接执行命令,在此我们执行ls后看到了flag文件 cat flag 即可获得flag














