陕西省赛2023-部分Reverse复现

目录

我的upx -d怎么坏了

动调脱upx壳:

babypython

BadCoffee

ob混淆:


我的upx -d怎么坏了

打开附件,发现是upx壳,应该是修改了区段名或者特征码

 

 但是修改过还是不对.....(哭.jpg)应该还是改了其他

好学长告诉我直接动态调试脱壳

动调脱upx壳:

在吾爱破解版OD里面打开,

 打开位置可以看到上面一点就有popad指令,在上面下断点

 F9程序运行到下一个断点

1 处是循环处理栈空间, 2 处有个大跳转,从0x41C131跳转到0x4012D0处,可能是程序的ope入口,F7跟进0x4012D0,在此处用插件dump程序出来

 

 直接点脱壳保存,就可以得到脱壳后的程序

 没显示壳了,放入到ida中,迷宫题

int sub_40143C()
{char Str[100]; // [esp+1Ch] [ebp-74h] BYREFint len; // [esp+80h] [ebp-10h]int v3; // [esp+84h] [ebp-Ch]int v4; // [esp+88h] [ebp-8h]int i; // [esp+8Ch] [ebp-4h]sub_401B10();printf("Please input your flag: ");scanf("%s", Str);len = strlen(Str);v4 = 1;v3 = 1;for ( i = 0; i < len; ++i ){switch ( Str[i] ){case 'U':                                 // 上--v4;break;case 'D':                                 // 下++v4;break;case 'L':                                 // 左--v3;break;case 'R':                                 // 右++v3;break;}if ( sub_401410(v4, v3) )                   // 迷宫图break;if ( aS0000000000000[15 * v4 + v3] == 35 )  // 走合适路线是值最终为35{printf("You are right!\nflag is flag{md5(your put)}");return 0;}}puts(Buffer);return 0;
}

 推荐一位学长的博客,自动走迷宫脚本(膜拜大佬.jpg):(124条消息) C语言实现自动走迷宫 自动输出迷宫路径_OrientalGlass的博客-CSDN博客

下面是引用的博客代码:


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <Windows.h>
// 枚举一些关键常量,可以根据迷宫的不同而修改
enum state
{start = 'S', end = '#', road = '0', wall = '*', visited = '1', successPath = '%', currentPosition = '@'
}State;
//路径操作符枚举
enum operate {up = 'U', right = 'R', down = 'D', left = 'L'
}Operate;
//保存路径
struct
{int len;unsigned char arr[1000];
}Path;
//输入路径
void inputPath(unsigned char op)
{Path.arr[Path.len] = op;Path.len++;
}
//输出路径
void printPath()
{printf("\nPath:");while (Path.len > 0){Path.len--;putchar(Path.arr[Path.len]);}printf("\n");
}
//判断是否在迷宫范围内以及是否可以走这一步
bool isLegal(int x, int y, int row, int col, unsigned char* p)
{if (x >= 0 && y >= 0)if (x < row && y < col)return (p[x * col + y] == road || p[x * col + y] == end);return false;
}
//输入迷宫图
//支持以矩阵形式输入,也可以输入一整行,自动处理换行符,直到读取到整个迷宫图为止
void inputMaze(unsigned char* p, int row, int col)
{unsigned char ch;printf("请输入迷宫图:\n");for (int i = 0; i < row * col; i++){if ((ch = getchar()) != '\n')p[i] = ch;else--i;}}
//打印迷宫图
void printMaze(unsigned char* p, int row, int col) {printf("\n迷宫图如下:\n");for (int i = 0; i < row; i++){for (int j = 0; j < col; j++)printf("%c", p[i * col + j]);printf("\n");}}
//走迷宫
//递归查询,这里由于递归是倒序输出路径,所以需要一个倒序操作
bool walkMaze(int row, int col, unsigned char* p, int x, int y)
{int pos = x * col + y;	//当前位置if (p[pos] == end)		//到达终点return true;if (isLegal(x - 1, y, row, col, p))	//上{//printMaze(p,row,col); //如果需要可以逐步输出迷宫图p[pos] = visited;	//设置访问标识,防止无限递归if (walkMaze(row, col, p, x - 1, y))	//该路径可行,输出操作符{inputPath(up);p[pos] = successPath;			//用于显示该路径return true;}}if (isLegal(x, y + 1, row, col, p))	//右{//printMaze(p,row,col);p[pos] = visited;if (walkMaze(row, col, p, x, y + 1)){inputPath(right);p[pos] = successPath;return  true;}}if (isLegal(x + 1, y, row, col, p))	//下{//printMaze(p,row,col);p[pos] = visited;if (walkMaze(row, col, p, x + 1, y)){inputPath(down);p[x * col + y] = successPath;return true;}}if (isLegal(x, y - 1, row, col, p))	//左{//printMaze(p,row,col);p[pos] = visited;if (walkMaze(row, col, p, x, y - 1)){inputPath(left);p[pos] = successPath;return  true;}}p[pos] = visited;return false;	//无路可走,该条路径不行
}//自动寻找起点,可以自行选择是否调用
void findStart(unsigned char* p, int row, int col, int* x, int* y)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (p[i * col + j] == start){*x = i;*y = j;return;}}}
}int main()
{int row = 15, col = 15, x = 1, y = 1;	//行和列,起点坐标unsigned char* Maze = (unsigned char*)malloc(row * col);	//分配空间inputMaze(Maze, row, col);		//输入迷宫printMaze(Maze, row, col);		//打印迷宫walkMaze(row, col, Maze, x, y);		//走迷宫Maze[x * col + y] = start;		//矫正起点字符printMaze(Maze, row, col);		//打印迷宫printPath();					//打印路径free(Maze);						//释放空间system("pause");return 0;
}

