xor
两次异或等于没有异或
注意:有时候正向异或时改变了数组的元素值,需要逆向异或(从后往前)
迷宫题
可根据代码中的“上下左右”判断该为迷宫题
遇到迷宫题别忘记找地图
大小端序
elf文件通常使用小端序储存,而ida会把内存中那些数据自动转化成大端序存储,下图中key3就是一个正确的顺序(大端序),而在伪代码中看见的字符串是小端序(由于该种字符串没有经过ida处理,因此我们在使用的时候要进行顺序反转)
注意:在buuctf上有一道SimpleRev的题,在写解题代码的时候有陷阱(提示:找到了符合条件的数据就用break跳出循环,否则会有多个符合条件的数据输出)
Java逆向
用jadx-gui工具打开文件,查看源代码
数组寻址公式
1 | int __cdecl sub_4010F0(int a1, int a2, int a3) |
从这里,我们知道a1+4*i,也就是a1【i】,a1+4 * result,也就是a1【result】。
将伪代码的寻址方式改为数组寻址,然后将*(_DWORD*) 删掉,因为这是汇编的表示。
所以伪代码变成了C语言代码。
真正的C代码
1 | #include<stdio.h> |
字符转换
在IDA中,将16进制等其他进制转换成字符的时候,注意个别需要加”\“
下标查找字符串
查看_data_start
写出脚本
数据溢出
1 |
|
此代码运行出来之后是乱码,原因是因为数值发生了溢出。
此处定义了y为char类型的数组,而char的取值范围为-128-127,在中间经过加减变化后,数值超出了char的范围,导致输出有乱码,因此可以通过将char换成int,再打印出字符,可求得flag
1 |
|
RSA
在解rsa的题的时候,注意进制问题,十六进制/八进制转为十进制,再分解N为p、q,计算密钥求解明文
如上图中模数那一排,是十六进制,必须转换成十进制才能计算出p、q,否则分解不了模数
奇偶判断
if那一行相当于“ i % 2 != 0 ”
1的二进制为0001,奇数与1按位与,最后一位一定是1,偶数与1按位与,最后一位一定是0
查找字符串
在IDA中查找字符串时,字符串太多不好看,可以直接搜索关键字查找字符串从而找到主函数,如“flag”
字节
一个十六进制数(0-F)占0.5个字节大小,一个dword占四个字节(即两个字)大小
无符号类型
写解题代码的时候,注意观察伪代码中的数据类型,有些无符号型与有符号型解出来的答案是不一样的