跳转至

RCTF 2022 Writeup

421 个字 29 行代码 预计阅读时间 2 分钟

Abstract

后补的 writeup。题还挺有意思,做了两道 misc,还有一道偏 web、一道 AI 的被队友直接杀了,就没再看。


K999

一个游戏,手打基本打不动,逆向 / exe 可以知道这是一个用 lua love 引擎写的游戏。其 lua 源码会直接以 zip 的形式附加在 exe 末尾,所以提取出来解压即可得到游戏源码。

可以很明显的发现有一个 flag.lua 的文件,里面有一些解密相关代码,在 main.lua 里面可以看到胜利之后有输出的代码:

if world.KillenemyCount >= 999 then
    love.graphics.push('all')
    love.graphics.setColor(255, 255, 0, 255)
    local flag1 = "MOON\r\n"
    local flag2 = "157 89 215 46 13 189 237 23 241\r\n"
    local flag3 = "49 84 146 248 150 138 183 119 52\r\n"
    local flag4 = "34 174 146 132 225 192 5 220 221\r\n"
    local flag5 = "176 184 218 19 87 249 122\r\n"
    local flag6 = "Find a Decrypt!\r\n"
    love.graphics.print(flag1, love.graphics.getWidth() / 2, love.graphics.getHeight() / 2, 0, 2, 2, 37, 7)
    love.graphics.print(flag2, love.graphics.getWidth() / 2, love.graphics.getHeight() / 2 + 20, 0, 2, 2, 37, 7)
    love.graphics.print(flag3, love.graphics.getWidth() / 2, love.graphics.getHeight() / 2 + 40, 0, 2, 2, 37, 7)
    love.graphics.print(flag4, love.graphics.getWidth() / 2, love.graphics.getHeight() / 2 + 60, 0, 2, 2, 37, 7)
    love.graphics.print(flag5, love.graphics.getWidth() / 2, love.graphics.getHeight() / 2 + 80, 0, 2, 2, 37, 7)
    love.graphics.print(flag6, love.graphics.getWidth() / 2, love.graphics.getHeight() / 2 + 100, 0, 2, 2, 37, 7)
    love.graphics.pop()
    getflag = true

所以把数据拿出来,MOON key,剩下的是 s,顺着 flag.lua 里的意思直接接一个解密函数然后直接运行即可:

function Decrypt()
    local key = "MOON"
    local s = {157, 89, 215, 46, 13, 189, 237, 23, 241, 49, 84, 146, 248, 150, 138, 183, 119, 52, 34, 174, 146, 132, 225, 192, 5, 220, 221, 176, 184, 218, 19, 87, 249, 122}
    flag = ""
    for i = 1, #s, 1 do
        flag = flag .. string.char(s[i])
    end
    flag = strDecrypt(flag, key)
    print(flag)
end

Decrypt()

得到 flag: RCTF{1_Rea11y_Want_t0_Y0ur_H0use}


ez_alient

看起来是经典的 python 外星人打飞机游戏,有一个图片文件夹,可以发现 alien.bmp 末尾有 pwd="N0bOdy_l0ves_Me",是压缩包密码。

解压后是 python 打包好的可执行文件,用 pyinstxtractor+uncompyle6 可以解出源码,可以发现 alien_invasion.py 里面存在一个没用的变量 s="VTJreE0yNWpNdz09",二次 base64 解码可以得到 "Si13nc3"

除此之外还有 PYZ-00.pyz 文件,同样解包并反编译可以得到其他部分源码,可以发现更多没用的变量:

  • alien.py: a = TVRVPQ== -> MTU= -> 15
  • bullet.py: a = YmtWMlJYST0= -> bkV2RXI= -> nEvEr
  • button.py: k = T1dsMmFXNDU= -> OWl2aW45 -> 9ivin9
  • game_stats.py: t = ZFhBPQ== -> dXA= -> up
  • scoreboard.py: m = SmlZPQ== -> JiY= -> &&
  • settings.py: l = Tm5WMA== -> NnV0 -> 6ut
  • ship.py: m = YURBeFpHbHVPUT09 VDI0PQ== VTJreE0yNVVNWGs9
    • YURBeFpHbHVPUT09 -> aDAxZGluOQ== -> h01din9
    • VDI0PQ== -> T24= -> On
    • VTJreE0yNVVNWGs9 -> U2kxM25UMXk= -> Si13nT1y

拼起来就是 flag: RCTF{Si13nc3_15_nEvEr_9ivin9_up_&&_6ut_h01din9_On_Si13nT1y}

反正就是感觉硬藏没啥意思,而且单词顺序其实还并不确定,硬猜。


最后更新: 2023年5月10日 23:50:08
创建日期: 2023年5月10日 23:50:08
回到页面顶部