或者手动走迷宫,得到最后的结果是 RRRDRRURRRRRRDDDDRDDD

32位小写md5加密即为flag

babypython

下载附件,是python字节码,有很多混淆的无用代码,尝试问chatgpt还原源码

下面是程序有效的代码思路

定义flag,并将flag的每个字符异或8

import timeit
flag = '************************************'
value = ''
output = ''
i = 0while i < len(flag):temp = flag[i] ^ 8value += chr(ord(temp) ^ 8)i += 1

 将flag每个字符加3

for i in range(len(flag)):temp = flag[i]temp = chr(ord(temp) + 3)output += temp

将字符串进行base64加密,切片,即将加密后的base64密文反转倒序

import base64output = base64.encode(output.encode())
obfuscated_output = output.decode()obfuscated_output = obfuscated_output[:-1]

 将字符串中的g替换成1,H替换成3,W替换成9

obfuscated_output = obfuscated_output.replace('g', '1')
obfuscated_output = obfuscated_output.replace('H', '3')
obfuscated_output = obfuscated_output.replace('W', '9')
invalid_variable = len(obfuscated_output) * 5# 第二个部分
print(obfuscated_output)

将txt文本末尾的加密变换后的字符串逆序,1替换为g,3替换为H,9替换为W,进行base64解密

得到解密后的字符串qglrv@onmlqpA>qmq>mBo3A?Bn<lppA@;lp4nx

写脚本解密,拿到flag:flag{5dcbafe63fbf3b7d8647c1aee650ae9c}

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){int i;char str[]="qglrv@onmlqpA>qmq>mBo3A?Bn<lppA@;lp4nx";for(i=0;i<strlen(str);i++){str[i]-=3;str[i]^=8;}printf("%s",str);return 0;
}

BadCoffee

下载附件,是js 文件,很多代码,好学长指导,知道是ob混淆

ob混淆:

开头定义了一个大数组,然后对这个大数组里的内容进行位移,再定义一个解密函数。后面大部分的值都调用了这个解密函数,以达到混淆的效果。

这种代码即为ob混淆,不仅变量名混淆了,运行逻辑等也高度混淆,难以理解

  1. 对象属性名称替换:混淆工具会将代码中的对象属性名称替换为无意义的名称。例如,将属性名从可读性高的名称(如 "name")替换为随机生成的字符串(如 "_0x1a2b3c")。这使得代码难以理解和分析。

  2. 属性访问转换:混淆工具可能会将直接的属性访问(例如 obj.property)转换为通过字符串进行间接访问的形式(例如 obj["property"])。这增加了代码的复杂性,使属性访问变得不直观。

  3. 属性重排序:混淆工具可能会对对象的属性进行重新排序,使属性的顺序变得混乱和不可预测。这增加了代码的困惑性,使属性的逻辑关系更加难以理解。

  4. 属性值加密:混淆工具可能会对对象的属性值进行加密或编码,以防止直接获取属性值。这可以使用各种加密算法或编码方案来实现。

  5. 对象引用混淆:混淆工具可能会修改对象的引用方式,使对象的引用变得复杂和不明显。例如,将对象的引用存储在数组、函数调用或其他对象中,增加代码的混乱性。

下面是一个示例代码:

