REVERSE-PRACTICE-BUUCTF-12

  • [WUSTCTF2020]level3
  • crackMe
  • [FlareOn6]Overlong
  • [WUSTCTF2020]Cr0ssfun

[WUSTCTF2020]level3

elf文件,无壳,ida分析
main函数中,获取输入,对输入做base64编码,提示有错误,在程序中有一个奇怪的字符串,提示和标准base64不同,估计是变表base64

进入base64_encode函数,正常的base64编码逻辑,对base64_table交叉引用,发现在O_OLookAtYou函数中也有对base64_table的引用

进入O_OLookAtYou函数,果然是对base64_table的变换

之前也遇到过变表base64的题目,见REVERSE-PRACTICE-BUUCTF-7
直接拿脚本来用了,执行脚本即可得到flag

#coding:utf-8
#base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  原表
base=[0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A,0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54,0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64,0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38, 0x39, 0x2B, 0x2F]  #原表的ascii码表示,方便进行原表变换
#对原表进行变换
for i in range(0,10):base[i],base[19-i]=base[19-i],base[i]
#base_changed是变表,需要转成字符串的形式
base_changed=''.join(chr(i) for i in base)
print("Current Base:\n%s " %base_changed) #打印base_changed变表
def base64_decode(inputs): #inputs是base64字符串# 将字符串转化为2进制bin_str = []for i in inputs:if i != '=':x = str(bin(base_changed.index(i))).replace('0b', '')bin_str.append('{:0>6}'.format(x))# 输出的字符串outputs = ""nums = inputs.count('=')while bin_str:temp_list = bin_str[:4]temp_str = "".join(temp_list)# 补足8位字节if (len(temp_str) % 8 != 0):temp_str = temp_str[0:-1 * nums * 2]# 将四个6字节的二进制转换为三个字符for i in range(0, int(len(temp_str) / 8)):outputs += chr(int(temp_str[i * 8:(i + 1) * 8], 2))bin_str = bin_str[4:]print("Decoded String:\n%s " % outputs)
#enc是经变表base64编码的字符串
enc="d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=="
base64_decode(enc)

运行结果

crackMe

exe程序,运行后输入用户名welcomebeijing和密码,输入错误要重新输入,无壳,ida分析
在wmain函数中,获取输入的user和password并检验长度且均为数字或字母,在sub_401090函数中,由输入的user(welcomebeijing)生成了一个固定的table,这个table在下面的check函数中也有引用
sub_4011A0函数是个传入的两个参数赋值,第一个参数赋为"Congratulations",第二个参数赋为"please try again",由check函数的返回结果决定输出

进入check函数
先看第一个while循环体,在该循环体中,v15被赋值,而且v15在下一个循环体中有引用,经调试可知,该循环体实际是将pwd的内容两两分组,每两个字符组成一个十六进制数放入v15中,例如,输入的pwd为0123456789abcdef,v15的元素为0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF

接着看第二个循环体,v15实际就是输入的pwd,要和table的元素异或,存入v17,而table的元素由v8和v13决定,v8和v13又由v11和v12决定,可以看到,在异或运算的上下,有两条判断当前是否处于调试状态的if语句,如果是调试状态,则会修改v13,v11,v12的值,也就是说,有两个地方存在反调试,但我们并不知道进行异或运算的table的元素到底是什么,由之前的分析可知,table的全部元素是由输入的user确定的,于是可以通过调试获知进行异或运算的table的元素,因此需要把反调试的两条语句nop掉或修改跳转逻辑,使在调试状态下,不执行if成立的语句

下图为修改跳转逻辑,将.text:00CA1AE8和.text:00CA1B5E两处指令的jz改成jnz,就实现了调试状态下,不执行if成立的语句,注意修改跳转逻辑后要应用到可执行程序exe

下图为修改跳转逻辑后的效果,再往下走,sub_CA1710函数是对v17和user(welcomebeijing)进行异或,while循环体结束后,sub_CA1470函数是对v17的验证,v17在经过一系列运算后的结果应为"dbappsec",长度为8

写脚本前需要先通过调试得到与v15进行异或运算的8个table的元素,为[0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd],写脚本,提交第二个md5值成功

[FlareOn6]Overlong

exe程序,运行后提示说没有破坏编码,冒号后面没有内容,无壳,ida分析
start函数,unk_402008作为参数传入了sub_401160函数参与运算,运算长度为第三个参数28,运算结果放入Text中,最后通过MessageBoxA将Text的内容输出

sub_401160函数以及sub_401000函数是程序写好的运算逻辑,由提示可知运算逻辑不会变,加上overlong的提示,应该是让参与运算的元素更多,即sub_401160函数的第三个参数更大,让程序运算输出flag
当修改参与运算长度28为72时,应用到程序并运行,得到flag

[WUSTCTF2020]Cr0ssfun

elf文件,无壳,ida分析
main函数逻辑清晰,获取输入,调用check检验输入,check返回1时说明输入正确

进入check函数,是对输入input内容的直接判断,其余的函数同理

写脚本即可得到flag

REVERSE-PRACTICE-BUUCTF-12相关推荐

  1. Learning Perl学习笔记(1)第二章Scalar Data

    If Control Structure(IF循环) 脚本如下: #!/usr/bin/perl use warnings; use strict; use v5.24; my $line = < ...

  2. 软件Trimmomatic

    文库构建前,核酸经过随机打断,有的本身就长短不一(mRNA),因此接头之间片段长度也长短不一,而二代测序的测序长度一般是固定,肯定会有部分短于测序读长的序列被测序,因此测序序列中包含了部分或全部接头序 ...

  3. Leetcode-探索 | 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 ...

  4. python的Web框架,Django框架中的请求与响应

    请求与响应 简单流程图 我们先来了解一个请求与响应的大概流程 视图函数接受到的request到底是个什么对象呢? 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第 ...

  5. python字典排序取最值总结

    dic = {"abc":18,"adc":19,"abe":20} # 默认对键排序,从小到大,返回排序后键组成的列表 zidian = ...

  6. git的常用功能(管理github仓库)

    1.克隆github的仓库到本机机器 方式一:https方式:缺点:每次推送都要输入用户名和密码, 进入github网站,使用https方式,复制仓库地址,克隆远程仓库shiyanlou到本地机器 g ...

  7. centos rsyslog mysql_centos7+rsyslog+loganalyzer+mysql 搭建rsyslog日志服务器

    一.简介 在centos7系统中,默认的日志系统是rsyslog,它是一类unix系统上使用的开源工具,用于在ip网络中转发日志信息,rsyslog采用模块化设计,是syslog的替代品. 1.rsy ...

  8. [Java复习02] 集合框架 Collection

    Q1 Collection java的集合以及集合之间的继承关系? 数组和链表的区别? 固定长度,连续内存,不能扩展,随机访问快,插入删除慢.链表相反 List, Set, Map的区别? List, ...

  9. oclick vue 传参 函数_详解Vue计算属性和侦听属性

    关注[搜狐技术产品]公众号,第一时间获取技术干货 作者介绍: 本期特邀作者:浪里行舟 Github博客2600 star作者,专注于前端领域.个人公众号:「前端工匠」,致力于打造适合初中级工程师能够快 ...

  10. 零基础学Python(第十二章 列表【list】)

    本套学习内容共计[22]个章节,每个章节都会有对应的从0-1的学习过程详细讲解,希望可以给更多的人提供帮助. 开发环境:[Win10] 开发工具:[Visual Studio 2019] 本章内容为: ...

最新文章

  1. Android第二十八天
  2. javascript生成指定范围的随机整数
  3. 队爷的 Au Plan(dp+单调队列)
  4. 解决tsvncache.exe引起电脑慢的问题
  5. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级
  6. git did not exit cleanly (exit code 128)
  7. 两个MYSQL数据同步的SHELL脚本
  8. mysql报错22_运行 mysql 遇到的两个报错
  9. 企业如何从大数据系统中获益
  10. linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
  11. 干货|PMP项目管理计划汇总!
  12. PHPWAMP强行脱离依赖,在系统缺失必备组件或DLL受损的情况下依然能正常运行
  13. 最强的右键菜单工具:超级右键专业版 mac中文版
  14. 公有云 私有云及架构
  15. 人机混合智能在博弈领域的发展
  16. 松鼠的新家 LCA + 树上差分
  17. 吴晓灵:大数据与个人征信市场发展
  18. php的框架修改建议,thinkphp 框架适配修改
  19. 7.26 2第5篇 无人驾驶带来巨大商机
  20. Python——(字符串)假设有一段英文,其中有单词中间的字母“i”误写为“I”,请编写程序进行纠正。

热门文章

  1. bootstrap清除拟态框内添加新HTML再打开时会有缓存现象
  2. Handler post用法整理
  3. 修改Fiddler实用插件JsonViewer
  4. [项目经验]玩转开源项目
  5. log双线性模型log-bilinear model简单概括
  6. 软件测试之黑盒测试-等价类划分法
  7. 665C. Simple Strings
  8. 反序列化对象列表发生异常_通过反序列化漏洞,黑客能做什么呢?
  9. python把list转成字典_python中将list转为dict
  10. 计算机数学基础模拟试题,计算机数学基础(A)模拟试题.doc