rome:

检测到无壳,32位

直接用IDA打开,转到main函数

int func()
{int result; // eaxint v1[4]; // [esp+14h] [ebp-44h]unsigned __int8 v2; // [esp+24h] [ebp-34h] BYREFunsigned __int8 v3; // [esp+25h] [ebp-33h]unsigned __int8 v4; // [esp+26h] [ebp-32h]unsigned __int8 v5; // [esp+27h] [ebp-31h]unsigned __int8 v6; // [esp+28h] [ebp-30h]int v7; // [esp+29h] [ebp-2Fh]int v8; // [esp+2Dh] [ebp-2Bh]int v9; // [esp+31h] [ebp-27h]int v10; // [esp+35h] [ebp-23h]unsigned __int8 v11; // [esp+39h] [ebp-1Fh]char v12[29]; // [esp+3Bh] [ebp-1Dh] BYREFstrcpy(v12, "Qsw3sj_lz4_Ujw@l");printf("Please input:");scanf("%s", &v2);result = v2;if ( v2 == 65 ){result = v3;if ( v3 == 67 ){result = v4;if ( v4 == 84 ){result = v5;if ( v5 == 70 ){result = v6;if ( v6 == 123 ){result = v11;if ( v11 == 125 ){v1[0] = v7;v1[1] = v8;v1[2] = v9;v1[3] = v10;*(_DWORD *)&v12[17] = 0;while ( *(int *)&v12[17] <= 15 ){if ( *((char *)v1 + *(_DWORD *)&v12[17]) > 64 && *((char *)v1 + *(_DWORD *)&v12[17]) <= 90 )*((_BYTE *)v1 + *(_DWORD *)&v12[17]) = (*((char *)v1 + *(_DWORD *)&v12[17]) - 51) % 26 + 65;// A到Oif ( *((char *)v1 + *(_DWORD *)&v12[17]) > 96 && *((char *)v1 + *(_DWORD *)&v12[17]) <= 122 )*((_BYTE *)v1 + *(_DWORD *)&v12[17]) = (*((char *)v1 + *(_DWORD *)&v12[17]) - 79) % 26 + 97;++*(_DWORD *)&v12[17];}*(_DWORD *)&v12[17] = 0;while ( *(int *)&v12[17] <= 15 ){result = (unsigned __int8)v12[*(_DWORD *)&v12[17]];if ( *((_BYTE *)v1 + *(_DWORD *)&v12[17]) != (_BYTE)result )return result;++*(_DWORD *)&v12[17];}return printf("You are correct!");}}}}}}return result;
}

看到最前面的v12字符串,就知道大概是最后用来检验的key串,然后输入v2串

看到最前面把"字符串"v2给临时变量四个字节的result,不太合理

再看看上面的对于变量的定义,这实际上是将字符串存储到了以v2作为首地址开头的栈中

并且由高地址向着低地址存储(注意这是栈)

一直是存到了v11,数一数,一共是22个字节,因为上面那张图表示v11正好存储了“}”

而且上面那几个连续的if都仅仅表示了括号外的东西,没用,仅仅作为标识、

下面直接看最核心的部分

重点来了,*(_DWORD *)&v12[17]表示取v12(最上面的定义的char类型的,占一个字节)的首地址然后强行转化为dd类型的指针,然后再以指针形式赋予这四个字节为一个整数0(也就是

int v12=0)

所有这里可以把*(_DWORD *)&v12[17]这一串东西看作就是一个临时变量,作为index

这里也不要看花眼了

实际上是把int类型的v1并以它为首地址转化为byte类型,此时还是指针,然后指针加上我上述的index,最后才*然后变为一个实际值,实际上就是一个字符串数组

知道了这些以后,下面程序的操作就异常简单,也就是简单的针对大写字母与小写字母做了一个移位,分别是向后移位14位和向后移位18位

这道题的脚本有两种写法

第一种是逆向移位写出脚本

这里推荐用python,因为python是取模运算(C/java是取余运算),取模运算更方便负数情况的移位(你懂的)

