刚学逆向很多都不懂,本题也是在看了
http://countersite.org/articles/reverse_engineering/136-revers-s-alexctf-2017.html上的writeup
后才有点明白,但还有一些不明白的地方,写这个writeup一方面记录自己的思考过程,一方面给别人一点思路。
首先将题目给的可执行文件拖到IDA中,左侧函数栏找到main函数,F5键可以看到反编译的伪代码:
从上面的变量定义初步判断v7和v8是字符串或是数组之类的变量。
从上面的伪代码,一般系统中输入用户名和密码就会显示登录,我们可以猜测v8是指username,v7是指pasdword,或者相反。
五个关键函数:
sub_400C9A()
可以知道sub_400C9A(v8)返回sub_400C41(i)的返回值,sub_400C9A(i)访问v8的值,当v8中没有值时,记下i,并返回sub_400C41(i),可以判断,i就是v8数组大小而且不会超过49,通过修改sub_400C41(i)如下,可知长度是8或12。
sub_400CDD(v8):
这是对v8的检测,很明显只要解出如下方程就可算出v8.
利用Matlab解方程:
得到
V4 = 1635017059
V3 = 1953724780
V2 = 1868915551
转十六进制,再转ASCII码,V8为:catalyst_ceo,应该是用户名,这里需要把字符串反转,可能是因为存储方式的原因,具体不太明,代码如下:
Sub_4008F7是规定字符范围,没什么用,过
Sub400977(v8,v7)
上面已经计算出v8数组,可以计算srand(a1[1] + *a1 + a1[2])
再看
由此可计算a2,即v7,密码,用到srand和rand都是在C环境下,需在C中计算。
转ascii码(我不会再C中转无符号整型为ASCII码,因此在python中转):
得到密码为:sLSVpQ4vK3cGWyW86AiZhggwLHBjmx9CRspVGggj
最后,在linux中执行catalyst这个可执行文件,由于中间用了sleep函数,会较长时间出现填写用户名和密码的提示,然后输入用户名和密码即可。
也可以用最后一个flag生成函数生成flag,sub_400876(),但是这里的问题是s字符串的问题,双击byte_6020A0,会有发现,s的长度为40,具体为啥他是s,我也不太明白,明白的人可以告诉我。
Flag:ALEXCTF{1_t41d_y0u_y0u_ar3__gr34t__reverser__s33}