两道逆向CTF题

题目链接:https://pan.baidu.com/s/1rToDORyPLcsrlVT3WSWuCA
提取码:2f1m

第一题re1

1、用查壳工具检查程序没加壳,使用IDA64打开,找到main()函数,按F5进行反编译
在这里插入图片描述
2、(方法一)把v7转化成字符串,有7个字符以及一个结束符‘\0’,可以注意到v7和v8的地址是连着的,又是小端存储的方式,所以v7实际上"harambe"
在这里插入图片描述
sub_4007C0()函数打印不正确,所以flag的长度就等于v8的长度,而v8[i % v6 - 8]实际上就是v7[i % v6]
在这里插入图片描述
在这里插入图片描述
(方法二)或者直接把v7的类型改成char类型,已经知道v7和v8的地址是连着的,v7的长度是8+v8的长度28=36,所以直接把v7改成char v7[36],后面的代码也会相应的改变
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、编写脚本

//方法一
#include<stdio.h>

int main()
{
	int i;
	char flag[19]="";
	char v7[]="harambe";
	char v8[]=":\"AL_RT^L*.?+6/46";
	int v6=7;
	for(i=0;i<18;i++)
	{
		flag[i] = (char)(v7[i % v6] ^ v8[i]);
	}
	printf("%s",flag);
	return 0;
}

//方法二
#include<stdio.h>
#include<string.h>

int main()
{
	int i;
	char v7[36]="";
	char flag[19]="";
	int v6=7;

    strcpy(&v7[8], ":\"AL_RT^L*.?+6/46");
    strcpy(v7, "harambe");
	for(i=0;i<18;i++)
	{
		flag[i] = (char)(v7[i % v6] ^ v7[i + 8]);
	}
	printf("%s",flag);
	return 0;
}

在这里插入图片描述

第二题IgniteMe

1、用查壳工具检查程序没加壳,使用IDA32打开,在start()函数,按F5进行反编译
在这里插入图片描述
2、所以sub_401050()函数要返回1,byte_403180就等于byte_403000,而byte_403000和v4已知,所以就知道byte_403078
在这里插入图片描述
在这里插入图片描述
v4的值
3、求v4的值
(1)__ROL4__函数是向左移了4位,0x80070000是十六进制,移4位以后的十六进制就是0x00700008,在右移一位,后16位就是0x0004,v4是char类型,就是0x04
(2)使用Ollydbg动态调试,在00401000处按F2下个断点,按F9运行,在命令行里面随便输入字符回车,再按F8单步调试RETN,可以看到EAX值为函数返回的v4的值,v4为char类型,即0x04
在这里插入图片描述
在这里插入图片描述
(3)在给v4赋值后面一句代码以及sub_401000函数里面返回处下断点按F2下断点,按F9进行调试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击按钮运行,输入字符串,点击Debugger windows选择Locals
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按F8进行单步调试,可以看到v4的值为0x04
在这里插入图片描述
4、已经知道byte_403078,它等于v5,flag又等于v5,倒推回去就可以得到flag
在这里插入图片描述
5、编写脚本

#include<stdio.h>

int main()
{
	int flag[40] = {0};
	int v4 = 4;
	int i;
	int v1=39;   //byte_403180的长度
	int byte_403180[40]={0x0D,0x26,0x49,0x45,0x2A,0x17,0x78,0x44,0x2B,0x6C,
						 0x5D,0x5E,0x45,0x12,0x2F,0x17,0x2B,0x44,0x6F,0x6E,
						 0x56,0x09,0x5F,0x45,0x47,0x73,0x26,0x0A,0x0D,0x13,
						 0x17,0x48,0x42,0x01,0x40,0x4D,0x0C,0x02,0x69};
	for ( i = v1 - 1; i >= 0; --i )
	{
		flag[i] = v4 ^ byte_403180[i];
		v4 = flag[i];
	}
	for(i=0; i<39; i++)
	{
		printf("%c", flag[i]);
	}
	return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值