美文网首页
ctf.xp0int--汇编除法优化

ctf.xp0int--汇编除法优化

作者: n0va | 来源:发表于2018-10-28 20:06 被阅读0次

    暨大的一道逆向题,考查方向汇编(菜鸡的我并没有做出来)链接: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

    相关文章

      网友评论

          本文标题:ctf.xp0int--汇编除法优化

          本文链接:https://www.haomeiwen.com/subject/tiemtqtx.html