路由器建站 是不是听起来很魔幻 对于一个老白嫖怪,能免费建一个24小时在线的博客简直是福音 不管你是不是白嫖怪,能省去服务器的费用,拿出来也能淦一些有 意 义的事情吧 本教程纯小白应该可以看懂吧,毕竟我自己都是个小白

移植新设备到kupfer/Porting a new device to kupferbootstrap 准备工作 首先你要拥有: linux环境(wsl也可以) python环境(用于安装kupferbootstrap) 安卓设备 安装kupferbootstrap 参考https://kupfer.gitlab.io/kupferbootstrap/main/install/ Install Python 3, Docker, and git. On Arch: pacman -S python docker git --needed --noconfirm Hint After installing Docker you will have to add your user to the docker group: sudo usermod -aG docker "$(whoami)" Then restart your desktop session for the new group to take effect. Pick which Kupferbootstr

上海市赛初赛 两个简单题拿了三血,还摸了两题Misc,最开始比赛没沉下心还是浪费了一些时间,感觉应该能更好的。近期来打的比较爽的一次比赛。 两题逆向都0解,后面也没深究了...感觉不如Misc Reverse exEXE 这边一个beingdebugged反调试,nop lpAddress里面一个rc4 sub_401535是base64,所以就是RC4+base64,直接cyberchef解密就行 encrytor 大致流程:获取固定的DateTime 16574669,然后获取当前时间,并转换成10进制的Dword数组,获取分钟和秒钟相乘,将获得的数转换为字符串,然后经过SHA256加密,得到的值作为RC4的key对flag.txt进行加密,输出到flag.txt.enc中 关键函数: 出题时间可以通过文件修改时间查看 考虑到程序运行时间,最后取的是33*41=1353 rc4解密即可 flag在哪? 保存了一些函数的地址,重命名一下 动调到这里 进去p一下,下面call的analyse有问题,nop掉然后看汇编即可 可以看到是有一个表,然后nop掉的位置是

CTF 6 天前

Angr学习 上次面山石的时候,对面的师傅让我跟随这个angr_ctf的项目来学一学,那来试试看 配置安装Angr 首先得先装上Angr吧,先根据Angr官方文档上面的指引:https://docs.angr.io/introductory-errata/install *nix系列的系统均可以这样安装 sudo apt-get install python3-dev libffi-dev build-essential virtualenvwrapper mkvirtualenv --python=$(which python3) angr && pip install angr 有的系统的Virtualenv的路径有些奇怪,可以在apt安装完之后加一句 source `which virtualenvwrapper.sh` 拉取angr_ctf仓库 使用git拉取 git clone https://github.com/jakespringer/angr_ctf.git 根据readme可以知道,使用package.py可以直接打包所有题目,我们在刚刚的vir

17 天前

题解报告 脱壳 首先,程序加了一个VMP3.0.0-VMP3.5.0的壳,要对程序进行脱壳,我选用的是断点在CreateToolhelp32Snapshot这个api的后几位,程序到达这里之后再对vmp0段下内存执行断点。 再次f9即可到达oep。 程序执行流分析1 程序oep被虚拟化保护了,因此想要静态分析依然很困难,可以通过x64dbg的dump工具dump出来,可以看到一些敏感字符,由于程序被虚拟化保护了,我们只能通过这些数据的地址来定位函数地址。 首先对下方的error信息进行信息收集,可以很快的发现这个错误出自远程线程注入的代码中。那么其实可以知道程序中其实是带有一个远程线程注入的功能的。而对程序的进程信息进行分析,可以了解到程序将DLL注入到了taskmgr.exe和explorer.exe中,并且会反复的对程序进行重启。 杀死进程思路 通过以上的分析,可以得到该程序进程守护的原理,那么想要杀死进程则可以通过一个简单的方法即在杀死程序进程的同时一起杀死taskmgr.exe和explorer.exe。 示例代码 #include <stdio.h> #in

04-23

DLL注入 通过DLL注入可以对其他进程进行hook/热补丁/修复BUG,同时也是渗透其他进程的有效方法。 DLL被加载到进程后会自动运行DIIMain()函数,用户可以把想执行的代码放到DIIMain()函数,每当加载DLL时,添加的代码就会自然而然得到执行。利用该特性可修复程序Bug,或向程序添加新功能。 本篇博客将使用Inline Hook和DLL注入技术实现控制程序执行流 DLL注入流程 使用MS编译dll动态链接库后,可以通过一些常见的方式进行DLL的注入: 创建远程线程(CreateRemoteThread() API) 使用注册表(AppInit_DLLs值) 消息勾取(SetWindowsHookEx() API) 通过这些方法编写注入程序,然后对写有Inline Hook逻辑的DLL程序进行加载并且注入进目标进程 代码编写 DLL编写 DLL加载到进程后会运行DllMain()函数,通过这个特点,我们可以修改上一篇博客中的Inline Hook代码为如下代码 其中,DllMain()参数中的ul_reason_for_call与之前TLS_Callback学习

