buu逆向刷题(三)
1. [BJDCTF2020]JustRE
点击次数,IDA找到逻辑,OD直接跳到相应位置,改掉比较的值,获取flag。
2.Youngter-drive
upx壳的反调试,upx脱壳,IDA可以打开,但OD不行。
IDA打开
逻辑清晰,奇偶位置字符操作创建两个线程,一个线程对source字符串操作,同时dword_418008减1(此变量用于计数),另一个线程dword_418008减1,也就是说计数变量每次会减2,接着考虑到计数变量开始是29,所以source字符串里只有奇数位置的字符会被操作,偶数字符保持不变。同时计数变量从29开始,即source字符串30个字符。
sub_411190()函数只比较前29个字符。比较的字符与原本字符的长度不同
看看对source字符串做了如何的操作,StartAddress函数往里点,点到sub_41112C函数反编译不了,报错(411A04:positive sp value has been found),IDA 调整栈帧 参考链接
1)打开Option->General->stack pointer勾选
2)找到红色区域
3)ALT+K盘它
4)不知道该多少就试一试,只要最下面的-04改成0以上就可F5。
修改后
脚本:
s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm' #off_418000
d = 'TOiZiZtOrYaToUwPnToBsOaOapsyS' #off_418004
f = ''
for i in range(len(d)):if i%2 == 0:f = f + d[i]else:if(d[i].isupper()):f = f + chr(s.find(d[i])+96)else:f = f + chr(s.find(d[i])+38)
print(f)
#ThisisthreadofwindowshahaIsES
最后一个字符试了试发现是E, ThisisthreadofwindowshahaIsESE提交
3.[2019红帽杯]easyRE
搜索字符串,找到关键函数sub_4009C6,一个异或,一个10次的base64加密
1)异或脚本
tmp=[73,111,100,108,62,81,110,98,40,111,99,121,127,121,46,105,127,100,96,51,119,125,119,101,107,57,123,105,121,6![在这里插入图片描述](https://img-blog.csdnimg.cn/20200927105642121.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA1NTI2OQ==,size_16,color_FFFFFF,t_70#pic_center)
1,126,121,76,64,69,67]
flag=[0 for i in range(36)]
for i in range(36):flag[i]=tmp[i]^i
print(''.join(map(chr,flag)))
#Info:The first four chars are `flag
2)base64 10次解密后得https://bbs.pediy.com/thread-254172.htm,这个网站没有flag。
没有flag,从哪里找,有些函数在不知道的的地方执行。base6410次解密的字符串,下面有可疑字符
交叉引用过去可以看到
再交叉引用,在fini段代码,程序结束的时候会运行。
两个异或,第一个异或是个“flag”反复异或得到一串字符串,第二个异或是与干刚才得到的字符串的前4个再反复异或,得到flag。
tmp=[0x40,0x35,0x20,0x56,0x5d,0x18,0x22,0x45,0x17,0x2f,
0x24,0x6e,0x62,0x3c,0x27,0x54,0x48,0x6c,0x24,0x6e,
0x72,0x3c,0x32,0x45,0x5b]
secret='flag'
v4=[0 for i in range(25)]
flag=[0 for i in range(25)]
for i in range(25):v4[i]=tmp[i]^ord(secret[i%4])
print(v4)
for i in range(25):flag[i]=tmp[i]^v4[i%4]
print(''.join(map(chr,flag)))
#flag{Act1ve_Defen5e_Test}
4.相册
apk文件,jeb打开,题目提示邮件地址,ctrl+f搜索mail。找到关键函数sendMailByJavaMail。
c2变量是关键,邮件来自那里就是邮件地址。
MAILFROM是加载外部so文件中NativeMethod.m()函数所返回的值。IDA打开apk解压的so文件,MTgyMTg0NjUxMjVAMTYzLmNvbQ==,base64解密就是flag。
5.[ACTF新生赛2020]easyre
UPX的壳,脱壳,拖入ida,
虽然输入是v19,但下面的v16-1作为下标去取某一数组的值,这些值已知,所以v16可求。试求一下v16,求出来提交竟然对了
v4=[42,70,39,34,78,44,34,40,73,63,43,64]
tmp='~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('+chr(0x27)+'&%$# !'
pos=[0 for i in range(12)]
for i in range(12):pos[i]=tmp.find(chr(v4[i]))+1
print(''.join(map(chr,pos)))
#U9X_1S_W6@T?
加上flag,提交就可
6.[SUCTF2019]SignIn
IDA打开
sub_96A
将输入字符的ascii值(以十六位表示),转成字符格式即54—>‘54’
有点意思,注意体会。
下面就是一个已知公钥的RSA算法,上脚本、
import gmpy2
import rsa
e=65537
n=103461035900816914121390101299049044413950405173712170434161686539878160984549
p=366669102002966856876605669837014229419
q=282164587459512124844245113950593348271
phin=(q-1)*(p-1)
d=gmpy2.invert(e,phin)
print(d)
enstr=0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
destr=gmpy2.powmod(enstr,d,n)
flag0=hex(destr)[2:]
flag1=bytes.fromhex(flag0)
flag=str(flag1,'utf-8')
print(flag)
解出来的原文10进制表示,再转成16进制。hex与fromhex见本菜鸡曾写的CTF逆向中的字符与数字。
7.[GUET-CTF2019]re
UPX的壳,elf文件,所以在linux系统下脱壳,脱壳打开后
直接找到关键函数,简单的除法就可逆向,考虑z3求解,由于都是整数,声明变量时Int即可
from z3 import *
s=Solver()
a1=[0 for i in range(32)]
for i in range(32):a1[i]=Int('a1['+str(i)+']')
s.add ( 1629056 * a1[0] == 166163712 )
s.add ( 6771600 * a1[1] == 731332800 )
s.add ( 3682944 * a1[2] == 357245568 )
s.add ( 10431000 * a1[3] == 1074393000 )
s.add ( 3977328 * a1[4] == 489211344 )
s.add ( 5138336 * a1[5] == 518971936 )
s.add ( 7532250 * a1[7] == 406741500 )
s.add ( 5551632 * a1[8] == 294236496 )
s.add ( 3409728 * a1[9] == 177305856 )
s.add ( 13013670 * a1[10] == 650683500 )
s.add ( 6088797 * a1[11] == 298351053 )
s.add ( 7884663 * a1[12] == 386348487 )
s.add ( 8944053 * a1[13] == 438258597 )
s.add ( 5198490 * a1[14] == 249527520 )
s.add ( 4544518 * a1[15] == 445362764 )
s.add ( 3645600 * a1[17] == 174988800 )
s.add ( 10115280 * a1[16] == 981182160 )
s.add ( 9667504 * a1[18] == 493042704 )
s.add ( 5364450 * a1[19] == 257493600 )
s.add ( 13464540 * a1[20] == 767478780 )
s.add ( 5488432 * a1[21] == 312840624 )
s.add ( 14479500 * a1[22] == 1404511500 )
s.add ( 6451830 * a1[23] == 316139670 )
s.add ( 6252576 * a1[24] == 619005024 )
s.add ( 7763364 * a1[25] == 372641472 )
s.add ( 7327320 * a1[26] == 373693320 )
s.add ( 8741520 * a1[27] == 498266640 )
s.add ( 8871876 * a1[28] == 452465676 )
s.add ( 4086720 * a1[29] == 208422720 )
s.add ( 9374400 * a1[30] == 515592000 )
s.add(5759124 * a1[31] == 719890500)
print(s.check())
answer=s.model()
print(answer)
算出来,32位,又仔细去看题目,发现a1[6]出题人就没给,所以开始试,是1。
本题题目的名字是re,所以我将相关py文件都命名成re.py,这就出现了问题,linux和win下都会自动将我写的这个re文件作为配置文件,导致报错。
z3跑出来一长溜数字,自然高兴,大致一看是按从大到小顺序排列,实则不然,16和17两个位置颠倒,细节注意。
a1 = [0]*32
a1[31] = 125
a1[30] = 55
a1[29] = 51
a1[28] = 51
a1[27] = 57
a1[26] = 51
a1[25] = 48
a1[24] = 99
a1[23] = 49
a1[22] = 97
a1[21] = 57
a1[20] = 57
a1[19] = 48
a1[18] = 51
a1[16] = 97
a1[17] = 48
a1[15] = 98
a1[14] = 48
a1[13] = 49
a1[12] = 49
a1[11] = 49
a1[10] = 50
a1[9] = 52
a1[8] = 53
a1[7] = 54
a1[5] = 101
a1[4] = 123
a1[3] = 103
a1[2] = 97
a1[1] = 108
a1[0] = 102
for i in range(32):if i == 6:continueprint(chr(a1[i]), end="")
8.[ACTF新生赛2020]rome
ida打开,逻辑清晰,爆破处理
x = [81,115,119,51,115,106,95,108,122,52,95,85,106,119,64,108]
flag = ''
for k in range(0,16):for i in range(0,127):z=iif i > 64 and i <= 90:i = (i-51)%26 + 65if i > 96 and i <= 122:i = (i-79)%26 + 97if(i == x[k]):flag += chr(z)print(flag)
#Cae3ar_th4_Gre@t
对爆破脚本的新理解,z=i,保存原始状态,flag+=chr(z),将原始状态加入flag。(之前一直不理解为何z=i再赋值一遍,笑哭.png)
9.[FlareOn4]login
给了一个网页,ctrl+u看源码,找到核心部分
其中涉及的js函数均可百度,想不明白就在纸上算算。ROT13替换,为啥是13,而不是别的,因为26个英文字母,一半是13,正着走或倒着走均可走到13位的替换位置,这样想可以出一个1到10的,整个ROT5。
具体做法:把密文在输入一遍,在if前加一个 alert(rotFlag),点击就会弹出flag
10.[V&N2020 公开赛]strangeCpp
是c++程序,搜索字符串找到的内容一脸懵,
根据提示,找到字符串,发现一串可疑字符串被sub_140013580引用,看着像是flag,搜索引用找到代码,分析逻辑发现是,找一个数经过sub_140011384运算得607052314,且这个数小于等于14549743,这个值可以爆破出来,爆破出来的结果和byte_140021008异或。
整数爆破
v8=0
for i in range(14549743):tmp=(((i<<8)^(i>>12))*291)&0xffffffffif tmp==607052314:v8=ibreaka=[0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x04, 0x75, 0x68, 0x34,0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D, 0x6F, 0x6D, 0x00]
print(v8)
for j in range(17):print(chr((v8^a[j])&0xff),end="")
#123456
#flag{MD5(theNum)}
11. [BJDCTF2020]easy
Do you find me?一看就知道,真正的函数肯定不易找到,
ques函数,找到了,这个函数提到了几个概念LODWORD,HIDWORD,SHIDWORD。我没找到具体的这几个的定义,只知道这是IDA的宏定义,参考了师傅的WP,找到了这个(下图):
类比过来就可,V14的值就是64位,SHIDWORD这个的S是signed有符号的意思,然后看向V2赋值的算法。看着花哨,实际就是v14。
SHIDWORD本身是v14的高32位,由于是有符号数,最高位为0,右移31位刚好是0。
接下来,打印’*‘字符,形成flag
#include<iostream>
using namespace std;
int main() {char v2[10][100] = {"10001001001111110001111111111110100111111000110001",
"10001010101000010010001000010010100100001000111001",
"11111111111000011100001000010011111111001000110101",
"10001100011000010110001000010000100100001000110011",
"10001100011111110001111110010000100100001111110001",};int v15 = 0;for (int i = 0; i <= 4; i++) {for (int j = 0; j < 50; ++j) {if (v2[i][j]=='1'){cout << "*";++v15;}else {cout << " ";++v15;}if (v15%5==0){cout << " ";}}cout << endl;}
}
buu逆向刷题(三)相关推荐
- BUU CTF刷题之旅(Web第一页)
前言: 之前本人是在CTFHub上刷题,已经有了一些基础,是时候换成更难的BUU了! 这里将会记录一些做题过程,希望也可以帮助到大家 [极客大挑战 2019]EasySQL 这道题主要是一个恒真的想法 ...
- BUU WEB刷题记录1(持续更新)
[MRCTF2020]你传你马呢 打开得到一张晦气的图片和文件上传点 尝试直接上传PHP文件失败(意料之中),随便上传了一张png图片,发现可以,将png文件内容改写成一句话木马<?php @e ...
- 【SQL刷题】Day9----SQL过滤数据专项练习
博主昵称:跳楼梯企鹅 博主主页面链接:博主主页传送门 博主专栏页面连接:专栏传送门--网路安全技术 创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各 ...
- 【SQL刷题】Day13----SQL分组数据专项练习
博主昵称:跳楼梯企鹅 博主主页面链接:博主主页传送门 博主专栏页面连接:专栏传送门--网路安全技术 创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各 ...
- BUU刷题记录——Misc(一)
文章目录 前言: 1.九连环 2.面具下的flag 3.刷新过的图片 4.snake 5.[BJDCTF 2nd]圣火昭昭 前言: 最近学习之余在BUU上刷了几道misc题,有一些没接触过的知识,挺有 ...
- leetcode刷题(三)——容斥原理
leetcode刷题系列三.这一节的内容主要是容斥原理的题目和题解. 百度百科上容斥原理的解释: 在计数时,必须注意没有重复,没有遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法 ...
- C语言二级题库(刷题软件+60套真题+填空题+大题)2022年9月份新题第三套
文章只能发选择题,刷大题去刷题软件效果会更好 刷题软件 gongzhonghao:露露IT 选择题 1.下面选项中不是关系数据库基本特征的是_______. A. 不同的列应有不同的列名 B. 不同的 ...
- 洛谷刷题C语言:闰年判断、Apples、洛谷团队系统、肥胖问题、三位数排序
记录洛谷刷题QAQ 一.[深基3.例3]闰年判断 题目描述 输入一个年份,判断这一年是否是闰年,如果是输出 111,否则输出 000. 输入格式 输入一个正整数 nnn,表示年份. 输出格式 输出一行 ...
- python二级题库(百分之九十原题) 刷题软件推荐 第三套
目录 刷题软件(模拟python二级考试): 公众h:露露IT 回复:python二级 一.选择题 二.基本操作 三.简单应用 四.综合应用 刷题软件(模拟python二级考试): 公众h:露露IT ...
- 新手入门刷题(专题三)暴力枚举
新手入门刷题(专题三)暴力枚举--->持续更新 4.14 统计方形(数据加强版) 题目描述 有一个 n×m 方格的棋盘,求其方格包含多少正方形.长方形(不包含正方形). 输入格式 一行,两个正整 ...
最新文章
- Android setOnPageChangeListener 过时了怎么办?
- NetBpm 组织架构(4)
- 【网络安全】 利用 EHole 进行红队快速批量打点
- zbb20190528 城市经纬度json
- jQuery 实现一个简单的信息反馈或者信息收集的页面
- arm9260 linux编译,关于linux9260烧写软件和gdb调试器的使用
- opengl学习笔记 (一)
- python面试题之简要描述Python的垃圾回收机制(garbage collection)
- MVC实战之排球计分(六)—— 使用EF框架,创建Controller,生成数据库。
- c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
- C#获取注册表指定键值操作
- 震惊!CSDN免费送会员,手慢无!
- python解一元一次方程标准形式_一元一次方程的标准形式的概念以及解法
- MYSQL中linux的前戏
- 跨越OpenGL和D3D的鸿沟
- qrect在图片上显示矩形框_教你一招把身份证扫描到手机上,非常清晰!真是太方便了...
- cesium实现飞线特效
- WANLSHOP 直播短视频种草多用户电商系统源码自营+多商户+多终端(H5+小程序+APP)
- POI动态导出多层表头的EXCEL文件
- CRM系统是什么?它有什么作用?
热门文章
- python画图代码太阳花七行代码_写代码并不枯燥“用Python几行代码教你画出太阳花”...
- HDU1071微积分公式求曲线面积
- 台式机配置网站服务器,台式机搭建服务器的配置
- str在c语言什么意思,C语言(str)是什么意思
- AutoCAD启动缓慢
- 财富提升成都IT产业吸引力
- 途家2020校招算法笔试题——寻找最大数——背包问题
- 塔防游戏制作教程(二)
- windows bat脚本 启动和停止程序
- Oracle GoldenGate for Oracle 11g(Solaris 10 x86-64) to Oracle 10g(CentOS 4.8) configuration