题目附件

1.前期信息探查:

1.EXEinfo:

64位,无壳,ELF文件
notion image

2.运行一下:

notion image

1.IDA分析:

主函数接收了两个值,一个username,一个password,分别被40~44行的五个函数作为参数,而剩下的两个循环没啥用,纯粹浪费分析时间。

1.第一个子函数分析

这个子函数就一个循环,然后跳转到另一个子函数,循环的终止条件有两个,一个是i>100,一个是username的地址加i个偏移等于’\0’,所以i也就是username的串长。接着看sub_400866函数:
这个函数作用大概是要求串长满足某种条件的,想知道哪些串长满足如下条件也很简单,就是穷举1~100,代入公式就行
notion image
可以看到满足条件的长度只有8和12
第一个函数的作用到这就分析出来了,就是用来判断username串的串长

2.第二个函数分析:

result变量在这里啥用也没有,直接忽略。
username被分成三段,分别放入v2、v3、v4,这三个值分别满足if里的三个等式,也就是要解一个三元一次方程组
notion image
将这些值转成十六进制:
这里需要注意的是这些的值是以小端的形式存在内存中,重新组合转换成字符应为:
由此得出username的值为“itsmebrother”

3.第三个函数分析:

函数作用:判断输入的字符是否为小写字母和‘_’

4.第四个函数分析:

这里调用的是rand函数,paseword的值减去生成的随机数等于一个值,而srand设置的随机数种子是已知的利用这个特点我们就可以解出password的值。
先利用已知的随机数种子求出生成的随机数:(操作系统不同rand函数的处理方式可能有差别)
一开始是在Windows的环境下跑的结果解不出来:
notion image
这是个linux程序还是使用linux的gcc:
notion image
生成可执行文件会报错,说做加法的时候出现溢出情况,不过不影响,因为源程序也会溢出。
notion image
编写exp来获取password的值:
notion image
但这里还是要注意处理小端数的问题
输出得到正常password串(这个代码有点笨,以后还得改一改)
将获得的password转成字符
至此用户名和密码就都搞到手了

5.第五个函数分析:

flag的值为password异或byte_602090 里的值,将byte_602090 里的值提取出来就可以写exp了。
EXP为:
notion image
flag{logged_in_my_reverse}
notion image