buu:axb_2019_fmt32(格串)
@TOC
起因之所以记录这个题,是因为我调试了一整天才调试好,一个小小的格串,实在把我卡住了。。。参考:https://www.freesion.com/article/6942500911/ (写的很详细)
分析程序逻辑:循环输入,然后用print输出
思路这里read没有溢出,所以需要修改got表,来执行system函数,先用格串泄露system的地址,在把strlen的got表修改成system的地址,执行strlen,拿到shell
泄露system的地址(这里我是拿的本机的libc调试的,后面发现打不通远程)(ubutun18)
输入aaaabbbb0xffffcc9c:是我们读入数据的地方(也是%1$p)0xffffccb4:是我们要泄露数据的地方不算上面那个0x61的话 中间差了6个字节那么我们就可以这样构造‘a’+p32(read_got)+’%7$p’再次试一下可以看到已经显示出来我们想要的地址了,0xf7e89d60就是我们要泄露的read的实际地址但是前面还有一堆东西,我们可以这么构造,直接读出read_addr求一下libc的基质,发现后三个为0,应该没问题
1 ...
Android 操作系统学习
@TOC
起因最近学习安卓的思想高涨,原因是有个师傅让我帮他看一道安卓题,顺便发了个类似题目的链接https://www.52pojie.cn/thread-1205156-1-1.html我看了直呼内行,加上之前并没有系统的学习过安卓逆向,接下来的一段时间内,我会朝着安卓和iot的方向研究,玩玩新花样
架构Android是谷歌开发的一款基于Linux的开源操作系统,Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。
Power Management当打开手机电源时,引导芯片从固化在ROM里面的代码执行,加载程序到RAM,检查一系列参数
Linux Kernel1启动swapper进程(idle进程)(pid=0),内核的第一个进程,用作初始化进程管理,内存管理等操作2启动kthreadd进程(pid=2),为创建其他进程 ...
西邮校赛 re wp
@TOC
写在前面本次re题一共放了四道,ez_math和ez_code由大二学弟所出,其他的两道是我出的。题目本着简单,有趣,快乐的思想,让大一的新生更友好的接触re这个方向,所以题目都不会太难(大二老油条请划走)
ez_math附件打开是一个c语言源代码 不用任何工具直接分析即可在主函数里有着清晰的逻辑,对flag进行一系列加密后 与已知的字符串作比较,那么我们写解密脚本即可
12345678910111213141516#include<stdio.h>#include<string.h>char a[100]={106, 112, 91, 105, 117, 79, 91, 120, 100, 97, 67, 109, 97, 71, 71, 71, 91, 109, 115, 127};int main(){ for(int i=0;i<20;i++){ a[i]-=1; a[i]-=2; a[i]^=5; a[i]+=1; a[i]-=2; a[i]+=5; } puts(a); ...
第五空间&&长城杯线下
18c641843e597c01c3cc995e4a8f3faaa102222f17c15fe2fa2485624b0417bda735309c84fd6a7dd6c5b37fae53980ecf4d513945c9740717e54e74164a3fff0eb676d10507efaa38ad9500f8ccbef41388ac9b40bbbe6bf412609f8e68c50a24e4390a681d676d41eca181de24f4c2c11f50bbdbac80a0fdef5ea9cad673fb3262af18a638bc83d4c053175fd28420e48df741527959c7d8e61b7f9a5e684e6a06ca14c940e9dcd4b9c987fa7ae5eb17e5adad73981fa1d8a0b3b67dd47cfdbae6c962d4cc2b13004b139709e0117781e0442e9dcc864e5448c3826cbe4af85fe0e16a4735f7dbcfe1760218d0adde4dd3f19c2c6d48082 ...
花指令
@TOC
前言花指令都是在比赛中经常碰见,已经属于老掉牙的东西了,现在回过头来总结总结,一定会有不一样的收获
花指令花指令是一种静态混淆的手段,在我们静态分析时,会出现各种ida f5报错的问题,并且代码看起来十分混乱,无论是对于ida这种递归下降扫描,还是od那种线性扫描都会起到一定的阻碍的效果。但不管怎么样,代码运行起来的时候,总会无差错的执行。
常见花指令1 最常见的花指令就是在代码中 插入了E9这个机器码,E9 在汇编中对应着jmp指令,当ida读到E9时,会默认把后面四个字节作为地址,如果前面的代码里刚好有jmp之类的跳转指令跳到这里就会发生错误类似的还有 E8 (call指令),也会把后面四个作为地址来使用
这种花指令的去除,就是把报错的地址 d 变成数据,把无用的数据nop掉,剩下的 c重新汇编就行
2 不管怎么都跳的指令这种就直接把中间的没有的数据全部nop
3 call ret花指令
中间插入的垃圾数据会直接跳过这种要分析其流程 patch掉合适的内容
4 栈帧出错的问题
代码有时候 会把rsp乱加减一个大数,就会出现栈帧报错的问题,类似这种直接nop掉即可,其他的情 ...
2021 绿城杯 re wp
@TOC
这次绿城杯又被大师傅带飞了,我又明明白白的躺了一次,比赛一共3个re +一个安卓我只做了两个,其他被师傅们秒了
easy_re(二血)ida打开 发现是rc4算法里面有一点小改变 中间异或了0x37
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<stdio.h>#include<stdlib.h>#include<string.h>int b[300];int s[300];char key[10]="tallmewhy";//(变) char data[1000]={ 0xF5, 0x8C, 0x8D, 0xE4, 0x9F, 0xA5, 0x28, 0x65, 0x30, 0xF4, 0xEB, 0xD3, 0x24, 0xA9, 0x91, 0x1A, 0x6F, 0xD4, 0x6A, 0xD7, 0x0B, 0x8D, 0xE8, 0xB8, ...
羊城杯re总结
@TOC这次的羊城杯出的题挺好的,对于我的学习还是有很大的帮助,赛后也是把6个题都复现了一遍,除了oddcode留下了一个问题外,其他的都跟着过了一遍,这里不写wp了,简单复述一下,并记录学到的知识点
smc这个题虽然说做出来了,但是用的时间比较长,smc不算是难点,但是我在对于base64的算法分析上花费了点时间,被程序那么长的代码误解了
deltx这个就是个数学题,用自己的指令实现了乘法和减法,静态分析会比较困难,通过构造简单的输入,动调后,就可以知道程序在干什么
android我不是很会做安卓,没学过java,jeb的调试和hook当时也没搞出来(后面再去学习)这个题还算是比较简单,就用jeb硬分析就行,多看看java代码就熟悉了
Babyvm典型的vm题,我做这种题做的少,不过套路都是一样的,对着代码一个一个字节的过,还是比较考研耐心的,下次比赛出了多尝试尝试
SafeBox这个题之前在mrctf的时候见过一次,这次又出现了,一模一样,调试器代码里有smc,用idaoython还原代码,之后分析就行,主要的是学习了这个双进程保护,我对着文档还是过了一遍,收获还挺大(api多)
...
羊城杯&网刃杯 re wp
@TOC
ResmcSmc动调即可,找到加密函数,恢复栈帧,即可看到加密函数,变异的base64
12345678910111213141516171819202122232425262728293031323334353637#include<stdio.h>#include<string.h>unsigned char a[100]={"H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4"};unsigned char s[100]={ 0xE4, 0xC4, 0xE7, 0xC7, 0xE6, 0xC6, 0xE1, 0xC1, 0xE0, 0xC0, 0xE3, 0xC3, 0xE2, 0xC2, 0xED, 0xCD, 0xEC, 0xCC, 0xEF, 0xCF, 0xEE, 0xCE, 0xE9, 0xC9, 0xE8, 0xC8, 0xEB, 0xCB, 0xEA, 0xCA, 0xF5, 0xD5, ...
学习《加密与解密》中密码部分遗留的问题
@TOC
前言 最近在看加密与解密的密码章节的时候,暴露出了自己以前遗留的密码学问题,再加上平常ctf中,涉及密码部分的题很多,就下定决心好好的把自己不会的恶补一下。于是,我就硬着头皮好好的去学习,学完发现,自己头皮还真硬
遗留问题
crc32定义数据通信领域中最常用的一种差错校验码
原理
例子
疑问上面这些就是crc算法的原理,还是很好理解的,下面的内容才是我头皮硬的内容通过学习 我又出现了以下的疑问1什么是查表法 如何实现2 crc的几个组成部分(多项式公式、多项式简记式、数据宽度、初始值、结果异或值、输入值反转、输出值反转、参数模型)怎么参与运算
解决第一个问题:在了解查表法之前,先学会直接计算法是如何在代码中实现的
这其中的核心原理就是利用了xor的交换律,使数据处理起来更加方便
123456789101112131415161718192021222324252627Const PLAY = &H1021& '这里生成项(实际上就是CRC-CCITT),注意这里默认首位1是去掉的Const TEXT = "123456789 ...
2021祥云杯 re wp
@TOC
Rev_Dizzy这个题是比赛里最简单的一道题,也是我唯一做出来的题(菜),本来开始想着用angr能直接跑出来,后来怎么也调试不好,所以就用了笨办法,结果一下就出来了。。
用ida打开后,可以在主函数明显看到逻辑输入32位的字符,通过4000多行加密,最后与已知的字符串比较
题目很简单,只需要把4000多行加密代码逆序就行,异或不变,加变成减,减变成加,用已知字符串作为输入,就可以解密此过程(代码不贴了,太长了)
勒索病毒比赛时这个题做出来的人也挺多,当时脑子尽想这从rsa下手,误了自己同时这个也使用了好多crypto api,查资料查的脑子疼
前面这段我猜时获取路径和文件信息,没有什么用这块用了这个api进行加密,然后释放这块就是核心加密的部分,大概就是,把sub_b77290里的字符串md5加密,再和时间戳混合起来(里面有移位操作)作为密钥,把密钥进行sha256加密,作为aes的key这块获取pbData也可以通过调试的方式,拿到数据
这块唯一不确定的就是时间戳,我看了好多脚本用的是爆破的手法,其实看加密文件的属性,直接获取他的时间戳然后写脚本获取
1234567891 ...