Buuctf-Reverse(逆向) 网鼎杯 2020 青龙组-singal Write up

Posted 水番正文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Buuctf-Reverse(逆向) 网鼎杯 2020 青龙组-singal Write up相关的知识,希望对你有一定的参考价值。

做逆向题太快乐了。--10.14

0x00 日常查壳

无壳64位

0x01 分析主函数

0x02 vm_operad

 于是现在可以手解第一位flag 是可以发现如果只是改变加变减 乘变除是不能逆向回去

只是现在思路就是爆破出来

1. 我们现在拥有加密后的数据

2. 加密的算法

3. 就可以进行遍历每一个数和加密后的数据比对

0x03 GetFlag!

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

int main(void)
{
	int key[] = 
	{
		0x22, 0x3F, 0x34, 0x32, 0x72, 0x33, 0x18, 0xA7, 0x31, 0xF1, 
		0x28, 0x84, 0xC1, 0x1E, 0x7A
	};
	int a1[] =
	{
  		0x04, 0x10, 0x08, 0x03, 0x05, 0x01, 0x04, 0x20, 0x08, 0x05, 
  		0x03, 0x01, 0x03, 0x02, 0x08, 0x0B, 0x01, 0x0C, 0x08, 0x04, 
  		0x04, 0x01, 0x05, 0x03, 0x08, 0x03, 0x21, 0x01, 0x0B, 0x08, 
  		0x0B, 0x01, 0x04, 0x09, 0x08, 0x03, 0x20, 0x01, 0x02, 0x51, 
  		0x08, 0x04, 0x24, 0x01, 0x0C, 0x08, 0x0B, 0x01, 0x05, 0x02, 
  		0x08, 0x02, 0x25, 0x01, 0x02, 0x36, 0x08, 0x04, 0x41, 0x01, 
  		0x02, 0x20, 0x08, 0x05, 0x01, 0x01, 0x05, 0x03, 0x08, 0x02, 
  		0x25, 0x01, 0x04, 0x09, 0x08, 0x03, 0x20, 0x01, 0x02, 0x41, 
  		0x08, 0x0C, 0x01
	};
	int v9 = 0;	//a1的下标 

	int v4 = 0; 	//临时数 
	int i, j;
	int flag;
	int index = 0;
	
	for ( i = 0; i < 15; i++, index++)	//每次跳出都在数值1的位置 这边是跳到1的下面一位 
	{
		for ( j = 48; j < 123; j++)
		{	
			flag = j;	
			v9 = index;
			
			while ( a1[v9] != 1)
  			{
				switch ( a1[v9] )
    			{
      				case 2:
        				v4 = a1[v9 + 1] + flag;
        				v9 += 2;
        				break;
      				case 3:
        				v4 = flag - a1[v9 + 1];
        				v9 += 2;
        				break;
      				case 4:
        				v4 = a1[v9 + 1] ^ flag;
        				v9 += 2;
        				break;
      				case 5:
        				v4 = a1[v9 + 1] * flag;
        				v9 += 2;
        				break;
      				case 6:
        				++v9;
        				break;
      				case 8:
        				flag = v4;
        				++v9;
        				break;
      				case 11:
       					v4 = flag - 1;
        				++v9;
        				break;
      				case 12:
        				v4 = flag + 1;
        				++v9;
        				break;
      				default:
        				continue;
    			}	
			} 
			if ( v4 == key[i])			//判断成功 遍历下个字符 
    		{
    			index = v9;			//下标记录 
    			printf("%c", j);
    			break;				
			}
		}
 	}
  	
  	return 0;
}

或者可以用angr

参考文章:二进制分析工具angr的使用学习(1)_逆向随笔-CSDN博客

import angr

p = angr.Project(r"./signal.exe", auto_load_libs=False)
# 加载文件
# auto_load_libs=False   不加载共享库文件

state = p.factory.entry_state()
# 创建一个状态state
# entry_state()  构造一个已经准备好从函数入口点执行的状态。

sm = p.factory.simgr(state)
# 创建一个 Simulation Managers 模拟管理器
# 也可改为
# sm = p.factory.simulation_manager(state)
# 目前没发现区别

traverse = 0x004017A5
# 出flag的路径

sm.explore(find = traverse)
# 让angr开始探索,这个路径
# 如果找到了满足find的状态,则将其保存在模拟管理器的found分类里
#, avoid = 0x004016ED 避免错误地址
if sm.found:
    # 如果found分类不为空
    find_state = sm.found[0]
    # 就把found分类里面的状态给find_state

# state.posix.dumps(0) 获取输入

print(find_state.posix.dumps(0))
#print(find_state.posix.dumps(1)) 获取输出

GetFlag!

以上是关于Buuctf-Reverse(逆向) 网鼎杯 2020 青龙组-singal Write up的主要内容,如果未能解决你的问题,请参考以下文章

Java安全-Java In CTF([网鼎杯 2020 青龙组]filejava[网鼎杯 2020 朱雀组]Think Java)

Java安全-Java In CTF([网鼎杯 2020 青龙组]filejava[网鼎杯 2020 朱雀组]Think Java)

[网鼎杯 2018]Comment

网鼎杯青龙组部分web-wp

网鼎杯青龙组部分web-wp

[网鼎杯 2020 白虎组]PicDown