无壳64elf文件
拖入ida,看到主函数
给了一串字符串,然后啥都没了?沃日 那就只能随便点几个函数看了
start函数,这里面有一个_libc_start_main函数,可以看到参数中有main函数,查了一下,简单来说就是init参数先于main函数执行,所以我们去看init函数
可以看到前面有两个地址,进去看看
offset 作用是获得地址偏移量,这一句就是,将sub_6A0的地址偏移量给off_200DF0
看一下sub_6A0中的东西,是一个函数,没有有用的信息
同理进入funcs_889
第一个套娃
第二个
看到
qword_201090 = (__int64 (__fastcall *)(_QWORD, _QWORD))&strcmp;有点懵,能把库函数的地址赋值,这qword_201090是何方神圣
啥都没有,查一下bss段发现:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量,未初始化的全局静态变量和初始化为0的变量的一块内存区域。没啥用先不管,进入下一行
off_201028中居然先后存了三个库函数的地址?
之后又存放了sub_6EA,那也就是说调用off_201028就是调用这一个函数。
看最后返回的函数,是刚刚存放strcmp地址的函数,所以这里进行了比较,那么这里就是关键段
这里是对a1数组进行了加密的操作,然后再比较,所以a1是明文,a2是密文,a2大概率是主函数中的zer0pts{********CENSORED********},然后v4(明文长度右移三位)+1其实=(长度除8)+1
密钥如下:
所以v4=5,接下来写脚本就行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int key[]={0x42, 0x09,
0x4A, 0x49, 0x35, 0x43, 0x0A, 0x41, 0xF0, 0x19, 0xE6, 0x0B,
0xF5, 0xF2, 0x0E, 0x0B, 0x2B, 0x28, 0x35, 0x4A, 0x06, 0x3A,
0x0A, 0x4F};
char enc[]="********CENSORED********";
char flag[26];
int i,j,f=0;
for(i=0;i<strlen(enc);i++)
{
flag[i]=enc[i]+key[i]+f;
if(enc[i]+key[i]>255)
f=1;
else f=0;
}
flag[i]='\0';
printf("%s",flag);
}
因为我是将密钥提取成单字节运算,所以会涉及进位问题,然后又因为char单字节,会舍去高字节,所以我们需要加上一个进位标志f(就是这个问题,卡了我一天QAQ)
哦耶得到 flag{l3ts_m4k3_4_DETOUR_t0d4y}
了解这些东西,我们回到main再看看
strcmp看着很正常,那转到汇编一看~
还是很有意思的一题