2025UTCTF Re-Wp
Ostrich Algorithm还可以在汇编里面把call exit nop掉,直接动调到最后可以拿到md5值 Safe Word逻辑上可能有点不好理解,我们先理一下逻辑。 下面是main函数和一个sub_11e9()和sub_11fc(arg1),使用了BN反编译。 main函数开头使用了一个mmap函数分配了一块可以用于执行的内存,也就是说data_16020中的内容可以被作为代码执行。我们的输入被放入了rax_2中。并且还初始化了一个值var_20=0x5b。然后以我们的输入和var_30计算出索引获取rax_5中的值,作为参数传入sub_11fc()中,在上面分析sub_11fc()函数其实就是把rax_5的值作为了函数(代码)执行。既然是作为指令执行。那么这肯定就是是汇编的字节码,这四字节数据是一段汇编代码,被sub_11fc()执行,并把返回值赋给var_20用作下一次索引的计算。依次遍历完我们的输入。 12for i in range(32): var_20 = f( rax5[ (input[i] + var_20 << 8) <...
DOS程序逆向学习
Dos常用命令参考 123456789101112131415161718dir #查看目录cd #切换目录d: #切换盘符到dmd #新建目录rmdir #删除目录rmdir /s #删除非空目录xcopy /e [source] [destination] #复制文件move [sourcr] [destination] #移动文件ren [oldname] [newname] #重命名type nul>[name].xxx #创建空文件echo [content]>[filename] #新建非空文件echo [content]>>[filname] #追加文件内容type [filename] #查看文件del [filename] #删除文件start /d "[path]"[exename] #启动程序explorer #打开文件管理器ipconfig #查看ip地址mount c [filepath] #挂载文件夹到c盘 编译并运行程序参考 1.下载Turboc2,并创建目录,用mount挂载 2.创建.c文件放到挂载...
2025TPCTF部分Re-wp+复现
linuxpdfpdf里运行Linux,010打开发现有一个base64解密函数,一些文件名以及文件对应的base64编码,通过正则匹配 ”文件名”: “文件内容“ 获取文件名和文件内容,直接用脚本导出。随便拿个文件看看信息,发现是zlib格式的压缩文件,用python的zlib库解压就行,查看解压出来有许多二进制文件,有一百多个有点不好看,于是寻找看是不是有elf可执行文件,写个函数遍历一下(脚本是AI写的)。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125import osimport reimp...
2025GHCTF Re-wp+复现
ASM?Signin!读汇编就行,可以用AI辅助。 要注意的是下面这里的数据 12345678910111213141516ENC PROC PUSH CX MOV SI,OFFSET BUFFER1 + 2 MOV DI,OFFSET DATA1 MOV CX,8LOOP2: MOV AX,WORD PTR[DI + 1] ;读取的是双字WORD,所以AX应该是di[2]和di[1]组成的2字节数据 XOR WORD PTR[SI],AX ;这里也是读取的si[1] 和si[0]的2字节数据 MOV AX,WORD PTR[DI + 2] ;di[2]和di[3]同上 XOR WORD PTR[SI + 2],AX ;si[2]和si[3]同上 ADD SI,4 ADD DI,4 LOOP LOOP2 POP CX RETENC ENDP 就一个异或加密,异或回来就行。 大概逻辑和解密脚本 123456789101112131415161718192021222324252627282930313...
2025TRXCTF Re-Wp+复现
sudo kurl https//spacewar游戏的逻辑是在一个25×25的区域内填写数字。 在play()函数中,首先会对我们的每次输入用isValid()进行检查。 isValid(),函数首先会初始化一个bool向量的表(存储0,1的数组),然后获取board中的值判断是不是0。如果不是0那么获取这个值作为下标获取bool向量中的值判断是不是1,如果是1返回0,如果不是1,把值修改为1。继续进行判断。其实就是判断broad中某一特定的位置的元素是否已经存在。它的检查顺序是,先检查行,再检查列,最后分5x5的块进行检查。 那么逻辑就是检查行,列,块中是否有重复的数字。如果没有返回1,有的话返回0; checkWin()检查了broad中是否有元素为0 ,如果没有0且isValid()检查也正确就赢得游戏。 很明显这就是一个数独游戏。查看broad的交叉引用就可以看到初始值在__static_initialization_and_destruction_0()中。拿下来用z3解。 解完后判断哪些值是要我们要输入的,用pwndbg把值输入,程序输出flag...
2025n1CTF Re-wp+复现
5mcvirtureprotect动态修改函数,用ida动态调试,给输入的数据下硬件断点运行分析就可以发现正确的逻辑。 但是不能反汇编,选中按c恢复成汇编代码。 直接读汇编写出加密代码,注意一下细节,每次循环左移的值都是不一样的,以防万一还是每次加密都细看了一下。一共有四种加密方法,四种加密循环进行一共十六次加密,顺序大概是box()–>index()–>shift(stat==0)–>shift(stat==1)–>……。直接写出逆向函数就行,密文就在比对的位置。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111...
2025VNCTF Re-wp+复现
hook_fish运行应用提示输入一串字符并要求联网。 jadx分析,发现在main中,在点击按钮后会调用encrypt()方法对我们输入的数据加密,然后调用fish()方法下载了一个“hook_fish.dex”文件。通过下面的registerReceiver方法创注册了一个广播接收器,只要收到系统下载完成的广播时,就会调用onReceive()方法。 12registerReceiver(this.downloadCompleteReceiver, new IntentFilter("android.intent.action.DOWNLOAD_COMPLETE")); 在onReceive()方法中把加密后的的输入传入了MainActivity.this.loadClass();,加载下载来的.dex文件并反射调用了encode(input0);对输入再次加密,最后调用check()方法检查结果。然后删除本地的“hook_fish.dex”文件。 我们先hook file.delete()方法,在删除前转移出dex文件(脚本1); 在savedDexF...
IDA的一些用法笔记
常用快捷键11、切换文本视图与图表视图 空格键 2、返回上一个操作地址 ESC 3、搜索地址和符号 G 4、对符号进行重命名 N 5、常规注释 冒号键 6、可重复注释 分号键 7、添加标签 Alt+M 8、查看标签 Ctrl+M 9、查看段的信息 Ctrl+S 10、查看交叉应用 X 11、查看伪代码 F5 12、搜索文本 Alt+T 13、搜索十六进 Alt+B 2a:将数据转换为字符串 f5:一键反汇编 esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口) shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置 ctrl+w:保存ida数据库 ctrl+s:选择某个数据段,直接进行跳转 ctrl+鼠标滚轮:能够调节流程视图的大小 r:把大数转为字符串 x:对着某个函数、变量按该快捷键,可以查看它的交叉引用 g:直接跳转到某个地址 n:更改变量的名称 y:更改变量的类型 / :在反编译后伪代码的界面中写下注释 \在反编译后伪代码的界面中隐藏/显...
Cython逆向初步学习
我们只进行一些总结,基础理解我参考了这篇文章 Cython编写系统环境:windows,python编译器pycharm(python虚拟环境.venv),c/c++编译器visual stdio 2022 1.在python中安装cython和setuptools包建议给Cython单独开一个python虚拟环境,有时候包多了导入pyd会报错。 pycharm可以直接使用包管理器搜索安装。 12pip install cythonpip install setuptools 2.安装c\c++编译器我这里用的是visual stdio,也可以用MinGW。 3.编写cython拓展可以参考用户指南 - 《Cython 3.0 中文文档》 - 书栈网 · BookStack 随意编写一个source.py作为拓展模块,代码如下 123456789def sayhello(): a = "hello world" print(a) cdef int add(int n,int m): return m+ndef aadd(n,...
python常用机器码助记符总结
由于内容太多一下信息由AI辅助整理。 模块操作 IMPORT_NAME: 导入模块或名称。 IMPORT_FROM: 从模块中加载特定的名称。 IMPORT_STAR: 从模块中导入所有名称。 加载和存储操作 LOAD_CONST(consti): 将常量 co_consts[consti] 推入栈顶。 LOAD_NAME(namei): 将名称 co_names[namei] 对应的值推入栈顶。 LOAD_FAST(var_num): 将局部变量 co_varnames[var_num] 推入栈顶。 STORE_NAME(namei): 将栈顶的值存储到名称 co_names[namei]。 STORE_FAST(var_num): 将栈顶的值存储到局部变量 co_varnames[var_num]。 算术操作1. 数学运算这些操作码用于执行基本的数学运算,操作数从栈顶弹出,结果推入栈顶。 BINARY_ADD:弹出栈顶两个元素,执行加法运算(TOS = TOS1 + TOS),结果推入栈顶。示例:a + b BINARY_SUBTRACT:弹出栈顶两个元素,执行减法运...
