REVERSE-COMPETITION-NEPCTF

  • hardcsharp
  • 二十六进制
  • easy_mips
  • password
  • worrrrms
  • 勇士打恶龙(unsolved)
  • Qriver(unsolved)
  • Spy-woman(unsolved)

hardcsharp

.Net程序,dnSpy打开,来到main函数
逻辑清晰,获取输入,验证输入的长度以及包络,对输入进行AES加密,和已知的密文比较

直接写脚本即可得到flag

from Crypto.Cipher import AES
import base64
cipher="1Umgm5LG6lNPyRCd0LktJhJtyBN7ivpq+EKGmTAcXUM+0ikYZL4h4QTHGqH/3Wh0"
key=[81,82,87,81,82,87,68,92,94,86,93,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18]
for i in range(len(key)):key[i]^=51
key_str=''.join(chr(i) for i in key)
aes=AES.new(key_str,AES.MODE_ECB)
print(aes.decrypt(base64.b64decode(cipher)))
#Nep{up_up_down_down_B_a_b_A_Nep_nep~}

二十六进制

exe程序,无壳,ida打开
交叉引用字符串"plz input right num:"来到sub_4010A0函数
获取输入,输入的数字字符转成整形数字,进入sub_401120函数对输入进行变换以及check

sub_401120函数,主要的逻辑写在了注释里,结合二十六进制的题目名称,能感觉到一点出题人什么思路,但是具体说不清

实际上脚本比较简单,用二十六进制的思路写就能得到要输入的数字

arr="2163qwe)(*&^%489$!057@#><A"
res="Fb72>&6"
flag=[]
for i in range(len(res)):v4=chr(ord(res[i])^7)index=arr.find(v4)flag.append(index)
sum=0
for i in range(len(flag)-1,0,-1):sum+=flag[i]sum*=26
sum+=flag[0]
print(sum)
#518100101

调试验证一下,输入的数字正确,md5一下即可提交成功

easy_mips

mips文件,无壳,ida7.5打开
main->tty_write
逻辑清晰,读取输入,进入encry对输入进行变换,变换后的输入与已知比较

进入encry函数,首先input的第0个、第5个和第6个值被随即改变
然后input逐位进行一个减运算

写脚本能得到不是完全正确的flag,结合flag格式和题目提示的solar,可以得到正确的flag并提交成功

s="3_isjA0UeQZcNa\\`\\Vf"
v3=5
flag=""
for c in s:flag+=chr(ord(c)+v3)v3+=1
print(flag)
#8ep{sK;ar_is_sotql}
#Nep{solar_is_sotql}

password

apk文件,jads-gui打开
com.nepnep.app.MainActivity
调用verify方法验证输入的key
调用Encrypt.file方法验证输入的password和key

先看verify方法,ida打开libnative-lib.so,看到verify其实就是一个变表base64

用工具解一下变表base64,即可得到key

再看Encrypt.file方法,实际上是个变种RC4,在初始化的地方变了一点

已知密文iArr2和密钥key,解RC4即可得到解压密码

