BUU reverse做题记录Day02

题目链接:https://buuoj.cn/challenges#SimpleRev

公众号文章链接:BUU reverse做题记录Day02

SimpleRev

IDA打开,查看关键函数:

图片

分析前面逻辑,key1和key3跟进去可以找到对应的值

图片

图片

涉及到的知识点:

函数strcpy与strcat

了解函数用法的佬们可以跳过这了

strcpy函数原型:

char*strcpy(char*dest,const char*src)// 将src复制到dest字符数组中,返回的是第一个参数的值

// 用法示例
#include <stdio.h>
#include <string.h>

int main()
{
char str1[] = "Hello reverse";
char str2[40];
char str3[40];
strcpy(str2, str1);
strcpy(str3, "copy successful");
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
// str1: Hello reverse
// str2: Hello reverse
// str3: copy successful

strcat函数原型:

char *strcat(char *dest, const char *src)  // 该函数会将src字符串拼接在dest字符串的末尾,并返回dest

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[100] = "Hello reverse";
	char str2[] = ",join successful";
	strcat(str1, str2);
	printf("str1: %s", str1);
	return 0;
}
// str1: Hello reverse,join successful

数据存储的两种模式:大端模式和小端模式

首先要明白的是:读数据永远是从低地址开始的!!

  • Little-Endian(小端模式)就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端

  • Big-Endian(大端模式)就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端

比如32bit宽的数0x12345678,内存地址从0x4000开始

内存地址 大端 小端
0x4000 0x12 0x78
0x4001 0x34 0x56
0x4002 0x56 0x34
0x4003 0x78 0x12

注:在内存中存放的时候是以一个存储单元为单位来存放(8bit=1Byte为一个存储单元)

所以我们可以得到:

text = "killshadow"; key = "ADSFKNDCLS";

继续看下面的逻辑:

图片

逻辑很容易,如果key[v3 % len(key)]对应的是大写字母,则将其转换为小写

key1 = 'ADSFK'
key3 = 'kills'
text = key3 + 'hadow'
key = key1 + 'NDCLS'

v3 = 0
key_len = len(key)
new_key = ""
for i in range(key_len):
index = v3 % key_len
if 65 <= ord(key[index]) <= 90: # 判断是否是大写字母(利用ASCII码范围)
new_key += chr(ord(key[index]) + 32)
else:
new_key += key[index]
v3 += 1
print(new_key)
# key值:adsfkndcls

继续向下分析:

图片

关键逻辑:(v1 - 39 - key[v3 % key_len] + 97) % 26 + 97;

处理后得到的数据与text值进行比对看是否一致

直接写脚本进行爆破,python代码:

text = 'killswodah'
key = 'adsfkslcdn'
flag = ''
for i in range(len(key)):
for j in range(65,122):
if ord(text[i]) == (j - 39 - ord(key[i % len(key)]) + 97) % 26 + 97:
flag += chr(j)
break
print(flag)
# KLDQCOZFDU

c代码:

#include<stdio.h>
int main()
{
	char key[] = "adsfkndcls";
	char text[] = "killshadow";
	int v3 = 10;
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 123; j++)
		{
			if (j < 'A' || j > 'z' || j > 'Z' && j < 'a') 
			{
				continue;
			}
			if ((j - 39 - key[v3 % sizeof(key)] + 97) % 26 + 97 == text[i])
			{
				printf("%c", j);
				v3++;
				break;
			}
		}
	}
}
// KLDQCOZFDU

BU reverse 1是一个反向工程题目。我们需要使用IDA来分析给定的程序并找到正确的flag。根据引用,我们可以使用strncmp函数来比较两个字符串的前几位。如果相同,返回0;如果不同,返回正数或负数。根据引用,我们可以得知,正确的flag应该与字符串"this is the right flag!"相同。因此,我们需要在IDA中查看字符串并找到正确的flag。然后,我们可以按照引用中的步骤来进行操作,将ASCII码转为字符。通过这些步骤,我们可以找到正确的flag。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [buuctf 逆向刷题01——reverse1](https://blog.csdn.net/qq_42642222/article/details/127678168)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [BUUCTF--Reverse--easyre,reverse1,新年快乐(面向新手,超详细)](https://blog.csdn.net/qq_65165505/article/details/130263889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默默无名的大学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值