re2

打开初步分析为32位程序,无壳,拖入IDA32分析

找到关键行47-50,分析得出各函数内部的基本作用如图所示

首先进入分析输入后的处理

可以很明显看出,是对输入的字符串进行处理后再操作,因此根据这个思路写出脚本,得到这里的密钥

#!/usr/bin/python
#coding=utf-8 user = "DH~mqqvqxB^||zll@Jq~jkwpmvez{" flag = ''
for x in range(0, 29):
for y in range(256):
if(ord(user[x])==y^0x1f):
flag+=chr(y) print(flag) #[Warnning]Access_Unauthorized

接着分析加密函数,对加密函数内各函数分析后可得出大致为RC4,因此只要根据给出的加密内容进行逆向解密即可

但是这里加密后的是什么内容是什么不清楚,我盲猜是给出的压缩文件里面的文本,但是这里没有科学依据,后来看到一篇大师傅的WP,他的分析是程序在最初会对enflag.txt的内容进行fopen() w操作,这样会清楚里面的文本,照此来看里面的东西其实没有被用过,因此可以推断他就是要加密的原始文本,因此在同目录下创建flag.txt,放入文本,解密成功。

r2

打开后得到如下伪代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
size_t v3; // rax
int v5; // [rsp+Ch] [rbp-134h] BYREF
unsigned int i; // [rsp+10h] [rbp-130h]
int v7; // [rsp+14h] [rbp-12Ch]
int v8; // [rsp+18h] [rbp-128h]
int v9; // [rsp+1Ch] [rbp-124h]
int v10; // [rsp+20h] [rbp-120h]
int v11; // [rsp+24h] [rbp-11Ch]
int v12; // [rsp+28h] [rbp-118h]
int v13; // [rsp+2Ch] [rbp-114h]
int v14; // [rsp+30h] [rbp-110h]
int v15; // [rsp+34h] [rbp-10Ch]
unsigned __int64 v16; // [rsp+38h] [rbp-108h]
int v17[8]; // [rsp+40h] [rbp-100h]
char s[5]; // [rsp+60h] [rbp-E0h] BYREF
char v19[107]; // [rsp+65h] [rbp-DBh] BYREF
char dest[104]; // [rsp+D0h] [rbp-70h] BYREF
unsigned __int64 v21; // [rsp+138h] [rbp-8h] v21 = __readfsqword(0x28u);
v7 = 80;
v8 = 64227;
v9 = 226312059;
v10 = -1540056586;
v11 = 5;
v12 = 16;
v13 = 3833;
v5 = 0;
puts("plz input the key:");
__isoc99_scanf("%s", s); // 输入key
v3 = strlen(s); // 计算输入长度
strncpy(dest, v19, v3 - 6); // 将s的6~strlen(s)-1位复制到dest,输入s的长度不小于6
dest[strlen(s) - 6] = 0; // 最后1位置0
__isoc99_sscanf(dest, "%x", &v5); // 读取dest中16进制数到v5
v17[0] = v7;
v17[1] = v8;
v17[2] = v9;
v17[3] = v10;
v17[4] = (v11 << 12) + v12;
v17[5] = v13;
v17[6] = v5;
v16 = 0LL;
for ( i = 0; i <= 6; ++i )
{
for ( v16 += (unsigned int)v17[i]; v16 > 0xFFFF; v16 = v15 + (unsigned int)(unsigned __int16)v16 )// unsigned __int16只保留后4位
{
v14 = (unsigned __int16)v16; // 没用到v14,这行可以忽略
v15 = v16 >> 16;
}
}
if ( v16 == 0xFFFF )
puts("OK");
else
puts("Error");
return 0;
}

从47行可见v16分别加上了v17的前6位,因此前6位是保持不变的,根据题意,v17[6]就是所要求的flag,所以这里可以写出如下程序

#include<stdio.h>
int main() {
int v15 = 0;
unsigned __int64 v16 = 0LL;
int v17[7] = {80, 64227, 226312059, -1540056586, 20496, 3833, 888}; for (int i = 0 ; i <= 6; ++i ) {
for ( v16 += (unsigned int)v17[i]; v16 > 0xFFFF; v16 = v15 + (unsigned int)(unsigned __int16)v16 )
v15 = v16 >> 16;
} if ( v16 == 0xFFFF )
puts("OK");
else
puts("Error"); return 0;
}

调试到即将与v17[6]相加的地方

