Reverse
- Re11 链接地址
我们拿到的是一个ELF文件,在Linux中可执行,我们直接丢进IDA中shift+F12,观察到flag字符串之后双击进入主函数,再F5观察函数:
- 随手注释,代码很长,慢慢看,从最后看起,可以得知v22=0,所以逆推得知,前面的v16-20 = 48···,按R可以得知v16-20 = 0823},而且v21=22,可以推测出v15为我们所要找的flag并且长度为22,找到定义v15的代码处,则根据上述的关键条件,其中前17位存入字符串v15中,后5位覆盖v16~v20的取值,使v16~v20分别等于0823}
- 继续向下分析,找到输入的代码块,经过分析可得到关键信息如上图,其中v21即为输入的长度,通过关键条件v21==22验证了猜测输入字符串长度为22,同时需要保证输入的后五位为0823}
- 向下分析v15需要满足的条件,着重分析v15[i] != (((_DWORD )&v6 + i) - 1) / 2,&v6为取v6的地址;(_DWORD )&v6强制z转化为_DWORD型指针,即两个字节;((_DWORD )&v6 + i)为从&v6向后取sizeof(_DWORD)i个字节;((_DWORD *)&v6 + i) - 1)为取从&v6向后取4i个字节的值
- 指针地址加减问题
后面我们需要找到v6-v13的内存地址
翻回前面得到:
即可得到内存地址,再写脚本即可拿到flag:
- CrackMe.exe 题目链接
我们先点开尝试玩一玩,结果是密钥无效,所以我们丢进IDA时搜索字符串“密钥无效”来找到关键函数,之后再看整体大纲:
我们可以看到函数的分支,所以我们点开密钥的分支F5来观察函数
仔细观察函数,可以得到string为输入的用户名,而string1为输入的注册码,后面又对用户名进行了一系列的转换,再将用户名加到”Happy@”的后方形成一个新的字符串,形成的新的字符串再与string1,即注册码相比较,所以我们可以确定新形成的字符串就是题目所要找的注册码。(strcpy函数是复制!加到字符串的后方!不是覆盖!注意!!!)
所以我们可以在最后方的比较函数处断点,运行程序,利用程序本身所转换得到的注册码来拿到flag而不用自己写脚本解得注册码
F9运行
即可拿到注册码
- 隐写诶13 实验室平台
打开,是一个EF可执行文件,先自己运行一下,放入IDA,找到main函数,F5:
随手注释,v6为输入值,可以注意到输入的值的长度规定为7位,直接观察关键的if函数:
关键的if函数是已知的v8字符串和输入值v3的一个循环函数,在此处进行断点,F9进行运行调试,输入’hellowo’字符串,F7单步调试,可以观察到我们所输入的h的字符先被处理,处理之后变成了0x61的字符,随即对比和0x49对比不成功,直接跳出循环结束程序
所以可以根据前面的伪代码写脚本,得到flag,脚本如下: