- 刚做完红帽杯那个入门题来写这个,一看代码500多行的re直接不想看了,后来跟着这个博客过了一遍,收获不少
参考博客
核心思想
- 做llvm pass首先要知道主函数是什么,在此题中是这个,注意这里是小端序,因此函数名应当是B4ckDo0r

- llvm pass函数代码中的函数一定会有会判断其参数的部分,比如这里,参数个数就为2

- 确定函数参数的类型,是char *还是int还是别的,通过函数中具体内容来确定,比如有个复制函数那么它很可能是char *
- 函数的返回类型一般就是void,除非有其他特别的,然后主函数一般都是int,因为最后有return 0;
- 逆向函数中的具体内容,a.一般先找熟悉的函数,比如有memcpy这种,或者free这种,b.另一种方法就是注意一些全局变量的赋值,有时候就可以将一些地方的值存到某处,特别是此处在libc附近,c.最后就是要注意任意写,任意函数执行的地方
- 最后最重要的就是要学会动调,猜出程序的逻辑,难逆向的逻辑就动调猜出来
题目解析
- 函数逆向后大致逻辑如下

- 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();
}