2024羊城杯你这主函数保真么
0x00 前言构造函数当主逻辑,第一次见
0x01 解无壳,直接拖IDA
搜main可以发现有两个main,一个是_main还有一个是___main
查引用发现___main在_main之前调用
两个函数都没什么东西
_main
___main
不过发现___main有一个跳转,进去之后可以看到有个函数指针
动调发现这个是从下往上调用的
调试,直到有flag字样的函数出现,步入,发现调用了读起来像是构造和析构函数的东西,
继续跟进,发现两个test对象
一个个看,test是主逻辑,读字符串并进行长度判断,由此可知flag长度为0x21
再看test2,发现是个ROT13,应该直接调的库,没有魔改
之后继续跟进,发现在___tcf3内还有东西
这里面是Test2类的析构函数,而析构函数里面调用了输入在ROT13操作后的结果
之后可以看到一个encrypt函数
进去发现又是一段加密,用到了一些三角函数,经查询这是DCT变换
之后发现加密的结果丢到了这个变量_encrypted里面
既然Test2类的析构函数有搞事情,那么Test估计也有
这边F5一下可以看到清 ...
2024羊城杯docCrack
0x00 前言宏病毒,主要用到oletools和vbs调试相关的知识
0x01 解.docm文件,宏病毒,打开看看
宏病毒用的是VBA语言,且project加了密,只能dump出来看
用oletools对其进行提取
1olevba protected_secret.docm --decode
解码出来挺多东西的,不过重点是这个
很长一段,就不复制出来这里了
新建一个word,ALT+F11把代码丢进去分析
首先是对输入的每一字节都异或一个7,异或后将这个值存入Result
搜索Result变量,得到其被放入了一个temp.exe进行操作
开调,调试至这里可以找到batPath(这边结果应该是在同目录),同时可以看到同目录下有个temp1
之后再运行到这,可以看到同目录下有个temp.bat
将其都复制一份然后用010看看,会发现bat文件没什么用,就是用来将Result放入一个exe运行
不过提供了一个思路,要对temp1文件进行两次base64解密
解密出来之后丢入IDA
发现主要逻辑就是向左移6位,因此密文向右移6位就行
其中密文就是v7,可以通过在赋值后面下 ...
2024羊城杯pic
0x00 前言go语言,最好上IDA8.3,没删的话可以恢复符号
0x01 解无壳,直接上IDA
一进来就看到isDebuggerPresent
直接改为jmp
对于golang来说,调试经常会飞出去,因此要多用F4(Run to cursor)
在接受输入的地方下个断点,运行发现这边检查了长度是否为5
重新调试,输入5字节后走到这,发现调用了一个NewCipher函数,在go里面就是获取了一个Cipher对象,之后又去读了flag.png
继续向下走,发现有个循环异或
将输入的第二位和png的内容进行逐字节异或
之后又是一个循环
一步步进行分析,发现是进行了如下操作
这实际上是魔改的RC4算法,最后多了个异或0x11,rdx的值随着密钥的改变而改变
执行完这个循环可以发现写文件去了
输入要求一共五位,由于png头固定,因此直接爆就行
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import itertoolsimpor ...
2024羊城杯sedRust_happyVM
0x00 前言rust的题,主打一个看不懂,全部交由动调,动调功底要求很高
0x01 解无壳,直接上IDA
查找字符串,
交叉索引一下去到函数sub_40B2E0
由于是rust,反编译就不看了,直接看汇编,来到input的地方
往下走可以发现两个cmp
一个个试,先输入小于7的,然后再输入大于0x15的,会发现小于7的直接call了个HeapFree,因此输入要大于0x15
继续向下走,又一个CMP,注意这里rdi存储的是输入的长度(十六进制),发现小于0x47是正确的
继续向下,由于下面有SIMD指令,因此打开xmm寄存器窗口便于观察
之后一直向下走,发现在这里又进行了一次对比
从上图可以发现在最后还对比了一个0x7D(即})
因此合理推断flag长度为0x28(40)个字符
重新进行调试,经过一些HeapAlloc之类的初始化(不过这个Alloc之后没几步就Free了,不知道在干啥)
一直往下走,发现只有这里才开始取输入内容
取了三个字节到三个不同的寄存器
r13d的内容丢到这里面了
edi的内容在这
r14d的内容在这
最后还要进行一次与运算 ...
安卓逆向学习之路——动态调试
0x01 smail的动态调试使用的apk来自正己第四课的教程demo:教程demo
参考正己的《安卓逆向这档事》第五课操作:《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩
教程使用mt管理器对xml文件进行更改,但很多时候该用电脑还得用电脑,所以这边提供电脑的操作
以下两种方法更改apk中的AndroidManifest.xml使其可被调试:1.JEB使用JEB进行电脑上的操作:https://www.pnfsoftware.com/jeb/manual/android-debugging/#generating-debuggable-apk
首先将apk转换为可动态调试的版本
1jeb_wincon.bat -c --makeapkdebug -- file.apk
之后对apk进行签名
1apksigner.bat sign -ks %USERPROFILE%\.android\debug.keystore --ks-pass pass:android file_debuggable.apk
这个debug.keystore需要先用An ...
2024CISCNandroidso_re
0x00 前言Native层逆向,主动调一下就可以了
0x01 解先进jadax看看
MainActivity的判断逻辑如下:
其中legal函数如下:
123private boolean legal(String paramString) { return paramString.length() == 38 && paramString.startsWith("flag{") && paramString.charAt(paramString.length() - 1) == '}' && !inspect.inspect(paramString.substring(5, paramString.length() - 1));}
可以知道flag总长为38bytes,会对flag{和}做判断,中间部分看inspect类的inspect函数
跟进去看
用到了java里面的crypto库,使用DES加密,模式是CBC, ...
2024春秋杯网络安全联赛夏季赛HardSignin
0x00 前言一般难度比较低的比赛呢
就不要去想VMP了(
VPM都是纸老虎
查壳能看到不少消息
善用工具(
0x01 解先查壳,发现VMP,但是工具给的是UPX
实际对比一下真有VMP的,可以发现还是不同的
所以按UPX处理,这里用010editor之类的二进制编辑软件把VPM全部改为UPX
之后就可以愉快脱壳了
然后拖IDA会发现main函数惨不忍睹
去Exports窗口可以发现有四个TlsCallback函数
发现除了TlsCallBlack_3全部都是爆红的
查看发现有花
在loop处按d,然后将E2这条指令nop掉,然后在函数开头按p就可以解析了
解密main,算SMC(好臭的srand)
之后看TlsCallback_1
发现也有花
这里在call处按d,然后将00401135(不包含)到00401130(包含)都给nop掉就行了
有base64的影子了(srand:哼哼,啊啊啊啊)
之后是TlsCallback_2,同样有花
这边是004011F1按d,然后将004011F1到004011ED都给nop掉
没看太懂
先复原main看看吧,用idap ...
2024春秋杯网络安全联赛夏季赛snack
0x00 前言以后不做分析了,怪怪的,不如写感想
借这题学习下的pyinstaller打包的程序的逆向流程
借这题把pyinstaller的逆向流程搞清楚来,记得2024国赛初赛也有一题是python相关的,不过是cython,那个难度就高很多了
0x01 解拿到是一个exe
运行发现是一个贪吃蛇游戏(谁家贪吃蛇按前进方向的反方向键会直接判定转头然后秒了自己的????)
没去掉命令行窗口,可以看到有个pygame,可以确定是个python的程序
查壳,发现是pyinstaller
使用pyinstxtractor进行提取
PyInstaller Extractor is a Python script to extract the contents of a PyInstaller generated executable file.
1python pyinstxtractor.py snake.exe
然后使用网站进行反编译:https://www.lddgo.net/string/pyc-compile-decompile
当然也可以直接使用pycdc
1./pycdc ...
2024春秋杯网络安全联赛夏季赛BEDTEA
0x00 分析两个反调+魔改TEA
总体流程不难
0x01 解无壳,直接拖IDA
发现main里面有个经典的检测调试器的函数IsDebuggerPresent
Tab查看汇编
这边patch直接将判断条件改为IsDebuggerPresent < 2即可
即将cmp eax, 1改为cmp eax, 2即可
之后再看看其他
发现调用了两次chrono::system_clock::now()这里使用的是一种反调试,具体原理可以看这个:RDTSC时钟检测反调试
也就是说在这两个之间如果做了中断行为,则if的结果就会不同,可以在这里下断点进行测试,尝试在call _ZNSt6chrono3_V212system_clock3nowEv之前下断点和不下断点观察结果
这边就不测试了(懒)
总之正常的结果应该走右边,即不使用mov rax, 22002200220022h所在的这块
这边改jle为jmp就行
之后apply patch就可以愉快调试了
patch之后断在try again上面的判断,一般来说这里存的就是密文了
执行两次,输入两个不同的值,发现v8的值都不变, ...
2023年春秋杯网络安全联赛冬季赛file_encryptor
0x00 分析此题比较综合,涉及到了TLS回调函数反调试、SEH异常处理、花指令
总的来说很是有意思
0x01 解无壳,上IDA直接爆红
反调肯定有的,应该还有异常处理
tab看一下,发现有try...except...结构
这就涉及到“异常”这个东西了
关于异常可以看这个:windows-SEH详解
关于SEH在IDA中的表现可以看这个:C++异常处理
这个处理的方法还算简单,就是将整个try包裹的结构nop掉之后改掉jcc的跳转位置,使其强制跳转就行
不过在此之前,先看看TLSCallback函数吧
关于TLS回调函数:TLS回调函数的学习
TLS回调函数是指,每当创建/终止线程时会自动调用执行的函数(创建进程的主线程时也会自动调用回调函数,且回调函数的执行顺序是先于EP代码的执行,所以TLS回调函数的这个特性通常被用于反调试技术)由于是创建和终止线程时都会调用,所以在程序从打开到结束这个TLS回调函数会被执行两次。
在本题中,这个TlsCallback函数是反调试之一
整个流程大概是这样的:
检测是否有调试器的存在,如果有则exit,否则执行一个异常,然后交由 ...