type
status
date
slug
summary
tags
category
icon
password
复现一下比赛中没有做出来的逆向题
easyre
这个题有大量的混淆,因此这个题我们选用x64dbg进行求解
其实对于这样的题我们需要确定的东西是
函数的输入的寻找
点击选项选择断在入口断点,这样他会断在Entrypoint那里
我们就一直往里面调,这里我直接F8步过了一个函数发现这个函数直接可以输入
但是这里我们看他存储到了一个地址,但这个不是我们最后的存储我们输入的地址
调到00007FF765224F82这个地址发现它在读取你的输入,这里的读取是为了后面存储到地址中做准备
继续往下面调,发现这里00007FF765214BC8开始读取之前的字符串到相对应的地址里,并且r12作为索引每次复制完以后,还会自增,因此我们可以确定这里就是相对应的地址
我们可以看到rsi那里存储着我们的地址,我们直接在内存窗口Ctrl+g跳到相对应的内存地址
对应的内存地址
这个时候我们就可以下一个硬件断点跟踪我们输入的字符串
F9之后跳到的第一个函数就是判断字符串长度的
我们直接往下面运行到ret那里,之后我们发现它的rax被赋值成了0x4,这正好是我们字符串的长度,然后我们到了ret那里根据rdi里面存储的地址,利用rdi-1可以得到调用比较字符串大小的函数00007FF76520772F
等我们运行完这个程序之后就开始利用x64dbgtrace,我们直接在我们所在的汇编代码处右键,代码覆盖那里有启动运行跟踪,trace的作用就是能够跟踪我们运行过的每一行汇编代码,以及记录寄存器的变化.
根据trace我们可以定位到这个区域,这里的意思就是将我们返回的字符串的长度赋值给了rdx这个寄存器,最后进行一个比较,因此可以得到字符串的长度为0x38
重新运行,然后把其它的软件断点全部禁用,只留下硬件断点.
并且我们要在内存窗口查看我们的input_addr
然后F9进行trace,在跳过字符串长度检查之后我们发现跳到了另一个地方,这个时候不着急往下面调,直接再F9一下,我们发现第一个字节发生了变化,应该是对一个字节进行
这个时候直接在你所在的代码那里进行trace直到它第三个字节发生变化,其实主要的加密逻辑还是在前面,它里面虽然包含了很多的数但其实最后只实现了一个 每个字节加0x40
记得把之前的trace删掉这样分析起来不会重合,第二步还是按上面的办法,这一步的数看着很繁琐,但其实最后只跟rdx这个有关,总结起来就是E9FCF789^B62DD00^E29E2AF6=7F
我们继续F9,发现它是对八个字节进行了加密,这里猜测是TEA加密
我们可以回到第二轮加密完那里直接F7开始trace但是这个trace量很大,从trace的结果可以看确实是xtea加密,并且轮数发生了变化,变成了102轮,并且多加了一层异或
异或在这里
根据这里我们其实可以判断是key,r8>>11很明显符合sum>>11,那么后面的mov eax,dword ptr ds:[rax+r8*4] 操作就是取里面的key
找到key的地址
最后就是差比较密文的地方,在进行所有TEA加密之后直接F7trace
由于它是一个密文一个密文进行比较,我们在比较的时候把对应的替换一下
Exp
📎 参考文章
有关学习或者复现上的问题,欢迎您在底部评论区留言,一起交流~
- Author:5m10v3
- URL:https://5m10v3.top/article/128533f9-4e40-8025-ae09-d2b69406fc2d
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts