REVERSE-PRACTICE-CTFSHOW-6

REVERSE-PRACTICE-CTFSHOW-6

    • 真的是签到
    • 批量生产的伪劣产品
    • 来一个派森
    • snake

真的是签到

附件是一个压缩包,解压需要密码,但是题目没有给到解压密码
实际上是压缩包伪加密,将如图橙色处原本的字节0x09改为0x00,保存后即可解压出文件
qiandao-break
解压得到一个32位的exe,加了ASP壳,用工具脱壳
qiandao-shell
脱壳后的exe丢进ida,仍然得不到重要的信息,上x32dbg调试
exe丢进x32dbg,x32dbg会预先设置一个断点,在"断点"窗口可以看到
我们先按一下F9,来到x32dbg预先设置的断点处,如图所示
qiandao-debug
经过多次调试发现,程序在执行如图所示处的"jmp _unpacked.401280"指令后就会要求我们输入,这里下一个断点
qiandao-debug
F8跟进"jmp _unpacked.401280",在如图所示处的"call _unpacked.401150",按F7步入
qiandao-debug
然后一路F8,来到如下图所示"call _unpacked.4012F0"处,按F7步入
qiandao-debug
可以看到0x4012F0处开始的函数中包含"try again"的字符串,0x401334处调用了scanf
猜测这里应该就是main函数
qiandao-debug
用插件Scylla,dump出程序,丢进ida分析,其中一些函数名已对照x32dbg进行了修改
主要的逻辑为,将输入中的各个字符与下标异或,然后反转输入,再让输入与已知的res比较
qiandao-ida
python脚本好像打印不出中文
下面是c脚本,得到flag

#include<stdio.h>
int main()
{int res[18]= { 0x6c,0x2f,0x30,0x31,0x32,0x33,0xffffffb6,0xffffffbf,0xffffffa0,0xffffffcf,0x7c,0x71,0x6a,0x6c,0x70,0x64,0x75,0x63 };for (int i = 17; i>=0; i--){res[i] ^= 17-i;printf("%c", res[i]);}printf("\n");return 0;
}
// ctfshow{签到?????}

批量生产的伪劣产品

apk文件,jadx-gui打开
先看AndroidManifest.xml文件,找到两个关键的类:“appinventor.ai_QA629A242D5E83EFA948B9020CD35CB60.checkme.a"和”.Screen1"
apk-manifest
在"appinventor.ai_QA629A242D5E83EFA948B9020CD35CB60.checkme.a"类中直接找到flag
apk-flag

来一个派森

.py文件打包成的exe,用"pyinstxtractor.py"解包
uncompyle6反编译checkme.pyc文件
(可反编译的前提是checkme.pyc文件与struct.pyc文件前12个字节相同)
b58encode的逻辑为,先对输入进行base58变换,变换后再与下标异或,最后和check比较

