首页 > 编程语言 >奇奇怪怪的编程语言:Malbolge

奇奇怪怪的编程语言:Malbolge

时间:2024-12-11 18:56:52浏览次数:3  
标签:checkbox 编程语言 Malbolge 代码 编译 https 奇奇怪怪 until

Malbolge

除了我们日常使用的Python、Java、C等主流编程语言外,还存在这么一类极为晦涩难懂的编程语言,被称为深奥的编程语言Esoteric programming language,简称Esolang)。它们被设计用于测试计算机语言表达的极限,所以不会考虑它们的实用性。今天我们来看其中一个非常典型的例子:Malbolge。

Malbolge由Ben Olmstead 在1998年发明,其名字来自于但丁的《神曲》中的第八层地狱“Malebolge”,意大利语中意为“邪恶的沟渠”(male bolge)。

请添加图片描述

Hello World

下面这段Malbolge代码会输出“Hello, World.”

(=<`#9]~6ZY327Uv4-QsqpMn&+Ij"'E%e{Ab~w=_:]Kw%o44Uqp0/Q?xNvL:`H%c#DD2^WV>gY;dts76qKJImZkj

而这段代码则会输出“Hello, World!”

('&%:9]!~}|z2Vxwv-,POqponl$Hjihf|B@@>,=<M:9&7Y#VV2TSn.Oe*c;(I&%$#"mCBA?zxxv*Pb8`qo42mZF.{Iy*@dD'<;_?!\}}|z2VxSSQ

我们可以看到,光是一个标点符号的改变,就导致代码发生了天翻地覆的变化。

CTF

大多数涉及 Malbolge 的基础 CTF 题目会提供一段看似乱码的内容。此时,需要识别出这实际上是 Malbolge 代码,并通过编译器将其编译出来。

比如说这段代码会输出“flag{this_is_a_flag}”

D'`;qLo=I;|XyhCwStcr=NL-,I$)"XW21A/c>,v_)\xqYonsrqj0hPlkdcb(`Hd]#a`_A@VzZY;QuUTSRQJImGLEJIBAeED&B;_9>7<;:921U54ts10)M'&Jkj"F&%|#z@~}vu;y[Zvo5Vlkjongf,Miha'Hd]\[ZY}W?UZYRQuU7SLp]

请添加图片描述
有些题目可能需要对编译后的结果再进行一次处理,比如使用 base64 解码等。
但是这些内容都不需要了解任何 Malbolge 语言的特性,只需要找到一个编译器即可。因此,接下来我会介绍一些 Malbolge 的特点,并分享一道较难的 CTF 比赛真题。

Malbolge的特点

首先,Malbolge会使用 三个寄存器(register),分别是 acd
a:Accumulator,主要用于存储计算结果和输入/输出数据。
c:Code Pointer / Instruction Pointer,用于指向当前正在执行的代码的位置(即指令指针)。
d:Data Pointer,用于指向内存中的数据位置。

其次,基于这些寄存器,Malbolge提供了八条指令,分别为:jmpoutinrotrmovcrznopend。我们可以利用某些在线编译网站提供的规范化(Normalization)功能,将代码转换为由一组固定字符组成的指令字符集,从而更方便地进行调试(debug)。

更多详细信息可以参考
https://en.wikipedia.org/wiki/Malbolge

例题

题目来源:Platypwn 2024 CTF
链接:https://platypwn.ctf.platypwnies.de/
题面:
请添加图片描述
下载下来的文件内容为:

