ctf.xp0int--汇编除法优化

2018-10-28  本文已影响0人  n0va

暨大的一道逆向题,考查方向汇编(菜鸡的我并没有做出来)链接:https://pan.baidu.com/s/1mKkMK0L8OxO6kYLc2JgSaw
提取码:nlvx
看wp也不是很懂,但懒人如我总结一个规律,可以直接算的。

image.png
这个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
上一篇下一篇

猜你喜欢

热点阅读