def b58encode(tmp: str) -> str:tmp = list(map(ord, tmp))temp = tmp[0]base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'for i in range(len(tmp) - 1):temp = temp * 256 + tmp[(i + 1)]tmp = []while 1:tmp.insert(0, temp % 58)temp = temp // 58if temp == 0:breaktemp = ''for i in tmp:temp += base58[i]tmp = []for i in range(len(temp)):tmp.append(chr(ord(temp[i]) ^ i))check = ['A', '5', 'q', 'O', 'g', 'q', 'd', '\x7f', '[', '\x7f', 's', '{', 'G', 'A', 'x', '`', 'D', '@', 'K', 'c', '-', 'c', ' ', 'G', '+', '+', '|', 'x', '}', 'J', 'h', '\\', 'l']if tmp == check:return 1else:return 0flag = input('输入flag:')
if b58encode(flag):print('you win')
else:print('try again')

逆向逻辑为,将check各元素与下标异或,再解base58

def b58decode(tmp:str) -> str:import binasciibase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"temp = []for i in tmp:temp.append(base58.index(i))tmp = temp[0]for i in range(len(temp)-1):tmp = tmp * 58 + temp[i+1]return binascii.unhexlify(hex(tmp)[2:].encode("utf-8")).decode("UTF-8")
check = ['A', '5', 'q', 'O', 'g', 'q', 'd', '\x7f', '[', '\x7f', 's', '{', 'G', 'A', 'x', '`', 'D', '@', 'K', 'c', '-', 'c', ' ', 'G', '+', '+', '|', 'x', '}', 'J', 'h', '\\', 'l']
for i in range(len(check)):check[i]=chr(ord(check[i])^i)
print(b58decode("".join(c for c in check)))
# ctfshow{zhe_bu_shi_flag}

snake

.py文件打包成的exe,用"pyinstxtractor.py"解包
uncompyle6反编译snake.pyc文件

# -*- coding:utf-8 -*-
import hashlib, sys, random, time
maze = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],[0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0],[0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],[0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0],[0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],[0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0],[0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9]]
s = str(input()) # 读取输入
seed = time.time()
random.seed(seed)
random.seed(random.randint(0, 999999))
maze[1][1] = random.randint(987, 1000)
maze[3][4] = random.randint(345, 356)
maze[7][7] = random.randint(107, 116)
maze[11][8] = random.randint(833, 856)
for i in range(12):for j in range(12):tmp = 12 * i + jif maze[i][j] == 0:maze[i][j] = 3456 + tmpcontinueif tmp % 4 == 0:random.seed(maze[1][1])for cnt in range(tmp):random.randint(0, 999)maze[i][j] = random.randint(0, 999)elif tmp % 4 == 1:random.seed(maze[3][4])for cnt in range(tmp):random.randint(555, 1234)maze[i][j] = random.randint(555, 1234)elif tmp % 4 == 2:random.seed(maze[7][7])for cnt in range(tmp):random.randint(777, 888)maze[i][j] = random.randint(777, 888)elif tmp % 4 == 3:random.seed(maze[11][8])for cnt in range(tmp):random.randint(369, 777)maze[i][j] = random.randint(369, 777)maze[11][11] = 9
# 以上都是对maze的变换
if len(s) != 56:sys.exit(-1)
idx1 = 0
idx2 = 0
# 走迷宫 wsad代表上下左右 从左上角[0,0]开始
for i in s:if i == 'w':idx1 -= 1else:if i == 's':idx1 += 1else:if i == 'a':idx2 -= 1else:if i == 'd':idx2 += 1# 每走一步后的坐标在maze中的值要大于等于0且小于等于1234if not 0 <= maze[idx1][idx2] <= 1234:print('Where are you going?')sys.exit(2)
# 走到右下角[11,11]成功
if maze[idx1][idx2] != 9:print('You lost in the maze!')
# 从maze中取值构成result
result = ''
for xx in maze:for xxx in xx:result += str(xxx)hash_res = hashlib.sha256(result.encode('latin-1')).hexdigest()
print(hash_res)
# 由于maze中含有随机数,所以即使迷宫路线正确,也可能得不到flag,需要多次尝试
if hash_res == 'f1793dcf5ad3858512b944ac34413725a27c63e25618858231e88b9686466b00':flag1 = str(maze[1][1]) + str(maze[7][7]) + str(maze[11][8]) + str(maze[3][4])flag2 = hashlib.sha256(s.encode('latin-1')).hexdigest()flag = flag2[::-1] + flag1[::-1]final_flag = hashlib.sha256(flag.encode('latin-1')).hexdigest()print('flag{' + final_flag[0:32] + '}')

已知迷宫路线的约束为,“每走一步后的坐标在maze中的值要大于等于0且小于等于1234”
提取出源代码对maze的变换,再将maze中大于等于0且小于等于1234的值改为1,其余改为0
打印maze,即可得到正确的迷宫路线

import hashlib, sys, random, time
maze = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],[1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],[0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0],[0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],[0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0],[0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],[0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0],[0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9]]
seed = time.time()
random.seed(seed)
random.seed(random.randint(0, 999999))
maze[1][1] = random.randint(987, 1000)
maze[3][4] = random.randint(345, 356)
maze[7][7] = random.randint(107, 116)
maze[11][8] = random.randint(833, 856)
for i in range(12):for j in range(12):tmp = 12 * i + jif maze[i][j] == 0:maze[i][j] = 3456 + tmpcontinueif tmp % 4 == 0:random.seed(maze[1][1])for cnt in range(tmp):random.randint(0, 999)maze[i][j] = random.randint(0, 999)elif tmp % 4 == 1:random.seed(maze[3][4])for cnt in range(tmp):random.randint(555, 1234)maze[i][j] = random.randint(555, 1234)elif tmp % 4 == 2:random.seed(maze[7][7])for cnt in range(tmp):random.randint(777, 888)maze[i][j] = random.randint(777, 888)elif tmp % 4 == 3:random.seed(maze[11][8])for cnt in range(tmp):random.randint(369, 777)maze[i][j] = random.randint(369, 777)maze[11][11] = 9for i in range(12):for j in range(12):if maze[i][j]>=0 and maze[i][j]<=1234:maze[i][j]=1else:maze[i][j]=0print(maze[i])
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]
# [0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0]
# [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0]
# [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0]
# [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
# [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0]
# [0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]
# [0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0]
# [0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0]
# [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
# sdsdsddwwddsdddssaaassddddssasaaaaawwwaaasssdsdsdddddddd