v16先加上v17[6],然后判断是否大于0xffff,小于等于0xffff即退出循环,由提示最小解,4位值,直接相减就可得出最终结果,最终得到flag即为flag{1a9f}

数学不及格_re3

用IDA打开,可以看到是一个类似于数学方程问题

这里看到v9的值是v4经过函数f处理之后的值,再看一下函数f

可以看出f函数是一个斐波那契的处理过程

这里的处理应当为四个判断等式联立求解,划掉v10-v12,得v4+3*v9;又因为v9为v4下标范围内的斐波拉契数列值,因此通过0<v4<200,有爆破可能性,直接遍历爆破v4与v9。(v4=58,v9=591286729879),后面依次求解v10-v12,并把它们转化为字符串,由此可写出python脚本

def f(n):
li=[]
v9=0
li.append(1)
li.append(1)
for i in range(2, n):
li.append(li[i-1] + li[i-2])
v9=li[i]
return v9 for i in range(1, 199):
v4 = i
v9=f(v4)
if(v4+3*v9==151381742876+117138004530+155894355749+1349446086540):
print(v4, v9)
break v10 = hex(151381742876-v9)
v11 = hex(117138004530-v9)
v12 = hex(155894355749-v9) s='666c61677b6e65776265655f686572657d'
flag=''
for i in range(0, len(s), 2):
flag+=chr(int(s[i:i+2], 16))
print(flag)

可得出结果如下

得到flag问题得解

CTFSHOW-Reverse-刷题记录的更多相关文章

  1. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  2. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  3. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  4. 刷题记录:[HarekazeCTF2019]encode_and_encode

    目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...

  5. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  6. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  7. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

  8. 刷题记录:[DDCTF 2019]homebrew event loop

    目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...

  9. 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System

    目录 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System 知识点 1.padding-oracle attack 2.cbc字节翻转攻击 3.FFMpeg文件读取漏 ...

  10. 刷题记录:[CISCN 2019 初赛]Love Math

    目录 刷题记录:[CISCN 2019 初赛]Love Math 思路一 思路二 总结 刷题记录:[CISCN 2019 初赛]Love Math 题目复现链接:https://buuoj.cn/ch ...

随机推荐

  1. 流量运营(pvuv跳出率漏斗abtest)

    AARRR模型 1. 激活: 拉新,对用户来源渠道进行分析,哪些合作.投放渠道对我们产品更合适 2. 注册: 流量激活之后,如果用户只是点进来就走了,也没什么用,合适的产品功能切合用户需求,才会有转化 ...

  2. Android---mediaplayer 创建和调用顺序

    Android mediaframework创建mediaplayer // java层 ///frameworks/base/media/java/android/media/MediaPlayer ...

  3. vs2019 debug 出现: printf is ambiguous

    在vs中写c++代码时,莫名其妙出现:printf is ambiguous 的错误. 第一步,有设置std namespace 删除后再输入 using namespace std; 第二步.删除u ...

  4. xShell执行js脚本

    var CMD = 'ls'; var INTERVAL = 1; var MAX = 5; var CR = String.fromCharCode(13); var LF = String.fro ...

  5. 2022-03-02英语精读(Returning Youths)

    今天早上没写代码,记录一下英语学习吧~ flee to sw/ from sb(sth)----coastal city-----get one's break----clinch a job/ de ...

  6. centos6放行防火墙8080端口操作

    1. 进入防火墙文件: [ vi /etc/sysconfig/iptables ] 2. 放行8080端口: [ -A RH-Firewall-1-INPUT -m state --state NE ...

  7. 十大经典排序之基数排序(C++实现)

    基数排序 也是采用分桶的思想,但是加入了按位比较的思想(可以理解为每位进行一次计数排序) 思路: 计算数列中最大位数 按位数循环处理每位的排序 代码实现: #include<iterator&g ...

  8. linux中安装启动postgresql教程

    安装: 官网地址:https://www.postgresql.org 选择下载版本: https://www.postgresql.org/ftp/source 下载方式: wget https:/ ...

  9. Java新手问题:输出结果的地方出现红色字体 请问是什么原因?

    英文不是红色但中文是红色 请问各路大佬看一下是不是我代码出现了问题还是怎么滴.

  10. 在VS中使用Wind数据终端API的经验(一)

    因工作需要,使用vs2019来调用Wind金融终端API数据接口.具体步骤按照wind的帮助文档一步步做下来.这里提一下和帮助文档不同的地方. Windows Console APP下,编译项目后出现 ...