攻防世界BABYRE

分析

首先查壳,64位无壳

image-20220913143752820

然后放入IDA分析

image-20220913143844320

这里的逻辑很简单,大概就是一个简单的异或再去if语句进行判断得出是否正确,但是我发现第12行这里的(*(unsigned int (__fastcall **)(char *))judge)(s)很奇怪,但我也没多去管了就去直接写脚本了

image-20220913144510624

image-20220913144520967

发现不对,再回去看看那个奇怪的地方所以这里(*(unsigned int (__fastcall **)(char *))judge)(s)应该这样分析,unsigned int 是judge函数的返回类型(无符号整型),(fastcall )是函数的调用约定,(char *)这个是提取judge的数组头的一连串字符串做函数名。也就是说这不是真正的judge,judge应该是个函数而不是数组,那么我们要去把真正的judge弄出来

函数调用约定具体可以去看这个:(46条消息) __fastcall具体含义_阿齐兹的博客-CSDN博客__fastcall

这里就直接用ida python弄(这也是我初次使用这个东西)

image-20220913151109878

已经改好了,发现还是数组然后就按c转换成数据再按p声明一下

image-20220913151218385

这里v3是接在v2后面的,因为都是传到一个寄存器中的

image-20220913151412550

接着就能写真正的脚本了

脚本

#include<stdio.h>
int main()
{
char flag[20]={0};
char v2[]="fmcd\x7Fk7d;V`;np";
for(int i=0;i<14;i++)
{
v2[i] ^= i;
printf("%c",v2[i]);
}
}
//flag{n1c3_j0b}

总结

对花指令不是很熟悉,没有第一眼认出来,要多练多看。第一次用ida python不熟练,大家可以去看看这个

IDAPython入门教程 基于IDA7.5_Python3 第一讲 简介与地址获取 - iBinary - 博客园 (cnblogs.com)

但这都是基础的,还应该多加练习!