var _0x1a2b = ['\x48\x65\x6C\x6C\x6F', '\x57\x6F\x72\x6C\x64', '\x63\x6F\x6E\x73\x6F\x6C\x65', '\x6C\x6F\x67'];//即大数组
//_0x1a2b 是一个包含随机字符串的数组,'\x48\x65\x6C\x6C\x6F' 对应替代属性名 'Hello'
var _0x3c4d = {};
_0x3c4d[_0x1a2b[0x0]] = 'Hello';//偏移
_0x3c4d[_0x1a2b[0x1]] = 'World';//:属性访问使用数组索引来间接访问属性,_0x3c4d[_0x1a2b[0x0]] 表示访问属性 'Hello
_0x3c4d[_0x1a2b[0x2]] = function (_0x24e2) {console[_0x1a2b[0x3]](_0x24e2);
};_0x3c4d[_0x1a2b[0x2]](_0x3c4d[_0x1a2b[0x0]] + ' ' + _0x3c4d[_0x1a2b[0x1]]);//后面都调用解密函数

具体参考这篇文章:(124条消息) ob混淆解密在线工具_在线解ob混淆_滕青山ᅠ的博客-CSDN博客和这篇文章:(124条消息) 爬虫反混淆入门--JS混淆之ob混淆_阿J~的博客-CSDN博客

推荐一个在线工具解密ob混淆:解混淆测试版 (yuanrenxue.cn)   (这个在线工具使用火狐浏览器无法使用,可能是我的浏览器问题)

下面是优化后的代码:

function xxx(_0x53b7bb, _0x590286) {return _0x53b7bb ^ _0x590286;
}function enc(_0x4bda4c) {var _0x8ff1dd = [],_0x6aca75 = [233, 129, 127, 238, 145, 144, 11, 43, 87, 134, 243, 158, 197, 216, 111, 136, 152, 29, 204, 31, 26, 228, 39, 148, 215, 220, 90, 76, 251, 57, 183, 184, 150, 157, 156, 176, 13, 41, 30, 86, 244, 8];for (let _0x7bc200 = 0; _0x7bc200 < 42; _0x7bc200++) {_0x8ff1dd[_0x7bc200] = xxx(_0x6aca75['at'](_0x7bc200), _0x4bda4c["charAt"](_0x7bc200)['charCodeAt']());}for (let _0x4f674a = 0; _0x4f674a < 42; _0x4f674a++) {_0x8ff1dd[_0x4f674a] = xxx(_0x8ff1dd['at'](_0x4f674a), _0x6aca75['at'](41 - _0x4f674a));}console["log"](_0x8ff1dd);return _0x8ff1dd;
}function fff() {var _0xe4960c = "flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}",_0x55dae6 = enc(_0xe4960c),_0xbb5ecd = [135, 25, 72, 151, 195, 212, 228, 212, 250, 101, 39, 77, 163, 77, 70, 167, 119, 184, 7, 77, 144, 154, 93, 10, 185, 48, 179, 77, 71, 163, 67, 61, 113, 156, 196, 136, 239, 241, 128, 93, 84, 156];for (let _0x37df9d = 0; _0x37df9d < 42; _0x37df9d++) {if (_0x55dae6['at'](_0x37df9d) != _0xbb5ecd['at'](_0x37df9d)) {console["log"]("Error");return;}}console["log"]("YES");return;
}fff();

也可以尝试自己修改变量名和函数名进一步优化 ,优化后稍微好看一点

function xor(a,b) {return a ^b;
}function enc(flag) {var Str3 = [],Str2 = [233, 129, 127, 238, 145, 144, 11, 43, 87, 134, 243, 158, 197, 216, 111, 136, 152, 29, 204, 31, 26, 228, 39, 148, 215, 220, 90, 76, 251, 57, 183, 184, 150, 157, 156, 176, 13, 41, 30, 86, 244, 8];for (letj = 0;j < 42;j++) {Str3[_0x7bc200] = xor(Str2['at'](_0x7bc200), flag["charAt"](_0x7bc200)['charCodeAt']());}for (let k = 0; k < 42; k++) {Str3[k] = xor(Str3['at'](k), Str2['at'](41 - k));}console["log"](Str3);return Str3;
}function fff() {varflag = "flag{xxxxxxxxxxxxxxxxxxxxxxxxxx}",result = enc(flag),Str = [135, 25, 72, 151, 195, 212, 228, 212, 250, 101, 39, 77, 163, 77, 70, 167, 119, 184, 7, 77, 144, 154, 93, 10, 185, 48, 179, 77, 71, 163, 67, 61, 113, 156, 196, 136, 239, 241, 128, 93, 84, 156];for (let i = 0; i < 42; i++) {if (result['at'](i) != Str['at'](i)) {console["log"]("Error");return;}}console["log"]("YES");return;
}fff();