D'`__LK!mY:jiy6Be3cPa)onKI[#j4&DUBzcx>_;):'Zputml21onPlkd*hJIedcb[!YXW{[TYXWVUNrRQPImGFEDIBfFED=<;:?8\<;432V65ut,P*/('&J*j(!~}C#cy~}v<tsxwvon4Ukji/Plejc)gIedcb[!_^]\U=SwWVONMqQPONMFjJIHGF(>b<$:?876ZG

这段内容看似是乱码,但根据题面的提示“the worst of esoteric programming languages” (正如前文所提到的),我们可以判断出它实际上是一段Malbolge的代码。
直接编译这段代码无法得到任何结果,因此我们可以选择使用某个在线编译工具对其进行规范化处理,使代码转换为更标准的指令字符集,从而便于调试(debug):
请添加图片描述

请添加图片描述

normalized 之后的结果为:

ojii<vvj/io//jov/o/</p**<i/pjvo</<pjp<*iv<v*poopp<<oo*oop<o**oooop<ppp<opooooop<ooop<ppppop<oooppppop<ooppp<oo**p<poppp<o*oppp<o*poop<ppooopp<*ppp<*opop<o*oooop<oooop*p<ooppp<ooooop<ooooo*p<p*poppp<v

当我们运行这段代码时,会发现它在执行到中间某处时意外停止了:

请添加图片描述

大概是在这个位置:
请添加图片描述
所以我们猜测(尝试)需要将这一项改成其他的命令。
而在将其改正为p了之后会得到:
请添加图片描述

订正后的内容

ojii<vvj/io//jov/o/</p**<i/pjvo</<pjp<*iv<p*poopp<<oo*oop<o**oooop<ppp<opooooop<ooop<ppppop<oooppppop<ooppp<oo**p<poppp<o*oppp<o*poop<ppooopp<*ppp<*opop<o*oooop<oooop*p<ooppp<ooooop<ooooo*p<p*poppp<v
D'`__LK!mY:jiy6Be3cPa)onKI[#j4&DUBzcx>_;):'Zputml21onPlkd*hJIedcb[!YXW{[TYXWVUNrRQPImGFEDIBfFED=<;:?8\<;432V65ut,P*/('&J*j(!~}C#cy~}v<tsxwvon4Ukji/Plejc)gIedcb[!_^]\U=SwWVONMqQPONMFjJIHGF(>b<$:?876ZG

具体改动:
请添加图片描述
这样一来我们就成功获取到了flag。

其他办法

1. 暴力破解

当然,如果我们知道(或猜测)这段代码中只有一个地方存在问题,可以尝试使用暴力破解(brute force)的方法进行修正。这种方法的核心是将每条指令逐一修改为其他可能的指令,并观察编译结果。由于不需要理解 Malbolge 的具体特性,因此这种方法非常简单。

为实现这一目标,我们可以利用支持在线编译 Malbolge 的网站,以及 Python 中的 Selenium 库。Selenium 提供了浏览器自动化操作功能,能够帮助我们完成网页上的勾选、输入操作,并提取输出内容,从而实现自动化调试。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化浏览器(确保你有对应的浏览器驱动)
# driver = webdriver.Chrome()  # Chrome
driver = webdriver.Firefox()  # Firefox
try:
    # 打开目标网页
    driver.get("https://lutter.cc/malbolge/debugger.html")

    # 等待页面加载
    wait = WebDriverWait(driver, 30)

    # 勾选所有复选框
    checkboxes_ids = ['until_in', 'until_out', 'until_crz', 'until_rotr', 'until_jmp', 'until_mov', 'until_nop']
    for checkbox_id in checkboxes_ids:
        checkbox = wait.until(EC.element_to_be_clickable((By.ID, checkbox_id)))
        if not checkbox.is_selected():
            checkbox.click()

    # 勾选Normalized
    normalized_checkbox = wait.until(EC.element_to_be_clickable((By.ID, 'normalizedcode')))
    if not normalized_checkbox.is_selected():
        normalized_checkbox.click()

    # 原始Malbolge代码
    original_code = "ojii<vvj/io//jov/o/</p**<i/pjvo</<pjp<*iv<v*poopp<<oo*oop<o**oooop<ppp<opooooop<ooop<ppppop<oooppppop<ooppp<oo**p<poppp<o*oppp<o*poop<ppooopp<*ppp<*opop<o*oooop<oooop*p<ooppp<ooooop<ooooo*p<p*poppp<v"

    # 替换的字符列表
    replace_chars = ['i', 'j', 'o', 'p', '/', '*']

    # 标志变量,用于退出循环
    found_flag = False

    # 循环替换并执行代码
    for i in range(1, len(original_code)):
        if found_flag:  # 如果找到结果,退出外层循环
            break
        for char in replace_chars:
            modified_code = list(original_code)
            modified_code[i] = char  # 替换第i个字符
            modified_code = ''.join(modified_code)


            # 输入修改后的Malbolge代码
            program_textarea = driver.find_element(By.ID, "program")
            program_textarea.clear()
            program_textarea.send_keys(modified_code)

            # 点击Load/Reset按钮
            load_button = driver.find_element(By.ID, "load")
            load_button.click()

            # 点击Execute按钮
            execute_button = wait.until(EC.element_to_be_clickable((By.ID, "run")))
            execute_button.click()

            # 等待执行完成并获取Output内容
            time.sleep(1)  # 根据需要调整等待时间
            output_div = driver.find_element(By.ID, "output")
            output_content = output_div.text

            # 仅当output内容包含"flag"时打印结果
            if "pp{" in output_content.lower():
                print(f"将第 {i + 1} 位修改成 '{char}' 后成功编译出flag。")
                print(f"编译成功的代码: {modified_code}")
                found_flag = True  # 设置标志变量,标记已找到结果
                break  # 退出内层循环

finally:
    # 关闭浏览器
    driver.quit()

# 运行成功后会得到:
"""将第 43 位修改成 'p' 后成功编译出flag。
编译成功的代码: ojii<vvj/io//jov/o/</p**<i/pjvo</<pjp<*iv<p*poopp<<oo*oop<o**oooop<ppp<opooooop<ooop<ppppop<oooppppop<ooppp<oo**p<poppp<o*oppp<o*poop<ppooopp<*ppp<*opop<o*oooop<oooop*p<ooppp<ooooop<ooooo*p<p*poppp<v
"""

2. 修改解释器源代码

有一位参赛选手分享了一个非常巧妙的解法,具体如下:
首先他找到了一个用 C 语言编写的原始 Malbolge 解释器(https://github.com/bipinu/malbolge)。接着,他将第 131 行的return 改为 break,以避免 exec() 函数提前结束。
最后,他使用修改后的解释器运行题目中提供的 Malbolge 代码,成功得到了 flag。

工具(网站)

最后附上一些网页,可以用来生成,编译,或者debug。

https://lutter.cc/malbolge/debugger.html
请添加图片描述

https://zb3.me/malbolge-tools/#generator
请添加图片描述

https://tio.run/##y03MScrPSU/9/19DXU3VyjJWsa62psoorKK8TFcnwL@wID8vR8UjKzMjrcbJwcFOx9bG18pSzTxSOSzMKCQ4T88/VSvZWsNTTVVFWSnX2cnRvqqiokwrIMkioTDfxCg3yk2v2rNSyyHFRd3GOt5eMaYWYnpwcOD//wA
请添加图片描述

标签:checkbox,编程语言,Malbolge,代码,编译,https,奇奇怪怪,until
From: https://www.cnblogs.com/bimohuixinghe/p/18600485

相关文章

  • GitHub 正式收录 MoonBit 作为一门通用编程语言!核心用户突破三万!
    MoonBit 编程语言正式被Github收录!这对于一个仅有两年发展时间的编程语言来说是一种高度认可,期待未来由MoonBit编写的项目数量快速增长,早日成为首个由国人研发迈进10万➕用户的编程语言。最近用户数已经接近3万(数据统计来源综合VisualStudioMarketplac......
  • 奇奇怪怪的编程语言:Malbolge
    Malbolge除了我们日常使用的Python、Java、C等主流编程语言外,还存在这么一类极为晦涩难懂的编程语言,被称为深奥的编程语言(Esotericprogramminglanguage,简称Esolang)。它们被设计用于测试计算机语言表达的极限,所以不会考虑它们的实用性。今天我们来看其中一个非常典型的例......
  • PLC编程—编程语言
    LAD:图形编程语言(电路图表示法——梯形图)。FBD:图形编程语言(电路系统表示法——功能块图)。SCL:结构化编程语言之一。STL:文本编程语言。常用的指令位、定时、计数、比较、数学、赋值、转换、字逻辑、移位、其他STL:文本编程语言常用的指令:位:A:"与”运算——A(...)AN:"与”......
  • 重拾Java:穿越最具多功能性的编程语言之旅
    你知道Java是世界上最广泛使用的编程语言之一吗?无论是用于Web应用、企业系统,还是Android开发,Java始终是各级开发者的可靠选择。在完成SESISENAI的系统开发技术培训后,我决定重新学习这门语言。现在,我将其与我正在学习的React、Node.js和JavaScript相结合。在这个空间里,我将分享我......
  • 用一篇博文带你了解c++和python两种编程语言到底有什么区别?
      成长路上不孤单......
  • Go语言简介:新时代的高效编程语言
    一、什么是Go语言?Go语言(又称Golang)是一种由Google开发的开源编程语言,于2009年首次发布。它的主要设计目标是提供高效、简单和可靠的编程体验,同时结合静态类型语言的安全性和动态语言的开发效率。Go语言因其简洁的语法、内置并发支持和高性能而备受开发者青睐。1.1背景与......
  • far编程语言
    far介绍far是一款可以运行在,Jvm,GraalVM上的编程语言,自带跨平台属性.数据类型far基本数据类型intlongstringarrayfloatdoublebyte对象类型object混合类型var(模糊类型)包括了基本类型和对象类型数组数组定义和赋值string*data=([1,2,3]);数组可以存储不......
  • 程序初学者推荐学习的三种热门编程语言,从零基础到精通,收藏这篇就够了!
    在当今的社会需求下,市场上最常见、最受欢迎、最广泛应用的编程语言主要有三种:C语言、Java语言和Python语言。既然要做出选择,我们就需要明白这三种编程语言各自有何特点和区别。0****1从开发难度而言C语言以其简洁性而被认为是初学者友好的编程语言,易于理解。然而,要达到......
  • 编程语言的易用性_LINQ
    易用性设计开发者的整个工作流进行完整的编程支持编程接口:易用且高性能的API接口具有易用的编程接口来支持用户使用高层次语言,如Python实现机器学习算法; 同时也要具备以C和C++为核心的低层次编程接口来帮助框架开发者用C和C++实现大量高性能组件,从而在硬件上高效执行 ......
  • B4X编程语言:B4X控件的背景色属性(Color/Background)
             B4A控件的背景色属性有两个:Color和Background,B4XView类型控件无论在B4A还是B4J,都只有Color属性。B4J其它控件没有背景色属性,要获取和设置其背景色属性,需使用As(B4XView)方法。        一、Color属性        Color属性的值类型是Int型。......