Cybrics CTF 2019 Quals Writeup Revrse

2023-10-30 12:59

本文主要是介绍Cybrics CTF 2019 Quals Writeup Revrse,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • Cybrics CTF 2019 Quals Writeup Revrse
    • Oldman Reverse
    • matreshka
    • Hidden Flag

Cybrics CTF 2019 Quals Writeup Revrse

上周末和天枢的大佬们一起打了 Cybrics 这个比赛,金砖国家 CTF 比赛,群里大佬们说是搬金砖 hhhh。场上做出了两个逆向题,这里做一下总结。

Oldman Reverse

难度:Baby

链接:https://cybrics.net/tasks/oldman

题目给出了一段汇编代码,很短,简单分析一下就能确定代码流程。

.MCALL  .TTYOUT,.EXIT
START:mov   #MSG r1 mov #0d r2mov #32d r3
loop:       mov   #MSG r1 add r2 r1movb    (r1) r0.TTYOUTsub #1d r3cmp #0 r3beq     DONEadd #33d r2swab r2clrb r2swab r2    br      loop      
DONE: .EXITMSG:.ascii "cp33AI9~p78f8h1UcspOtKMQbxSKdq~^0yANxbnN)d}k&6eUNr66UK7Hsk_uFSb5#9b&PjV5_8phe7C#CLc#<QSr0sb6{%NC8G|ra!YJyaG_~RfV3sw_&SW~}((_1>rh0dMzi><i6)wPgxiCzJJVd8CsGkT^p>_KXGxv1cIs1q(QwpnONOU9PtP35JJ5<hlsThB{uCs4knEJxGgzpI&u)1d{4<098KpXrLko{Tn{gY<|EjH_ez{z)j)_3t(|13Y}"
.end START

这段代码加载 MSG 字符串到寄存器 r1 中,之后进一个循环,每轮循环输出 MSG[r2]。在每轮循环中,r2 先增加33,之后三个操作SWAB r2; CLRB r2; SWAB r2;不是太明白。经过一番百度 google,能够确定 SWAB 交换寄存器的字节顺序,CLRB 清除寄存器。可能没办法直接理解到这段代码的含义,不过结合 33 这个自增长度,还有 MSG 的总长是 256,基本就能猜到这是在模 256。写代码确认一下就得到了 flag。

msg = "cp33AI9~p78f8h1UcspOtKMQbxSKdq~^0yANxbnN)d}k&6eUNr66UK7Hsk_uFSb5#9b&PjV5_8phe7C#CLc#<QSr0sb6{%NC8G|ra!YJyaG_~RfV3sw_&SW~}((_1>rh0dMzi><i6)wPgxiCzJJVd8CsGkT^p>_KXGxv1cIs1q(QwpnONOU9PtP35JJ5<hlsThB{uCs4knEJxGgzpI&u)1d{4<098KpXrLko{Tn{gY<|EjH_ez{z)j)_3t(|13Y}"def loop(s):r1 = sr2 = 0r3 = 32ans = ''while True:ans += r1[r2]r3 -= 1if r3 <= 0:breakr2 += 33r2 %= 256return ansprint len(msg)
print loop(msg)

cybrics{pdp_gpg_crc_dtd_bkb_php}

ps. CTF time 的 wp 说这是 PDP11 的汇编代码。

matreshka

难度:Easy

链接:https://cybrics.net/tasks/matreshka

终于遇到了一道很典型的逆向题。拿到的是一个 .class 文件,拖进 jd-gui 直接能看到反编译的 java 代码。

反编译代码

分析一下代码的流程,首先加密Syste.getProperty("user.name"),加密的值和arrayOfByte2对比,如果相同,就进入下一步,否则程序结束。之后解密 data.bin,将结果保存到 stage2.bin。stage2.bin 显然是下一关的程序。这里通过百度能确定,Syste.getProperty("user.name")就是系统的用户名。

再看一下 decode 和 encode 函数,可以看到单纯地做了 DES 加解密。

