盒子
盒子
文章目录
  1. Reverse

Reverse-2

Reverse

我们拿到的是一个ELF文件,在Linux中可执行,我们直接丢进IDA中shift+F12,观察到flag字符串之后双击进入主函数,再F5观察函数:

tu1

tu2

tu3

  • 随手注释,代码很长,慢慢看,从最后看起,可以得知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的内存地址

tu4

翻回前面得到:

tu5

即可得到内存地址,再写脚本即可拿到flag:

tu6

我们先点开尝试玩一玩,结果是密钥无效,所以我们丢进IDA时搜索字符串“密钥无效”来找到关键函数,之后再看整体大纲:

tu7

我们可以看到函数的分支,所以我们点开密钥的分支F5来观察函数

tu8

仔细观察函数,可以得到string为输入的用户名,而string1为输入的注册码,后面又对用户名进行了一系列的转换,再将用户名加到”Happy@”的后方形成一个新的字符串,形成的新的字符串再与string1,即注册码相比较,所以我们可以确定新形成的字符串就是题目所要找的注册码。(strcpy函数是复制!加到字符串的后方!不是覆盖!注意!!!)

所以我们可以在最后方的比较函数处断点,运行程序,利用程序本身所转换得到的注册码来拿到flag而不用自己写脚本解得注册码

tu9

F9运行

tu10

即可拿到注册码

打开,是一个EF可执行文件,先自己运行一下,放入IDA,找到main函数,F5:

tu11

随手注释,v6为输入值,可以注意到输入的值的长度规定为7位,直接观察关键的if函数:

tu12

关键的if函数是已知的v8字符串和输入值v3的一个循环函数,在此处进行断点,F9进行运行调试,输入’hellowo’字符串,F7单步调试,可以观察到我们所输入的h的字符先被处理,处理之后变成了0x61的字符,随即对比和0x49对比不成功,直接跳出循环结束程序

tu13

所以可以根据前面的伪代码写脚本,得到flag,脚本如下:

tu14

支持一下
扫一扫,支持v1nke
  • 微信扫一扫
  • 支付宝扫一扫