题目地址:http://bxs.cumt.edu.cn/challenge/reverse/reverse03.exe
就是给定账号要求获得具体的密码。
1.直接用IDA打后发现会说IAT错误(因为本人新手,查询后才知道是壳,然后补了好多壳的知识,手动脱壳暂时不熟练,还是直接用工具方便,后续再多练练)
用PEID检查,发现是UPX壳。
2.于是使用UPXshell脱壳,脱壳完成后再用IDA打开查看主函数。
3.这题里有很多反调试的方法。
(1).两个GetTickCount(),得到这两次的时间间隔, 如果在这之间用了单步调试,则会使两次时间间隔大于1000ms,则会影响这里V7的取值。在SUB4011E00里,会生成错误的密码前四位。绕过方法,直接修改V7在进入函数之前的值为0即可.
绕过方法:
用OD运行至此处,修改EAX为1;
(2).参考该博客https://blog.youkuaiyun.com/wellerweldon/article/details/1616384?utm_source=blogxgwz4
在SUB_4011E0里,从ID号0开始扫描所有的进程,并把进程名与相关名称进行对比,如果正确则会生成错误的密码。
绕过方法: 在比较前,在内存中找到存放该字符串的位置。
从这一步到内存中跟随立即数到:
把字符都修改为00即可让比对失效。
(3) IsDebuggerPresent 可以查出当前进程是否在被调试,如果是则返回1,不是则返回0.这里直接修改返回值为0即可绕过。
4.最终运行到这里直接获得密码
总结下:自己目前对反调试和加壳脱壳非常陌生,很多东西还需要慢慢弥补,这一题帮我收获了许多。最近在努力看书,加密与解密学到了很多东西。