4102386:隐藏字符串的姿势之一:把字符串的赋值改成一个一个字符赋值
这样在strings中就看不到了
在main中,出现了一个红色调用:
在OD中明显可以看到:
在分析函数功能的时候看到了这个:
这个用patch E8字节的方法不太对,所以就选择单步调试下它的参数
s = "63Qpkjf.Qpofs"
print len(s)
for i in s:
print chr(ord(i) - 1),
在IDA里需要patch的地方:
将E9改成90
将E8改成90
在OD中需要手动改几个跳转
gethostname:返回标准主机的主机名
之后就可以F4到40113F
401386函数的功能就是生成一个字符串
这个跳转不能让它跳过来
这个需要跳转
为了分析下面代码的反汇编,这个不能让它跳转
刚才所有的patch:
修改这个Z的标志位就好
然后就报错了。。。调试思路完全不对啊:因为我刚才的修改,程序的下一步操作是在我们从Internet中读出的字符串里找到“:”字符,因为原字符串是空的,所以报错了
所以换种思路,直接把E8和E9这种有毒的字节patch掉
这个函数的调用说明这样改是对的
相当于jmp
在函数区段里找一找,发现了这一一堆赋值
所以程序肯定和本地计算机的账户有关
第一个请求的URL:bamboo.html
从书中答案总结的分析过程如下:
40115A为假恒成立的表达式,因此一定会满足jnz的跳转(正常程序的esp肯定不为0)
熟练使用data和code的转换,就可以把0xE8抠出来(nop掉是最好的吧)
然后是jz和jnz,两者有且只有一个成立,相当于jmp
下面的反汇编技术显得高级一点:
对eax清零后,jz跳转恒成立,相当于往回的跳转,那么跳转到的是mov ax, 5EBh的中间部分的字节
但是仔细想想其实没有关系,因为之后eax就清零了,所以:还是可以使用刚才data和code的转化方法,变成这样:
相当于两个跳转,最后到的是4012EF