2019_DDCTF windows_reverse1

"本文详细记录了一次使用IDA和动态调试解决逆向工程问题的过程。作者通过分析函数sub_401000,探讨了如何追踪变量v1的变化,尽管遇到了内存中未显示的数据和地址计算的困扰。最终,作者发现输入的乱码"DDCTF{reverseME}
摘要由CSDN通过智能技术生成

查壳

有壳

在这里插入图片描述

去之

在这里插入图片描述

IDA

主函数部分很简单,有个判断v4地址上的字符串是否等于DDCTF{reverseME}。

在这里插入图片描述

进入关键函数sub_401000瞅瞅:v4 v1都是地址且没说。a1是我们输入的字符的地址。中间有个do while循环,次数和字符串长度一致,预计是逐个处理。

在这里插入图片描述

解题

说实话,摸不着头脑,既然v1和v4的地址和内容都不给,而且byte_402FF8是空的,啥数据没有。那就只好动调了


首先是解决v4 = (const char *)(a1 - v1);

地址v4等于地址a1和v1相减,结果调出来是0x400……根本无法跳转过去。
其次我又看了下a1到v1之间的内存地址,全是空的……

在这里插入图片描述


迷惑,继续下一步。到了do while循环,看得出一直在给v1赋值。这里重点观察下v1:

找到地址,内存区跳转到v1处,暗中观察_(:з」∠)_

在这里插入图片描述

发现循环下v1确实每次都在赋值,但是搞不清哪里来的数据赋值……

循环多次后,摸清这个循环的作用是每次v1的地址+1,然后将byte_402ff8的第[v1[0x400]]的字符写道地址v1上。但是动调过程仍没有找到byte_402ff8真身,双击看到的静态地址还是空内容,如下图所示:

在这里插入图片描述


虽然关键字符内容没头绪,但v1的变化还是能观察到的,多次尝试后发现每次输入后v1的值变化都不一样。

考虑到这个函数的返回值并没有用上,而且地址v4和地址v1有联系。我直接输入DDCTF{reverseME}进行动调测试:

在这里插入图片描述

打开程序输入该乱码,依旧闪退。投降……

flag

看了别人的wp,日了狗了,flag真就那串乱码(ノ`Д)ノ

不过仍旧不知道为啥这就是flag……

flag{ZZ[JX#,9(9,+9QY!}

坑&填坑

1.v1到底是如何被赋值的

脚本逻辑就是在这里面找DDCTF{reverseME}里每个字符对应的位置,然后转字符串输出。不知道为啥……

2.为什么主函数声明的地址v4和sub_40100声明的地址v4是同一个地址

ida动调看到的byte数据在八个ff之前和别人的从OD里挖出来的不一样,后面的倒是相同。

在这里插入图片描述

3.看到别人的wp还有一种做法是在od里dump处byte_402FF8的值,然后就可以写脚本操作

byte_402FF8的地址就是0x402FF8,是我脑子瓦特了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值