SSCTF2020 RE2
SSCTF2020 RE2
有时间做了一下SSCTF 2020的re2
附件地址:
链接:https://pan.baidu.com/s/1k5SuiJIHJzgYZVbc9hX8ZA
提取码:lyco
基本方法:动调
int sub_8310A0()
{
HANDLE v0; // esi
HMODULE v1; // eax
FARPROC v2; // eax
unsigned int v3; // ebx
__int64 v4; // rdi
signed int v5; // kr08_4
unsigned int v6; // ecx
unsigned int v7; // edx
unsigned int v8; // eax
unsigned int v9; // ecx
int v10; // eax
int v11; // edx
unsigned int v12; // ecx
char v13; // al
bool v14; // cf
unsigned int v15; // ecx
const char *v16; // eax
int v17; // eax
int v18; // edx
char v19; // cl
int v20; // edx
char v21; // ch
int v22; // eax
char v23; // cl
int v24; // eax
int v25; // edx
char v26; // ch
char v27; // cl
int v28; // kr28_4
signed int v29; // ecx
unsigned int v30; // ebx
unsigned int v31; // edi
unsigned int v32; // ecx
unsigned int v33; // eax
char v35; // [esp+13h] [ebp-125h]
char v36; // [esp+13h] [ebp-125h]
unsigned int v37; // [esp+14h] [ebp-124h]
int v38; // [esp+14h] [ebp-124h]
int v39; // [esp+18h] [ebp-120h]
char *v40; // [esp+1Ch] [ebp-11Ch]
unsigned int v41; // [esp+20h] [ebp-118h]
signed int v42; // [esp+2Ch] [ebp-10Ch]
int v43; // [esp+30h] [ebp-108h]
int v44; // [esp+34h] [ebp-104h]
int v45; // [esp+38h] [ebp-100h]
int v46; // [esp+3Ch] [ebp-FCh]
int v47; // [esp+40h] [ebp-F8h]
int v48; // [esp+44h] [ebp-F4h]
__int64 v49; // [esp+48h] [ebp-F0h]
int v50; // [esp+50h] [ebp-E8h]
int v51; // [esp+54h] [ebp-E4h]
char *v52; // [esp+58h] [ebp-E0h]
int v53; // [esp+64h] [ebp-D4h]
char v54; // [esp+68h] [ebp-D0h]
char v55; // [esp+69h] [ebp-CFh]
char v56[202]; // [esp+6Ah] [ebp-CEh]
sub_832260((__m128i *)&v54, 0, 0xC8u);
v43 = 0x3B082235;
v44 = 0xFCF20A00;
v45 = 0xE2EED037;
v46 = 0xF3FEFAD6;
v47 = 0xC2101FF5;
v48 = 0xD703FBEC;
v49 = 0xE029FC16FCC9E2FCi64;
v50 = 0xFE1134F0;
LOWORD(v51) = 0x2761;
BYTE2(v51) = 39;
v0 = GetCurrentThread();
v1 = LoadLibraryA("ntdll.dll");
v2 = GetProcAddress(v1, "ZwSetInformationThread");// 反调试,直接修改EIP绕过
((void (__stdcall *)(HANDLE, signed int, _DWORD, _DWORD))v2)(v0, 17, 0, 0);
sub_831020((int)"Pls Input Your Flag:");
sub_831060("%s", &v54, 39);
v3 = (signed int)&v54 >> 31;
HIDWORD(v4) = &v54;
LODWORD(v4) = &v54;
v52 = &v54;
v40 = &v54;
v5 = strlen(&v54);
v53 = v5;
if ( v5 > 0 )
{
v6 = 0;
v37 = 0;
v41 = 0;
do
{
do
{
v7 = v37;
v8 = v41 - 7 * (v6 / 7);
v9 = v41;
*(&v54 + v41) = (*(&v54 + v41) ^ aDdxtqkl[v8]) + 65;// 进行第一次加密,即将输入与对应字符串进行取余异或加65
v10 = v41++;
v37 = (__PAIR__(v37, v9) + 1) >> 32;
v6 = v9 + 1;
}
while ( v5 - 1 != v10 );
}
while ( v7 );
v38 = 0;
HIDWORD(v4) = (signed int)&v54 >> 31;
do
{
v35 = *(_BYTE *)(v4 + 3);
v11 = (unsigned __int64)(v4 + 3) >> 32;
v12 = v4 + 3;
LODWORD(v4) = v4 + 3;
do
{
v13 = *(_BYTE *)(v4 - 1);
v14 = v12-- != 0; // 第二次加密,即分组,每组四位 将每组第四位放在第一位,前三个顺延,即1->2,2->3,3->4
LODWORD(v4) = v12;
v11 = v14 + v11 - 1;
*(_BYTE *)(v12 + 1) = v13;
}
while ( __PAIR__(HIDWORD(v4), v12) != __PAIR__(v11, (unsigned int)v40) );
LODWORD(v4) = v40;
v38 += 4;
*v40 = v35;
v40 += 4;
v4 += 4i64;
}
while ( v53 > v38 );
HIDWORD(v4) = v52;
v3 = (signed int)&v54 >> 31;
}
v15 = 0;
while ( *((_BYTE *)&v43 + v15) == ((unsigned __int8)*(&v54 + v15) ^ 0x61) )// change[0]^0x61与v43[0]
{
if ( *((_BYTE *)&v43 + v15 + 1) != ((unsigned __int8)*(&v55 + v15) ^ 0x61) )// change[1]^0x61与v43[1]
{
++v15;
break;
}
if ( *((_BYTE *)&v43 + v15 + 2) != ((unsigned __int8)v56[v15] ^ 0x61) )// change[2]^0x61与v43[2]
{
v15 += 2;
break;
}
v15 += 3;
if ( v15 >= 39 )
break;
}
v16 = "wtf?\n";
if ( v15 == 39 )
v16 = "you got it!\n";
sub_831020((int)v16);
sub_8395C1("pause");
v42 = 10;
do
{
v36 = *(_BYTE *)(HIDWORD(v4) + 3);
LODWORD(v4) = HIDWORD(v4) + 3;
v17 = __CFADD__(HIDWORD(v4), 3) + v3;
v18 = HIDWORD(v4) + 3;
do
{
v19 = *(_BYTE *)(v18 - 1);
v14 = (_DWORD)v4 != 0;
LODWORD(v4) = v4 - 1;
v18 = v4;
v17 = v14 + v17 - 1;
*(_BYTE *)(v4 + 1) = v19;
}
while ( __PAIR__(HIDWORD(v4), v3) != __PAIR__(v4, v17) );
LODWORD(v4) = HIDWORD(v4) + 3;
v20 = HIDWORD(v4) + 3;
*(_BYTE *)HIDWORD(v4) = v36;
v21 = *(_BYTE *)(HIDWORD(v4) + 3);
v22 = __CFADD__(HIDWORD(v4), 3) + v3;
do
{
v23 = *(_BYTE *)(v20 - 1);
v14 = (_DWORD)v4 != 0;
LODWORD(v4) = v4 - 1;
v20 = v4;
v22 = v14 + v22 - 1;
*(_BYTE *)(v4 + 1) = v23;
}
while ( __PAIR__(HIDWORD(v4), v3) != __PAIR__(v4, v22) );
v24 = HIDWORD(v4) + 3;
v25 = __CFADD__(HIDWORD(v4), 3) + v3;
LODWORD(v4) = HIDWORD(v4) + 3;
*(_BYTE *)HIDWORD(v4) = v21;
v26 = *(_BYTE *)(HIDWORD(v4) + 3);
do
{
do
{
v27 = *(_BYTE *)(v4 - 1);
v14 = v24-- != 0;
LODWORD(v4) = v24;
v25 = v14 + v25 - 1;
*(_BYTE *)(v24 + 1) = v27;
}
while ( HIDWORD(v4) != v24 );
}
while ( v3 != v25 );
*(_BYTE *)HIDWORD(v4) = v26;
v28 = HIDWORD(v4) + 4;
v3 = (__PAIR__(v3, HIDWORD(v4)) + 4) >> 32;
HIDWORD(v4) += 4;
--v42;
}
while ( v42 );
v29 = strlen((const char *)(v28 - 40));
if ( v29 > 0 )
{
*(_QWORD *)&v52 = 0i64;
v30 = 0;
v31 = 0;
v39 = v29 - 1;
do
{
do
{
v32 = v30;
*(_BYTE
*)(v31 + v28 - 40) = aDdxtqkl[v31 % 7] ^ (*(_BYTE *)(v31 + v28 - 40) - 65);
v33 = v31;
v30 = (__PAIR__(v30, v31++) + 1) >> 32;
}
while ( v39 != v33 );
}
while ( v32 );
}
return 0;
}

