DDCTF之re1详解
前言:re1,可能我的是非预期解法吧,re2的话,可能也是非预期吧,不过做出来过后感觉这两道都蛮简单的,不会做的时候就是个傻子。。。
re1
用ida打开这个程序,出现upx1,明显upx壳,linux下我用upx -d filename 脱了壳后。我先把ida出来的flag复制提交了下,没用。。。然后开始看算法,
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
整个过程很明朗,没有挖坑,关键函数就在sub_401000处,进去后
1 | unsigned int __cdecl sub_401000(const char *a1) |
…我发觉a1 - v1这是什么鬼,a1不是地址吗,v1又是什么鬼。。抱着一堆什么鬼都不知道的东西,我就直接上od了,因为这是windows逆向,所以我还是比较擅长动态调试的,大一一年几乎都是在啃汇编啃od,当时都不知道ida这玩意。
调试环境:吾爱虚拟机
工具:吾爱的OD
感觉像是为吾爱打了一波广告,哈哈,没关系,反正我也是论坛成员,宣传下没什么毛病
打开od载入程序后,点播放按钮,也就是运行按钮,然后右键中文搜索,搜索字符串,来到这里
在定位到关键点please input code
这里很容易看出ida的逻辑,scanf后跟着的一个call便是关键,在此call处下断点,
然后输入12345678,
成功断下,然后F7单步进入,在单步跟了一轮过后,我发觉pop这里有好东西
看堆栈窗口,也就是右下角,出现了跟我输入字符串一样长度的英文字符串,起初我也没在意,然后输入多几次后发觉,每次输入是对应的,也就是说,他跟凯撒密码类似,他只是移了下位,然后,我自己手动把键盘里所有出现的字符输入了一遍,发觉还是漏了一些,找不齐,最终就利用他本身含有的一个字符串进行输入,得到每个的对应字符串,他的字符串可以从od里直接看到
或者从ida里都可以找到
然后进行手动输入进行匹配,我需要的DDCTF{reverse}
看栈窗口,最上面的对应匹配,我这样手动把每个字符对应起来,就得到flag了
最终得到对应字符
Z D
[ C
J T
, r
9 e
( v
手动得到ZZ[JX#,9(9,+9!
本文作者:NoOne
本文地址: https://noonegroup.xyz/posts/a657c435/
版权声明:转载请注明出处!