1.载入ida查看逻辑
在主函数里面我们看到上图中其实很奇怪,我们根本就没有用到v7,而v8[i%v6-8]数组中的索引会变负,而v7中正好有7个字符(包括/0的话就有8个),
所以我们不妨大胆的想象,v8[i%v6-8]代表的是v[i%v6]下移8个地址而代表的是v7呢?
其实在这里我们已经是可以确定答案了 确实是这样的 [rbp-20h-8h]=[rbp-28h]
当然我这里在动态调试验证一下哈~~~
答案是非常鲜明的~因此我们可以大胆的写脚本了
2.exp
注意写脚本的话如果直接从main函数提取的话要注意大小端和转义字符的问题,我在这里的转义字符这里坑了好久发现居然是不用转移直接复制的。。。
当然我是更喜欢直接动态调试直接提取的(这样就不用手打了,当然多了动态调试了)
#include<iostream> using namespace std; int main() { unsigned char a[] = { ":\"AL_RT^L*.?+6/46" }; unsigned char ida_chars[] = { 58, 34, 65, 76, 95, 82, 84, 94, 76, 42, 46, 63, 43, 54, 47, 52, 54 }; char b[8]={"harambe"}; int v=7; for(int i=0;i<17;i++) { printf("%c",b[i%7]^ida_chars[i]); } }
还要注意是17个哦~