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)