加解密函数

拿 python 模拟一下,就拿到了stage2.bin。注意这里的 DES 是 ECB 模式。

from Crypto.Cipher import DES
import binascii
import base64key_1 = 'matreha!'
cipher = [76, -99, 37, 75, -68, 10, -52, 10, -5, 9, 92, 1, 99, -94, 105, -18]
cipher_s = ''
for x in range(len(cipher)):cipher_s += '%02x' % (cipher[x] % 256)cipher_s = binascii.unhexlify(cipher_s)
cipherX = DES.new(key_1, DES.MODE_ECB)
y = cipherX.decrypt(cipher_s)fp = open("data.bin", "rb")
fpp = open("steg2.bin", "wb")key_2 = "lettreha"
print len(key_2)cipherXX = DES.new(key_2, DES.MODE_ECB)
cipher = fp.read()
print len(cipher)for cnt in range(len(cipher) / 16):res = cipherXX.decrypt(cipher[cnt*16:cnt*16+16])fpp.write(res)fp.close()
fpp.close()

stage2.bin 是一个 elf 文件,拖进 IDA 会发现特别混乱。做过这种题就能知道这是 go 语言的二进制程序,第一次的同学百度一下反编译出的函数名也就明白了。

go 的二进制程序主函数在 main_main 中,反编译的结果虽然不是很清晰,但是能确定做了 RC4 加密,之后对比加密字符串,如果正确就进入下一步。下一步对另一段做 RC4 解密,解密结果保存在文件当中。

stage2.bin逆向

逆向到这里,函数参数的分析就很头疼了。很难一眼就确定 RC4 的密钥、明文是什么,这个时候动态调试往往能事半功倍。

打开我无敌的 GDB,先在函数入口处下断点,断点下在 main.main 上,注意 IDA 反编译会把函数名的"."转成"_"。main.main函数一开始有很多跳转,直接下断点到 RC4 异或加密的地方。这下能够很明显的看出,第一步 RC4 加密的明文是当前目录的名字。同样的方法也能确定 RC4 的密钥。

gdb动态调试

写脚本解密 RC4 的密文,得到正确的目录名,之后运行程序就自动解密出了下一关的代码 result.pyc。

import random, base64
from hashlib import sha1def rc4_xor(data, key):"""RC4 algorithm"""x = 0box = range(256)for i in range(256):x = (x + box[i] + ord(key[i % len(key)])) % 256box[i], box[x] = box[x], box[i]x = y = 0out = []for char in data:x = (x + 1) % 256y = (y + box[x]) % 256box[x], box[y] = box[y], box[x]out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))return ''.join(out)key = '\x01\x03\x03\x07\x03\x03\x08\x01'
data = '\x53\xdd\xc5\x87\xe4\x63\x99\x14\x4f\xa4\x14\x2d\xc4\x24\x04\xc0\xb0'print rc4_xor(data, key)

拿到 result.pyc 后,反编译的结果却很诡异。

def decode(data, key):idx = 0res = []
# WARNING: Decompyle incompleteflag = [40,11,82,58,93,82,64,76,6,70,100,26,7,4,123,124,127,45,1,125,107,115,0,2,31,15]
print('Enter key to get flag:')
key = input()
if len(key) != 8:print('Invalid len')quit()
res = decode(flag, key)
# WARNING: Decompyle incomplete

代码用输入的8位 key 和 flag 做某些操作,之后的结果应该就是 flag。最关键的 decode 函数反编译失败,是工具出了问题吗?用 010Editor 再去看 result.pyc,发现它本来就是不完整的。

这个时候只能先猜了,最简单的就是逐位异或了,而且我们知道flag的前几位是 "cybrics{",正好是8位。拿 "cybrics{" 和 flag 的前8位异或,结果是"Kr0H4137",显然我们猜对了。最后异或整个flag,得到答案。