函数的大致思路是flag^str2^str2的反转字符串=str,写脚本解密:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){char data[]={135, 25, 72, 151, 195, 212, 228, 212, 250, 101, 39, 77, 163, 77, 70, 167, 119, 184, 7, 77, 144, 154, 93, 10, 185, 48, 179, 77, 71, 163, 67, 61, 113, 156, 196, 136, 239, 241, 128, 93, 84, 156};char Buffer[]={233, 129, 127, 238, 145, 144, 11, 43, 87, 134, 243, 158, 197, 216, 111, 136, 152, 29, 204, 31, 26, 228, 39, 148, 215, 220, 90, 76, 251, 57, 183, 184, 150, 157, 156, 176, 13, 41, 30, 86, 244, 8};char flag[100];
int i;
for(i=0;i<42;i++){flag[i]=data[i]^Buffer[i]^Buffer[41-i];printf("%c",flag[i]);
}return 0;
}

未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64043.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫实战(一)Python+selenium自动化获取数据存储到Mysql中

行话说得好&#xff0c;“爬虫学得好&#xff0c;牢饭吃到饱&#xff01;”哈哈博主是因这句话入的坑&#xff0c;不为别的就为邀大家一起铁窗泪&#xff08;bushi&#xff09;&#xff0c;本人虽小牛一只&#xff0c;但是喜爱捣鼓技术&#xff0c;有兴趣的小伙伴们可以共同探讨…

自学 AI 一年的体会(1):谈技术书籍出版的长长短短

自学AI近一年&#xff0c;发现打开了一片新的技术大门&#xff0c;不再局限于漏洞攻防这块地盘&#xff0c;更关键是AI可以应用于诸多领域&#xff0c;甚至已不局限于计算机领域了&#xff0c;能搞的事情更多了。在此期间&#xff0c;自己也使用NLP自然语言处理技术开发出多个模…

自学大语言模型之GPT

GPT火爆的发展史 2017年6月OpenAI联合DeepMind首次正式提出的&#xff1a;Deep Reinforcement Learning from Human Preferences&#xff0c;即基于人类偏好的深度强化学习&#xff0c;简称RLHF 2017年7月的OpenAI团队提出的对TRPO算法的改进&#xff1a;PPO算法 GPT-1&#…

考研党福利?ChatGPT秒杀了所有408考研编程题……

来源&#xff1a;新智元 本文均由ChatGPT生成 那么&#xff0c;ChatGPT可以解决408中的编程题吗&#xff1f; 直接结论&#xff1a;由ChatGPT给出的408代码90%可以拿满分 2023年408的编程题 哟&#xff0c;看着还行 2022年408编程题 解答题回答的也不错 2021年408编程题 ChatGP…

chatgpt赋能python:Python编程题怎么搜答案

Python编程题怎么搜答案 Python是一种高级编程语言&#xff0c;具有易读性、简洁性和可重用性等优点&#xff0c;因此越来越多的程序员选择使用Python开发应用程序。但是在面对Python编程题的时候&#xff0c;即使你已经有了10年的编程经验&#xff0c;可能也会遇到一些问题。…

利用ChatGPT学习编程,让你成为新时代程序员

大家好&#xff0c;我是静幽水&#xff0c;目前是一名大厂全栈工程师&#xff0c;擅长Java后端&#xff0c;Vue前端&#xff0c;小程序编程&#xff0c;Python编程&#xff0c;ChatGPT 提示词等技术。我会分享一些相关的干货知识&#xff0c;感兴趣的话就关注我吧&#xff0c;希…

活学活用虚拟环境,Python编程更高效

介绍4种在Python中使用虚拟环境的方法。 微信搜索关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 本文将涵盖以下主题&#xff1a;什么是python中的虚拟环境&#xff1f;为什么需要虚拟环境&#xff1f;在Python中设置虚拟环境的4种不同方法。本文将…

用好这两个方法,解决Python中的线程同步问题

了解互斥锁和连接&#xff0c;实现Python中安全有效的多线程。 微信搜索关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 同步的重要性是什么&#xff1f; 假设有一个共享的家庭银行账户&#xff0c;余额为50美元&#xff0c;属于你和你父亲。 爸爸挣…

了解Python编码风格,让你的代码更好看

和其他编程语言不同&#xff0c;Python有一套独特的编码风格&#xff0c;掌握Python的编码风格对于编写优美的代码至关重要。 微信搜索关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 本文是一篇快速了解Python编码风格的指南&#xff0c;了解Python…

