UKFC逆向入门文档二
Last Update:
逆向很依赖汇编的功底,所以平时要多研究研究汇编。
逆向题没有办法说系统学习,如果真要系统性的学习的话,那就是整个计算机领域的知识了,所以我们在初学的时候,就是以做题为主(BUU,NSS),遇到什么学什么,有足够的题量之后自然就入门了
BUUCTF [ACTF新生赛2020]easyre
ida的分析风格
初始ida分析结果:
1 |
|
v6是一个char类型的数组,他的大小很明显不可能是5,应该是17(6+11),而ida分析错误,分析为了5个char加3个int,(5*1+3 *4也是17),所以我们可以手动更改一下v6的大小,按y键,将大小改为17即可,更改后效果如下:
1 |
|
这个时候v7,8,9就消失了,成为了v6数组内的一部分,更好看
再说一下这个部分:
1 |
|
v5可以看到上面的定义为int类型,而在下面的if条件中,左边是v4数组,是char类型的,右边是v5,它本身是int类型的,并且调用他的方法是v5+i,即数组首元素地址加偏移量的方式。(说到这,插一句:c语言中的指针知识在初学逆向时是很重要的)前面还有一个(char*),这个就是强制类型转换,将一个int *的v5强制按照char *的方式来读取其内存中的东西,这样就可以按照一个字节的方式依次取出v5里存放的东西了
简单逻辑逆向
解密脚本如下:
1 |
|
BUUCTF [GXYCTF2019]luck_guy
linux远程动调
linux端:
- 将ida文件下IDA_Pro_7.7\dbgsrv文件夹下的linux_server(64)放到linux里
- 查看linux的ip:ifconfig
- 给权限:chmod 777 linux_server64
- 运行:./linux_server64
windows端:
- f9:remote linux debugger
- hostname里填写刚刚查到的ip地址,其余不用管
动调起来后就可以随意修改代码逻辑
简单逻辑逆向
初步看逻辑,就是他定义了一个随机数,这个随机数必须先走case4,再走case5,最后走case1,就可以成功的把flag打印出来,那么到这里就有两个思路,一个是仿写一下case4,5的代码逻辑,另一种是让程序执行到case4那里,再执行case5,1,让他自己把flag打印出来
修改代码需要在汇编层面,汇编可以尝试啃啃书或者视频课,但重要的是多看。
1 |
|
NSSCTF [GDOUCTF 2023]Check_Your_Luck
z3
简单,就是学习一下z3这个工具的使用
1 |
|
NSSCTF [LitCTF 2023]程序和人有一个能跑就行了
隐藏逻辑(动态调试)
RC4
RC4加密算法与逆向方法简析 - Moominn - 博客园 (cnblogs.com)
1 |
|
[GDOUCTF 2023]doublegame
交叉引用
动态调试
直接运行程序是一个贪吃蛇游戏,撞壁游戏就结束了。
拖入ida,因为没有main函数,所以通过字符串来定位关键逻辑:
看到挺多0,跟进去,来到了这么一个函数:
1 |
|
很明显是一个迷宫,但刚才的贪吃蛇哪去了(因为是double game啦),那么就再交叉引用看看谁调用了这个迷宫的函数,一直可以追到贪吃蛇游戏里:
这个dword_140022CD0就是当前得分了,当它>13371337时就会跳转到迷宫游戏
逻辑清楚了,那么在判断分数前下个断点,贪吃蛇游戏结束之后断下来,修改两次标志位(sf)跳转到迷宫游戏
接下来通过wsad控制上下左右走迷宫,先把小猫救出来后,程序会让输入key(其实就是贪吃蛇分数13371337),也可以通过判断key的逻辑再把key逆出来:
1 |
|
1 |
|
所以为了使v25=13376013,需要v2^0x1dc4=13376013,那么key就是13376013^13376013=13371337
输入key之后,又回到原点了,再走一下迷宫,flag就是{key+md5(最短路径)}