BUU[Zer0pts2020]easy strcmp

分析

首先将它查壳,发现为64位无壳,然后放入IDA分析,首先shift+F12去找找有什么关键的地方

image-20220425203042575

然后交叉引用去找它

image-20220425203115808

发现只要a2等于后面一串字符就可以了,于是去试flag发现错误,肯定没这么简单。于是我想起了之前做的题,可能藏在initr里,于是进去看看

image-20220425203254996

然后去看看funcs_889的交叉引用

image-20220425203340893

果然是这里有东西被藏起来了,这里进去,发现并没有其他函数,而是一些代码,于是直接跟进funcs_889

image-20220425203647777

看到sub_795是之前没有见过的,于是点进去看看

image-20220425203739962

看到 off_201028 = sub_6EA,说明off_201028这个函数被赋了新的函数在里面,于是点进去看看image-20220425204137015

这里也就是说off_201028是直接用了strcmp这个函数的地址,而off_201028又被sub_6EA重新赋新的东西,所以说sub_6EA表示是strcmp的意思,于是点进sub_6EA去看看

image-20220425204342514

于是开始写脚本

脚本
#include<stdio.h>
#include<string.h>
#include<stdint.h>
int main()
{
char a[]="zer0pts{********CENSORED********}";
uint64_t b[]={0, 0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B};
for(int i=0;i<4;i++)
{
*((uint64_t*)&(a[i*8]))+=b[i];//这里是小端序的输出,所以用这个格式
}
printf("%s",a);
}

得到flag

zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}
总结

要善于去查找和交叉引用以及深入地跟踪,还有注意大小端的交换!