inline hook 主要思想: 1、构造跳转指令。 2、在内存中找到欲HOOK函数地址,并保存欲HOOK位置处的原本字节。 3、将构造的跳转指令写入需HOOK的位置处。 4、当被HOOK位置被执行时会转到我们的流程执行。 5、如果要执行原来的流程,那么恢复HOOK,也就是还原被修改的字节。 6、执行函数原来的流程。 hook方式 这部分其实参考了网上很多文章,自己感觉这些文章光写文字还是缺少一些对比,所以自己思考然后patch出来一些代码,自己理解与展示的更方便 1、call跳转后修改系统函数 众所周知,ms的库函数是从一条MOV EDI, EDI指令开始的,这是因为在运行时,如果需要一个填充字节,则会填充一条NOP指令,如果需要两个字节来填充,则会填充一条MOV EDI, EDI指令。 这样当hook时就有了五个字节给我们进行操作,可以对MessageBoxW的前五个字节(固定的mov edi,edi push ebp mov ebp,esp)进行修改,将其替换为一个五字节的近距离地址跳转的jmp指令跳转到我们自行构造的函数中。 至于修改字节,有几种方式,《加密与解密》中

03-09

TLS_Callback TLS_Callback(Thread-local storage,线程本地存储)是WindowsAPI下的一个回调函数,它会在程序进程开始,结束以及线程开始,结束的时候调用。 MSDN地址 TLS在逆向中 TLS_Callback在逆向中有一个特点: 先于main函数执行/在main结束后执行。因此也经常被用作反调试,或者是藏匿变量修改,以防止动态和静态分析。 代码实现 参考此处 #include <stdio.h> #include <Windows.h> #ifdef _WIN64 #pragma comment (linker, "/INCLUDE:_tls_used") #pragma comment (linker, "/INCLUDE:thread_callback_base") #else #pragma comment (linker, "/INCLUDE:__tls_used") #pragma comment (linker, "/INCLUDE:_thread_callback_base") #endif v

03-08

Reverse HelloWorld 看图片注释写的很明白,直接分析程序逻辑就行, 题目先生成了个随机数,然后给了个字母表,题目要求输出HelloWorld,观察到最后cout是输出这个output的内容,output也是程序开始random随机出来的内容 观察到程序对output进行了修改,分析可以分析出来每轮循环读入2字节的数据,提取第一个字节的高4bit和低4bit,这里直接方便看改成了hibyte和lowbyte(自己能理解是什么就行) 高位作为下面进入各个分支的条件,低位作为控制output的下标。 每轮的第二个字节只在赋值区域被用到,作为字符表的索引。 构造输入即可 print('0'+chr(7)+'1'+chr(4)+'2'+chr(11)+'3'+chr(11)+'4'+chr(14)+'5'+chr(22)+'6'+chr(14)+'7'+chr(17)+'8'+chr(11)+'9'+chr(3)+chr(0x10)+chr(1)+chr(0x15)+chr(1)+chr(0x4A)+chr(1)) #'0'字符为0x30,高4bit为3进入了赋值的if分支,

01-10

babyre 程序替换了dex,新的dex可以在手机数据目录/data/user/0/com.me.crackme下找到 easyre key是伪随机,动调拿出来即可 懒得改代码了,脚本的v值我是手动替换拼起来结果的。 #include <stdio.h> #include <stdint.h> /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */ void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9; for (i=0; i < num_rounds; i++) { v0 += (((v1 << 4) ^ (v1 >> 5

01-09

Win API逆向 反调试, Python字节码 ,OLLVM rc4 换表base64 贪玩ctf TlsCallback_0有个Isdebuggerpresent反调试 直接nop就行 这边messagebox有个小技巧,把中文显示出来,选这个直接显示中文 非常的方便 通过中文定位到关键代码发现有个加密 往下翻可以看到可疑加密函数 进入后可以发现频繁调用sbox进行加密操作 并且有两个sbox 猜测为aes 实际动调后发现256字节的两个sbox 回到前面先把account解出来 acc = [0x04, 0x1F, 0x1F, 0x1E, 0x43, 0x4B, 0x43, 0x45, 0x44, 0x00, 0x16, 0x10, 0x55, 0x17, 0x12, 0x73] for i in range(len(acc)-1): acc[i] ^= acc[15] print(chr(acc[i]), end='') print(chr(acc[15]), end='') #wllm08067sec&das 然后拿到

CTF 2022-10-31