下面就是类凯撒加密解密固定脚本

key="Qsw3sj_lz4_Ujw@l"
flag=""for c in key:if c>='a' and c<='z':flag+=chr((ord(c)-18-97)%26+97) elif c>='A' and c<='Z':flag+=chr((ord(c)-14-65)%26+65)else:flag+=cprint(flag)##原始数据加减移位值,-97或者是-65然后%26变为索引值,再加上97或者是65变为asiic码

第二种是正向爆破(就是爆破原flag或者未中间值)

key="Qsw3sj_lz4_Ujw@l"
flag=""
for i in range(16):if key[i]<='Z' and key[i]>='A':for j in range(65,91,1):if ord(key[i]) == (j-51)%26+65:flag+=chr(j)breakelif key[i]<='z' and key[i]>='a':for j in range(97, 123, 1):if ord(key[i]) == (j - 79) % 26 + 97:flag += chr(j)breakelse:flag+=key[i]print(flag)

得到flag{Cae3ar_th4_Gre@t}

easyre

有壳先脱壳,UPX壳

来到主函数

简单看一下,就是把flag的核心部分强制转化为byte类型然后asiic码值减一再花生为索引值再与v4逐个比较

写出脚本

key="*F'\"N,\"(I?+@"
flag=""
list=[]
data="~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$# !\""
for i in range(12):for j in range(len(data)):if key[i]==data[j]:list.append(j)break;for i in range(12):flag += chr(list[i] + 1)print(flag)

flag{U9X_1S_W6@T?}

pyre(python逆向)

是一个pyc文件

拿到在线网站上去反编译

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):num = ((input1[i] + i) % 128 + 128) % 128code += numfor i in range(l - 1):code[i] = code[i] ^ code[i + 1]print code
code = ['%1f','%12','%1d','(','0','4','%01','%06','%14','4',',','%1b','U','?','o','6','*',':','%01','D',';','%','%13']

写出脚本(正逆向,方便对比)

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7input1="flag{Just_Re_1s_Ha66y!}"code=[]
l = len(input1)
for i in range(l):num = ((ord(input1[i]) + i) % 128 + 128) % 128code.append(num)print(code)
for i in range(l - 1):code[i] = code[i] ^ code[i + 1]code = ['\x1f','\x12','\x1d','(','0','4','\x01','\x06','\x14','4',',','\x1b','U','?','o','6','*',':','\x01','D',';','%','\x13']for i in range(len(code)-2,-1,-1):code[i]=chr(ord(code[i])^ord(code[i+1]))print(code)
flag=""for i in range(len(code)):flag+=chr((ord(code[i])-i)%128)print(flag)

flag{Just_Re_1s_Ha66y!}

刮开有奖

无壳打开IDA搜搜main函数搜不到然后搜索字符串查看敏感字符串来到下图

sub_4010F0可正向复盘

下面两个函数有base64有关的敏感字符串

下面两个字符串拿去解码,然后正向复盘得到v7,v10

复盘代码:

#include <iostream>
using namespace std;void sub_4010F0(char *a1, int a2, int a3)
{int result; // eaxint i; // esiint v5; // ecxint v6; // edxresult = a3;for ( i = a2; i <= a3; a2 = i ){v5 = i;v6 = a1[i];if ( a2 < result && i < result ){do{if ( v6 > a1[result] ){if ( i >= result )break;++i;a1[v5] = a1[result];if ( i >= result )break;while ( a1[i] <= v6 ){if ( ++i >= result )goto LABEL_13;}if ( i >= result )break;v5 = i;a1[result] = a1[i];}--result;}while ( i < result );}LABEL_13:a1[result] = v6;sub_4010F0(a1, a2, i - 1);result = a3;++i;}
}int main(){char str[]="ZJSECaNH3ng";sub_4010F0(str,0,10);printf("%s\n",str);return 0;
}

Q:原始IDA中的4*i为什么要变为i?

A:i可以当作是一个index,这些奇奇怪怪的玩意都是数组的变形

