buuctf [Zer0pts2020]easy strcmp 题解

        

无壳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看着很正常,那转到汇编一看~

还是很有意思的一题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值