最底下的迷惑语句不需要管,找到出口就行
#include <stdio.h>
#include <string.h>
int main()
{
char s[]="dDxtQkl";
unsigned char ida_chars[] =
{
0x35, 0x22, 0x08, 0x3B, 0x00, 0x0A, 0xF2, 0xFC, 0x37, 0xD0,
0xEE, 0xE2, 0xD6, 0xFA, 0xFE, 0xF3, 0xF5, 0x1F, 0x10, 0xC2,
0xEC, 0xFB, 0x03, 0xD7, 0xFC, 0xE2, 0xC9, 0xFC, 0x16, 0xFC,
0x29, 0xE0, 0xF0, 0x34, 0x11, 0xFE,0x61,0x27,0x27
};
int i=0;
int j=0,tmp;
for(i=0;i<39;i++){
ida_chars[i]^=0x61;
}
for(i=0;i<39;i=i+4){
tmp=ida_chars[i];
ida_chars[i]=ida_chars[i+1];
ida_chars[i+1]=ida_chars[i+2];
ida_chars[i+2]=ida_chars[i+3];
ida_chars[i+3]=tmp;
}
for(i=0;i<39;i++){
printf("%c",(ida_chars[i]-65)^s[i%7]);
}
return 0;
}

SSCTF2020 RE2的更多相关文章
- 从Google开源RE2库学习到的C++测试方案
最近因为科研需求,一直在研究Google的开源RE2库(正则表达式识别库),库源码体积庞大,用C++写的,对于我这个以前专供Java的人来说真的是一件很痛苦的事,每天只能啃一点点.今天研究了下里面用到 ...
- 09.正则表达式re-2.complie函数
compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下: import re # 将正则表达式编译成 Pattern 对象 pattern = re.compil ...
- ISCC之Re2
硬核rust逆向 首先去学了一天rust...我TMD IDA打开,跟踪主函数 看一下伪代码,发现有一串密文 跟进去发现一串数据,猜测有可能是flag的加密数据,于是回头去分析算法 发现一个关键点 i ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- 完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程
本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程. 1.OPatch替换为最新版本2.数据库软件应用19121551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功 1.OPa ...
- java web学习总结(二十七) -------------------JSP标签介绍
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- 关于如何使用sourcetree将本地项目提交到远端github总结?
使用sourcetree将本地项目提交到github里,目前来说还是很流行的,我也是听说好玩,所以来琢磨了一下,从环境搭建到配置好,差不多用了一下午加一晚上的时间,有点虐心,好吧,废话不多说,介绍一下 ...
- 一个简单移动页面ionic打包成app
先贴JS代码好了,缓动和调整透明度的功能,最后用ionic打包成应用就可以 window.onload=function(){ search(); move(); calc();}function s ...
- js实现一个简单计算器
代码如下,仅支持webkit <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
随机推荐
- 在线思维导图Ayoa可以用来梳理双十一优惠规则哦
一年一度的双十一又要来了,小伙伴们是否准备好开始买买买了呢?今年双十一,遇上英雄联盟S10总决赛,1/4决赛苏宁对上京东也让这个"电商大战"产生了很多有趣的梗.当然在玩梗的同时,广 ...
- 使用Camtasia创作抖音卡点视频
空闲的时候刷一刷抖音相信已经成为很多人的日常啦,抖音里面的视频形式多种多样,而其中的卡点视频更是被大家热烈追捧.如果你外出旅行拍摄了很多好看的照片,就很适合用卡点视频的形式展现出来. 如果你想要制作这 ...
- 《HelloGitHub》第 56 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- Luogu P43916 图的遍历
我们把"u点能够到达的最大点"转化为反向图中能到达u点的所有点里的最大值,可知缩点后满足无后效性.val[i]的初值设为连通分量i中的最大点.反向存图,tarjan缩点,拓扑序dp ...
- JavaSE 学习笔记03丨继承、接口、多态、内部类
Chapter. 5 继承 继承作为面向对象的三大特征之一,它是多态的前提.它主要解决的问题是共性抽取. Java中的继承,是单继承.多级继承的. 已存在的类,被称为超类.基类.父类(parent c ...
- kafka入门之broker-副本与ISR设计
kafka把分区的所有副本均匀地分配到所有broker上,并从这些副本中挑选一个作为leader副本对外提供服务,而其他副本被称为follower副本,只能被动地向leader副本请求数据,从而保持与 ...
- 新手上路之JDK11的下载、安装与PATH环境变量的配置
目录 JDK11的下载 找到目标JDK JDK的下载 JDK11的安装 PATH环境变量的配置 为什么要配置环境变量? 配置前再检查一遍 配置变量 检查环境变量配置成功与否 细究起来,JDK11与JD ...
- 基于java实现的简单网页日历功能,有兴趣得可以把它转换到前端实现
之前做项目的时候,因为要用到不同日期显示不同的内容,就自己做了一个日期的显示和选择功能,今天抽空把以前的代码理了一下,顺便就把之前做的日期功能给拿出来回顾一下,大家可以提点意见,帮忙完善下设计.先上一 ...
- win10拔下电源会黑一下屏
- TextClip的list和search方法报错:UnicodeDecodeError: utf-8 codec canot decode byte 0xb7 in position 8
☞ ░ 前往老猿Python博文目录 ░ 由于moviepy对多语言环境支持存在一些问题,因此在执行TextClip.list('font')和TextClip.search('GB','font') ...