国家电网可视化平台完工交付给客户!

国家电网可视化平台完工交付给客户&#xff0c;助力电网信息化&#xff01; 转载于:https://www.cnblogs.com/shuzikeji/p/7844358.html

2019年南方电网和国家电网考纲对比(通信类)

最近在准备关于国家电网和南方电网的校园招聘笔试&#xff0c;整理了如上内容&#xff0c;仅供参考&#xff0c;小结如下&#xff1a; 南方电网&#xff1a; 批次&#xff1a;南方电网校园招聘考试一般每年只有一批&#xff0c;比重&#xff1a;比较注重面试环节&#xff0c;面…

国家电网 计算机 《信息新技术》 整理

信息新技术概论 分布式处理基础分布式数据库&#xff08;DDB,Distributed Database)︰分布式文件系统(DFS&#xff0c;Distributed File System)区块链(Blockchain)&#xff1a; 物联网基础基本概念 大数据基础人工智能基础神经网络(NNsNeural Networks)机器学习 典型硬件技术基…

【NLP】千呼万唤始出来——GPT-3终于开源!

文 | 小戏编 | 小轶 GPT3终于开源&#xff01;不过&#xff0c;不是官方开的&#xff08;别打我 Eleuther AI推出的名为GPT-Neo的开源项目&#xff0c;于今晨4点于twitter正式宣布&#xff1a;已经开源了复现版GPT-3的模型参数&#xff08;1.3B和2.7B级别&#xff09;&#xff…

属于自己的贾维斯

属于自己的贾维斯之Python学习 人生第一次写博客&#xff0c;想记录下自己的学习过程&#xff0c;以便以后复习简单(毕竟自己的博客总想知道有没有人来看,就可以顺便过来复习了)&#xff0c;因为用笔的记录感觉都没怎么去看,所以就想用这种方法来记录。因为本人比较懒再加上精神…

七夕送女友什么礼物有意义、送女朋友实用的七夕礼物清单

在即将到来的中国传统情人节——七夕节当中&#xff0c;怎样送女朋友实用又用心的礼物呢&#xff1f;想必有不少男生朋友们不知道怎么选择吧&#xff01;要知道合适的礼物可以在改善生活质量的同时也为彼此的感情带来惊喜&#xff0c;今天就为大家带来送女朋友实用的5个礼物推荐…

七夕节送女朋友什么礼物、能让女生感动到哭的礼物推荐

七夕作为我国的传统情人节马上就要到来了。在这一天也是恋爱中人相互向对方表达爱意的好时机&#xff0c;精心为对方准备一份七夕礼物也是情理之中的事&#xff0c;但是咱们很多男性小伙伴在面对市面上令人眼花缭乱礼物的时候&#xff0c;在挑选问题上却是不知从何下手了。别担…

程序员如何哄女朋友开心的秘籍,定制给女朋友一个应用(生日礼物)

这算是我写的安卓比较完整的一个应用了吧&#xff0c;不过其实也还不怎么完整&#xff0c;还有好多功能没有加进去&#xff0c;但是由于昨天是女朋友的生日&#xff0c;所以就送给他了&#xff0c;这也是我学习安卓半个月来的第一个应用了“音乐播放器”&#xff01; 制作&…

女朋友过生日送什么礼物好?

观察她喜欢什么 平日里陪她逛街购物时&#xff0c;你留意到她很喜欢一件衣服或是饰品之类的&#xff0c;她可能因为各种原因&#xff0c;没买。你记在心里面&#xff0c;生日前买下了&#xff0c;作为生日礼物送个她&#xff0c;她会非常的欢喜。 如果离过生日还有很长一段时间…

如何做一个网页送给女朋友做生日礼物!感动到哭!

如何做一个网页送给女朋友做生日礼物 本文里面涉及到python&#xff0c;HTML &#xff0c;css,JavaScript的知识&#xff0c;是基于python的flask框架做的一个小型网站&#xff0c;里面可以实现跳转功能&#xff0c;怎么配置flask的环境变量&#xff0c;去官方文档看就好了&am…

情人节送女朋友什么礼物最好?五大首选礼物排行榜单!

一年一度的情人节又要到了&#xff0c;各位男生有没有因为不知道给女朋友们挑选什么礼物而心慌慌&#xff1f;情人节礼物绝对能反映出你对女朋友平时喜好的了解程度&#xff0c;选对了情人节礼物&#xff0c;可以让你们的感情更加甜蜜。今天就来说说有哪几款非常适合送女孩子的…