爆破一下,能不能得到flag全看运气

from itertools import *
import subprocess
while(1):flag="sdsdsddwwddsdddssaaassddddssasaaaaawwwaaasssdsdsdddddddd"p = subprocess.Popen(["D:\\ctfdownloadfiles\\snake.exe"], stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)p.stdin.write(flag)p.stdin.close()out = p.stdout.read()p.stdout.close()if "flag" in out:print(out)exit()
# f1793dcf5ad3858512b944ac34413725a27c63e25618858231e88b9686466b00
# flag{e1df25dac4906584fe2d6f155b60e233}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

REVERSE-PRACTICE-CTFSHOW-7

REVERSE-PRACTICE-CTFSHOW-7签层饼Tea_tube_poteasy贪吃蛇的秘密签层饼 32位exe&#xff0c;ida打开 main函数中&#xff0c;输入两个大于0的数字&#xff0c;如果flag_num为0&#xff0c;则将两个输入作为flag的一部分&#xff0c;打印flag 选中input_1按x查找交叉引用&…

HttpModule与HttpHandler详解(转)

ASP.NET对请求处理的过程&#xff1a; 当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&am…

Windows 系统中 Python下 Pygame 的安装

Pygame是跨平台Python模块&#xff0c;专为电子游戏设计&#xff0c;可用于管理图形、动画乃至声音&#xff0c;建立在SDL基础上&#xff0c;允许实时电子游戏研发而无需被低级语言&#xff08;如机器语言和汇编语言&#xff09;束缚&#xff0c;通过使用Pygame来处理在屏幕上绘…

REVERSE-PRACTICE-CTFSHOW-8

REVERSE-PRACTICE-CTFSHOW-8Matara OkinaanniuwarmupeMatara Okina apk文件&#xff0c;jadx-gui打开 MainActivity什么都没有&#xff0c;来到FlagActivity scheme&#xff0c;host这些看不懂 第44行有个ans和bytes的比较&#xff0c;ans已知&#xff0c;bytes是从某个地方获…

Html控件和Web控件(转)

作为一名ASP.NET的初学者&#xff0c;了解并且区别一些混淆概念是很必须的&#xff0c;今天这篇博文 就是主要向大家介绍一下Html控件和Web控件。在ASP.net中&#xff0c;用户界面控件主要就是 Html控件和Web控件&#xff0c;在前台页面上看&#xff0c;两种控件非常相似&…

VMware Pro 14 安装 Ubuntu 18.04 详细教程

目录● 安装步骤1.下载安装 VMware Workstation Pro 142.下载 Ubuntu 18.04 系统3.在 VMware 中创建虚拟机4.在虚拟机上安装 Ubuntu 系统● 安装过程中可能会出现的一些问题 1.在虚拟机上安装 Ubuntu 系统的过程中卡死不动 2.Ubuntu 不能全屏显示● 安装步骤 1.下载安装 VMware…

Web服务器控件和HTML控件的区别与联系

我们知道&#xff0c;在ASP.NET中&#xff0c;使用了两类控件&#xff0c;一类是HTML控件&#xff0c;还有一类是WEB控件。 WEB控件我们已经很熟悉&#xff0c;因为它是ASP.NET提供&#xff0c;一般关于ASP.NET的教程文章都会仔细介绍这些控件的详细应用技巧&#xff1b; 而H…

Hexo 博客优化之博客美化系列(持续更新)

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 本文将讲述一些 Hexo 博客的美化&#xff0c;本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X 主题为例…

一台电脑部署两个或多个 Hexo 博客(一台电脑使用两个或多个 GitHub 账号)

由于个人原因需要在一台电脑上部署两个Hexo博客&#xff0c;本来以为挺简单&#xff0c;没想到问题重重&#xff0c;首先是一个GitHub账号只能搭建一个Hexo博客&#xff0c;因此就需要使用其他GitHub账号&#xff1b;其次是一台电脑绑定两个GitHub账号&#xff0c;则需要两对公…