#include<stdio.h>
void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k) //初始化函数
{int i = 0, j = 0;char k[256] = { 0 };unsigned char tmp = 0;for (i = 0; i < 256; i++) {s[i] = 256 - i;//这里和常规RC4不同k[i] = key[i % Len_k];}for (i = 0; i < 256; i++) {j = (j + s[i] + k[i]) % 256;tmp = s[i];s[i] = s[j]; //交换s[i]和s[j]s[j] = tmp;}
}/*
RC4加解密函数
unsigned char* Data     加解密的数据
unsigned long Len_D     加解密数据的长度
unsigned char* key      密钥
unsigned long Len_k     密钥长度
*/
void rc4_crypt(unsigned char* Data, unsigned long Len_D, unsigned char* key, unsigned long Len_k) //加解密
{unsigned char s[256];rc4_init(s, key, Len_k);int i = 0, j = 0, t = 0;unsigned long k = 0;unsigned char tmp;for (k = 0; k < Len_D; k++) {i = (i + 1) % 256;j = (j + s[i]) % 256;tmp = s[i];s[i] = s[j]; //交换s[x]和s[y]s[j] = tmp;t = (s[i] + s[j]) % 256;Data[k] = Data[k] ^ s[t];}
}
void main()
{unsigned char key[] = "th1s_1s_k3y!!!!!";                                        unsigned long key_len = sizeof(key) - 1;unsigned char data[] = { 139, 210, 217, 93, 149, 255, 126, 95, 41, 86, 18, 185, 239, 236, 139, 208, 69 };rc4_crypt(data, sizeof(data), key, key_len);for (int i = 0; i < sizeof(data); i++){printf("%c", data[i]);}
}

用解压密钥解压缩反编译出来的\password\assets\flag.zip即可得到flag

worrrrms

exe程序,无壳,ida打开
main_main->main_FakeFakeMain
获取输入,进入worrrrms_puzzle_ChkPlz进行输入的验证

worrrrms_puzzle_ChkPlz函数,常规SM4,密钥需要解一下base64

from pysm4 import decrypt
from Crypto.Util.number import bytes_to_long,long_to_bytes
import base64
key=base64.b64decode("aWNhbnRlbGx1YXNpbXBsZQ==")
key_long=bytes_to_long(key)
cipher=0x021789C8D9DAFBE50E478C894C1D7AB9
m=decrypt(cipher,key_long)
print(long_to_bytes(m))
#we1come_2_nepCTF

勇士打恶龙(unsolved)

Qriver(unsolved)

Spy-woman(unsolved)

REVERSE-COMPETITION-NEPCTF相关推荐

  1. VK Cup 2016 - Round 1 (Div. 2 Edition) A. Bear and Reverse Radewoosh 水题

    A. Bear and Reverse Radewoosh 题目连接: http://www.codeforces.com/contest/658/problem/A Description Lima ...

  2. BUUCTF reverse题解汇总

    本文是BUUCTF平台reverse题解的汇总 题解均来自本人博客 目录 Page1 Page2 Page3 Page4 Page1 easyre reverse1 reverse2 内涵的软件 新年 ...

  3. 206. Reverse Linked List

    Reverse a singly linked list. 反转单链表 C++(9ms):  迭代 1 /** 2 * Definition for singly-linked list. 3 * s ...

  4. LeetCode 7. Reverse Integer

    问题链接 LeetCode 7 题目解析 给定一个32位有符号整数,求其反转数字. 解题思路 如果是简单反转的话,那这道题就太简单了.题目要求判断溢出问题,32位int类型的范围是-214748364 ...

  5. CUDA Samples: approximate image reverse

    以下CUDA sample是分别用C++和CUDA实现的对图像进行某种类似reverse的操作,并对其中使用到的CUDA函数进行了解说,各个文件内容如下: common.hpp: #ifndef FB ...

  6. C++中std::reverse和std::reverse_copy的使用

    std::reverse:反转排序容器内指定范围中的元素. std::reverse_copy与std::reverse唯一的区别是:reverse_copy会将结果拷贝到另外一个容器中,而不影响原容 ...

  7. leetcode Reverse Linked List

    Reverse a singly linked list 对于这种可以修改值的,把值逆序就可以了....用vector存,然后逆序读. 都忘了指针怎么赋值初始化了.*p=&head; 1 /* ...

  8. 2009 Competition Highlights by ICPC Live

    2009 Competition Highlights by ICPC Live Links:http://www.youtube.com/watch?v=n0oZRcAz6w0 转载于:https: ...

  9. 倒置函数reverse的用法

    倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置,如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321,程序如下: #include<stdi ...

  10. Django视图之介绍、项目准备、URL、路由命名、reverse反解析和Postman测试

    知识点: HttpRequest 位置参数和关键字参数 查询字符串 请求体:表单数据,JSON数据 请求头 HttpResponse HttpResponse JsonResponse redirec ...

最新文章

  1. 一篇文看懂Hadoop
  2. 华为认证数通专家HCIE-Datacom 11月30日发布
  3. .NET 6 即将到来的新特性 — 隐式命名空间引用
  4. MySQL中innodb_page_cleaners详解
  5. WIndows thinpc 精简版的WIN7
  6. 阿里火力全开 IoT!
  7. java接口的作用和意义_java什么是接口?接口有什么作用?接口如何使用?
  8. Qt总结之一:遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(一)
  9. DatabaseMetaData的用法(转)
  10. 银行剧震!国内第一家无人银行来了...
  11. 电子招投标:采购全方位提速、助推全程电子化交易
  12. [CSS]CSS浮动float详解(三):清除浮动方案
  13. java游戏实例_Java游戏俄罗斯方块的实现实例
  14. 程序员必看:一款巨好用的免费简历“神器”(据说有了它,再也不发愁找工作啦!)
  15. 【K8S系列】第四讲:kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义
  16. 步进电机驱动器一体机VSMD122_025T(北京伟恩斯技术有限公司)使用方法
  17. excel两个表格数据对比_Excel表格技巧—如何让两个Excel表格同时显示
  18. 【SQL】Oracle SQL monitor
  19. 网站接入QQ登录(QQ互联)php版的流程
  20. 高软作业1:云笔记软件调研

热门文章

  1. PB datawindow中的文本调整打印长度
  2. .NET操作Excel
  3. [译]预留位置队列PRQueue:多线程程序中消息输入队列和消息输出队列保持同序...
  4. Apache在windows的设置
  5. [剑指offer]面试题第[55-1]题[JAVA][二叉树的深度][BFS][DFS]
  6. CodeForces-887B 技巧DFS
  7. 扩展欧几里得算法 POJ 1061
  8. mysql创建表格1warning_MySQL:创建、修改和删除表
  9. java 文件上传 配置_SpringMVCMultipartFilefile文件上传及参数接收
  10. 使用ping命令检查路由之解惑