得到flag

flag{UJWP1jMp}

buuctf/re/近日总结/rome,pyre等(详细解释)相关推荐

  1. 新手教程:建立网站的全套流程与详细解释

    新手教程:建立网站的全套流程与详细解释 你要是 Baidu 这个话题,得到的结果八成都是广告--他们都会告诉你,"嘿,我(或某公司)这里可以建网站,傻瓜式的哟,快来投奔我吧!" 新 ...

  2. Python精讲Numpy基础,大牛笔记详细解释

    https://www.toutiao.com/a6664936105076326920/ 总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Pyth ...

  3. UIApplication sharedApplication详细解释-IOS

    UIApplication sharedApplication详细解释-IOS 分类: iOS开发2012-07-27 10:25 10287人阅读 评论(2) 收藏 举报 applicationui ...

  4. MongoDB:详细解释mongodb的高级操作,聚合和游标

    前几天总结了mongodb的安装入门.详细解释了增删改查的基本操作,今天再来总结下mongodb更高级的操作,聚合和游标. 一.聚合,mongodb的聚合操作一般分为四种情景,分别是:count.di ...

  5. PySide2 基础入门-创建实例窗口(详细解释)

    PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...

  6. Python之pandas:pandas.set_option函数的参数详细解释

    Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...

  7. linux中useradd的文件路径,linux的useradd命令详细解释

    Linux中的useradd命令顾名思义就是添加用户的命令.下面由学习啦小编为大家整理了Linux的useradd命令的详细解释的相关知识,希望对大家有帮助! linux的useradd命令的详细解释 ...

  8. 英语中的介词详细解释

    英语中的介词详细解释 xixi2015-01-05 10:02:58 转载于:https://www.cnblogs.com/lyhabctranslate/p/4202991.html

  9. ios学习--TableView详细解释

    2019独角兽企业重金招聘Python工程师标准>>> ios学习--TableView详细解释 分类: ios Object-C 2012-05-17 08:48  1714人阅读 ...

最新文章

  1. Eclipse插件的安装方法
  2. d3.js 简易柱形图,入门demo
  3. AngularJS——第3章 指令
  4. 简单使用URLConnection、HttpURLConnection和HttpClient访问网络资源
  5. Nutch 使用metadata plugin捕获页面中的meta标签数据
  6. python自动化办公 51cto_聊聊 Python 办公自动化之一 Excel
  7. 学习布局——getContentPane() setContentPane()
  8. 相当于jQuery .hide()来设置可见性:隐藏
  9. 笑谈ArcToolbox (1) ArcToolbox 的发展方向
  10. Java拥挤度,零基础学JAVA难不难?
  11. 【超详细】Redhat Linux 7/CentOS 7/Oracle Linux 7安装MySQL5.7
  12. lintcode 983. 棒球游戏
  13. PHP pdf转化为图片(PNG)
  14. 2020寒假第二周总结
  15. Polygon 上 3 款最受欢迎的 GameFi 游戏
  16. C++中atan()与atan2()的区别和用法
  17. 大咖面对面 | 燕雀安知Suji之志
  18. 根因定位FluxRank论文背景说明
  19. 2020年司钻(井下)考试申请表及司钻(井下)复审模拟考试
  20. linux内核编程,实现内核之间的调用

热门文章

  1. 全球分布式大会颁奖仪式揭晓,中兴荣获两项大奖!
  2. A - 敌兵布阵(线段树模版题)
  3. 丁卓雅计算机学院,卓雅
  4. python中的类实例的属性查找过程
  5. 微软官方caffe之 matlab接口配置
  6. 【Machine Learning】19.多分类实践:手写数字分类
  7. 24V转5V电流15A-20A同步降压DC-DC稳压IC
  8. python IDLE 字体出现的繁体字问题
  9. 使用 Flutter 之后,CPU占用率降了 50%
  10. 手机android系统锁了怎么解决方法,手机锁码忘了怎么办 四种方法帮你解决【图文教程】...