buuctf 刮开有奖

前言:学习笔记。(不是为了做题而做题,reverse和pwn都需要深入学习。)

常规思路: 下载 解压 查壳 

32bit>>>32位 IDA Pro打开

常规:先查找字符串【东点西看】>>>再进入main函数【这题是winmain】>>>WIN32编程写的。

查找字符串

WinMain:

可疑参数:

跟进去看看

哎不想看,先直接看反。。。【截图不完。。直接和分析一起看吧。】

分析:

第一部分:

第二部分:

对于v7数组的范围:(这样看应该更简单些):【汇编中,连续的地址引用一般都是数组】

sub_4010F0(v7, 0, 10):(如何还原:C伪代码>>>C语言)>>>涨经验了。

关键点:类型确定[是char类型>>>【1】还是int类型【4】、数组寻址原理、C代码风格等等。。]

还原并运行:

#include <stdio.h>
#include <string.h>
#define _DWORD char
int __cdecl sub_4010F0(char * a1, int a2, int a3)
{
	int result; // eax
	int i; // esi
	int v5; // ecx
	int v6; // edx

	result = a3;
	for (i = a2; i <= a3; a2 = i)
	{
		v5 = i;
		v6 = *(_DWORD *)(i + a1);
		if (a2 < result && i < result)
		{
			do
			{
				if (v6 > *(_DWORD *)(a1 +result))
				{
					if (i >= result)
						break;
					++i;
					*(_DWORD *)(v5 + a1) = *(_DWORD *)(a1 + result);
					if (i >= result)
						break;
					while (*(_DWORD *)(a1 + i) <= v6)
					{
						if (++i >= result)
							goto LABEL_13;
					}
					if (i >= result)
						break;
					v5 = i;
					*(_DWORD *)(a1 + result) = *(_DWORD *)( i + a1);
				}
				--result;
			} while (i < result);
		}
	LABEL_13:
		*(_DWORD *)(a1 + result) = v6;
		sub_4010F0(a1, a2, i - 1);
		result = a3;
		++i;
	}
	return result;
}
int main()
{
	char v7[] = { 90,74,83,69,67,97,78,72,51,110,103,0};

	sub_4010F0(v7, 0, 10);
	printf("%s", v7);
	return 0;
}

得到:

说明>>>

①sub_4010F0对v7进行了重新排序。

②v7 = "3CEHJNSZagn";【变形后的值】

第三部分:

第四部分:

大意:

当它条件全部成立且String长度为8[已知] >>>猜测 String= flag{}       

v4 v5 加密后的值 是 ak1w 和V1Ax【在线解密就行 C实现挺困难的。。】

【猜测是base64,不知道就直接使用 随波逐流 >>>一键解码 0.0】

眼睛看得肉疼,直接写C脚本:​​​​​​​​​​​​​​

对比发现,只有base64中连续含有WP>>>说明base64加密猜测正确。

最终String结果顺序:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值