ctf.xp0int--汇编除法优化
2018-10-28 本文已影响0人
n0va
暨大的一道逆向题,考查方向汇编(菜鸡的我并没有做出来)链接:https://pan.baidu.com/s/1mKkMK0L8OxO6kYLc2JgSaw
提取码:nlvx
看wp也不是很懂,但懒人如我总结一个规律,可以直接算的。
这个AT&T,不过问题不大,后面的命令倒着看就行了,
结合谷歌的汇编除法优化:
这里注意几条命令:
movabs $0x49ea309a821a0d01,%rdx;
sar $0x3f,%rdi
sar $0x30,%rdx
其实只需要这三个数据就可以求出1/N,也就能求出N来了
1/N = (0x49ea309a821a0d01)>>(0x3f+0x30+1)
N也就顺势求出来了;
flag{974873638438446}
这里附上暨大的wp,不是很懂;
这里给出一个用二分法查找的方法(也可以去理解优化过程来解决)
#include <iostream>
int main() {
char function[] = {"\x48\x89\xf8\x48\xba\x01\x0d\x1a\x82\x9a\x30\xea\x49\x48\xc1\xff\x3f\x48\xf7\xea\x48\xc1\xfa\x30\x48\x89\xd0\x48\x29\xf8\xc3"};
// funtion为div函数机器码
long long (*foo_ptr)(long long) = (long long (*)(long long)) function;
long long a = 0;
long long b = 0x7FFFFFFFFFFFFFFF;
while (b - a > 1) {
long long mid = a / 2 + b / 2; // more or less; avoiding overflow
if (foo_ptr(mid) >= 1) {
b = mid;
}
else {
a = mid;
}
}
std::cout << a << "\n" << b << "\n";
}
g++ exp.cpp -z execstack && ./a.out 编译运行即可得到flag