import binasciiflag = [40,11,82,58,93,82,64,76,6,70,100,26,7,4,123,124,127,45,1,125,107,115,0,2,31,15]fake_flag = "cybrics{"
print len(flag)for x in range(len(flag)):print "%02x" % (flag[x]),
print ""print binascii.hexlify(fake_flag)for i in range(8):print chr(flag[i] ^ ord(fake_flag[i]) ),def decode(key, data):ans = ''for x in range(len(data)):data[x] ^= ord(key[x % len(key)])ans += chr(data[x])return ansprint decode("Kr0H4137", flag)

cybrics{M4TR35HK4_15_B35T}

Hidden Flag

难度:hard

链接:https://cybrics.net/tasks/hiddenflag

TODO

转载于:https://www.cnblogs.com/helica/p/11348740.html

这篇关于Cybrics CTF 2019 Quals Writeup Revrse的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308067

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

2019学习计划

工作三年了,第一年感觉是荒废的,第二年开始学习python,第三年开始自动化 感觉自己会的东西比较少,而且不够深入,流于表面 现制定一下今年大概的学习计划 需持续巩固加强:python、ui自动化、接口自动化、sql等 代码量需提升,敲的不够(重点) 学习: 1.移动端测试,appium等 2.前端知识系统整理学习  3.性能测试 4.docker入门,环境搭建 5.shell

最简单的使用JDBC[连接数据库] mysql 2019年3月18日

最极简版本的, 我们这里以mysql为例: 首先要创建maven工程, 需要引入jar包:,这里需要注意, 如果你安装的是mysql最新版本8以上的, 下面有些地方需要更改,具体就是mysql连接的url, 和5版本的不一样,具体解决请自行百度哈.这里只演示mysql5版本的? 依赖: <dependency>   <groupId>mysql</groupId>   <artifactId

(php伪随机数生成)[GWCTF 2019]枯燥的抽奖

审核源码发现加载check.php,审计发现使用了mt_rand()函数,这个函数生成的值是伪随机的 参考下面这篇文章 PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户 kali里面输入下载工具 git clone https://github.com/openwall/php_mt_seed.git cd进去输入make后编译出的文件先

2019年2月17日

今天又重新看了一下输出第1500个丑数 在我错了八次之后发现要输出一个句号还要输出换行 接下来的两天应该进入复习阶段了。

National Contest for Private Universities (NCPU), 2019 E. Generalized Pascal's Triangle

编辑代码 2000ms 262144K Generalized Pascal's Triangle Pascal's triangle is a triangular array in which each number can be calculated by the sum of the two numbers directly above that number as shown i

Hinton等人最新研究:大幅提升模型准确率,标签平滑技术 2019-7-8

导读:损失函数对神经网络的训练有显著影响,也有很多学者人一直在探讨并寻找可以和损失函数一样使模型效果更好的函数。后来,Szegedy 等学者提出了标签平滑方法,该方法通过计算数据集中 hard target 的加权平均以及平均分布来计算交叉熵,有效提升了模型的准确率。近日,Hinton 团队等人在新研究论文《When Does Label Smoothing Help?》中,就尝试对标签平滑技术对

2024年“羊城杯”粤港澳大湾区网络安全大赛 初赛 Web数据安全AI 题解WriteUp

文章首发于【先知社区】:https://xz.aliyun.com/t/15442 Lyrics For You 题目描述:I have wrote some lyrics for you… 开题。 看一下前端源码,猜测有路径穿越漏洞 http://139.155.126.78:35502/lyrics?lyrics=../../../../../etc/passwd 简单看

Photoshop CC 2019圆形的抠图

快速进入矩形选区 快速在矩形和圆形选区之前切换: shift+M 选择的时候,按住shift,可以选中正方形/圆形   以中心点画圆: alt + 拖拽 再利用变换选区功能即可实现圆的选中 效果如图所示: 再使用自由变换,即可放大,缩小球的大小: ctrl + T 阴影部分的处理: 1)去其他球那里选择个椭圆形选区 2)选择编辑-填充 3)使用滤镜里