element.style内联样式修改

最近在修改我个人博客的一个样式时发现&#xff0c;无论我如何修改style里面的值&#xff0c;页面上的样式都不会被修改&#xff0c;F12检查一下发现个element.style&#xff0c;但是却找不到这个值在哪里&#xff0c;查资料后才知道element.style为内联样式&#xff0c;基本很…

免费CDN:jsDelivr+Github 使用方法

CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网络拥塞&…

EasyUI学习总结(一)——EasyUI入门

一、EasyUI下载 EasyUI官方下载地址&#xff1a;http://www.jeasyui.com/download/index.php&#xff0c;目前最新的版本是&#xff1a;jQuery EasyUI 1.4.1 下载完成之后&#xff0c;得到压缩包&#xff0c;解压后&#xff0c;得到一个【jquery-easyui-1.4.1】文件夹&#xff…

PWN-PRACTICE-CTFSHOW-1

PWN-PRACTICE-CTFSHOW-1PWN签到题pwn02pwn03pwn04PWN签到题 nc连上去就会打印flag pwn02 栈溢出&#xff0c;覆盖返回地址为后门函数stack起始地址即可 # -*- coding:utf-8 -*- from pwn import * #ioprocess("./pwn1") ioremote("pwn.challenge.ctf.show&…

利用QQ邮箱设置个性域名邮箱,并在网易邮箱大师客户端添加域名邮箱

平常我们使用的邮箱都是xxxqq.com、xxx126.com、xxx163.com、xxxgmail.com之类的&#xff0c;这些邮箱会暴露你的QQ号、电话号等信息&#xff0c;最重要的是后缀都和别人一样&#xff0c;没有个性&#xff0c;也许你看见过xxxliruihao.com、xxxwangxiaoxiao.com之类的带有个性后…

MVC和WebForm区别

WebForm的理解 1、 WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型&#xff08;event-drivenGUI&#xff09;&#xff0c;隐藏了HTTP、HTML、JavaScript等细节&#xff0c;将用户界面构建成一个服务器端的树结构控件&#xff08;Control&#xff09;&a…

VMware Pro 15 安装 Deepin15.9 国产操作系统详细教程

Deepin是由武汉深之度科技有限公司开发的Linux发行版&#xff0c;个人认为其界面设计非常美观&#xff0c;而且作为国产操作系统&#xff0c;值得我们去体验和支持&#xff01; 文章目录1.下载安装 VMware Workstation Pro 152.下载 Deepin15.9 系统3.在 VMware 中创建虚拟机4.…

Asp.Net WebForm生命周期的详解

一&#xff0e;http://Asp.Net页面生命周期的概念 当我们在浏览器地址栏中输入网址&#xff0c;回车查看页面时&#xff0c;这时会向服务器端IIS&#xff09;发送一个request请求&#xff0c;服务器就会判断发送过来的请求页面&#xff0c;当完全识别 TTP页面处理程序类后&…

Python PEP8 代码规范常见问题及解决方法

之前一直用 Python IDLE 写代码&#xff0c;最近换成 PyCharm 写代码总是会出现波浪号&#xff0c;这才了解到 Python 的 PEP8 代码规范&#xff0c;所以将常见的 PEP8 代码规范问题和解决方法记录一下&#xff0c;学习一下&#xff0c;遇到了再持续更新&#xff0c;养成良好的…

Eclipse 通过 JDBC 连接 SQL Server

文章目录1.配置 SQL Server 20122.开启 Telnet 服务3.测试1433端口是否打开4.下载JDBC5.Eclipse 连接 SQL Server6.测试连接本文用到的软件版本以及相关环境&#xff1a; Eclipse Photon Release (4.8.0) JDK-10.0.2 SQL Server 2012 1.配置 SQL Server 2012 打开 SQL Server …

SQL Server 登录更换【Windows身份验证】为【SQL Server 身份验证】

1、安装好 SQL Server 后&#xff0c;使用 Windows 身份验证登陆SQL&#xff0c;然后在服务器上右键&#xff0c;选择【属性】&#xff0c;在弹出的窗口中选择【安全性】&#xff0c;在服务器身份验证项里勾选【SQL Server 和 Windows 身份验证模式】&#xff0c;点击确定保存 …