题目内容:parse the payload
样本估计是bvp47
https://www.pangulab.cn/files/The_Bvp47_a_top-tier_backdoor_of_us_nsa_equation_group.zh-cn.pdf
根据下面这篇文章解出payload
https://www.qianxin.com/news/detail?news_id=6484
解payload的exp
1 |
|
解出来可以大概看出来是个3DES
题目里面自带了DES的加密和解密,通过mode参数1和2判断
patch把1和2都颠倒过来
就可以让原本的加密逻辑变成解密
然后这个时候输入密文即可得到明文
题目内容:简单的vm 最好的vm
len(input)==32
1 | if ( (unsigned int)sub_7FF7DD101D30(input, _quest) ) |
quest是第一部分虚拟机的执行流 input是输入
1 | 0x11 : push X |
输错一遍会把下发的VM指令改了
如果一开始什么都不知道运行了一遍就会出现对着被改的指令嗯求求不出来的情况(*^_^*)
流程大概是把输入的每个字节的8个bit分别和0/1进行判断,相同则把一个常数加到sum中,如果8个bit计算完的结果和预期值相等,则该输入字节正确。
可以暴力遍历所有的2^8个可能性
1 | f = open("quest",'rb') |
1 | import re |
然后是一个vbs脚本,改成msgbox可以输出
1 | MsgBox "VBScript, often abbreviated as VBS, is an event-driven programming language developed by Microsoft, primarily used for scripting in the Windows environment." |
Xtea,但是用了一些异常处理函数使得每次的delta均不相同
可以动调记录sum的变化值
然后在trace里面把sum的值手动记录下来
1 | import re |
然后逆回去即可
1 | #include<bits/stdc++.h> |
1 | flag{8edae458-4tf3-2ph2-9f26-1f8719ec8f8d} |
入口处有几个花指令 patch完如下
TLS callBack的地方有改base表和调试检查
base64最后做了一个xor 0x18
把flag字符串base64后Xor 0x18 发现结果H@^jH
和常量字符串开头很像,猜测其实根本没改过这里的Buf1
1 | qmemcpy(Buf1, "H@^jHwpsH)[jH{M/\\tBBK_|-O{W.iJZ7\\)|~zaB^H+Lwv{SS|-j@\\_[Y", 4 * v3 + 1); |
直接解回去
1 | data = base64.b64decode(data) |
1 |
|
1 | flag{thEn_I_Ca5_BE_YoUR_Onl7_ExeCUti6n_So_Use_m3_t0_R0n_tH17_Ex3Cuti0n} |
有点混淆,jeb5直接反编译解出字符串,然后就可以找他的startService
1 | package com.nobody.Serv1ce; |
exp
1 | res = [0xB9, 0x32, 0xC2, 0xD4, 0x69, 0xD5, 0xCA, 0xFB, 0xF8, 0xFB, 0x80, 0x7C, 0xD4, 0xE5, 0x93, 0xD5, 0x1C, 0x8B, 0xF8, 0xDF, 0xDA, 0xA1, 0x11, 0xF8, 0xA1, 0x93, 0x93, 0xC2, 0x7C, 0x8B, 0x1C, 0x66, 0x01, 0x3D, 0xA3, 0x67] |
NJU-TJL/PacManX: 基于C++控制台(Windows平台)的一个吃豆人小游戏 (github.com)
bindiff结果
下面几个就是出题人改的跟flag有关的函数了
动调把ps脚本扣出来,里面好几层iex,运行输出一下 iex后面的部分
最内层:
1 |
|
enenenenene 就是个rc4,加密解密一样,powershell写个解密exp
1 | # execute: powershell -executionpolicy bypass -file .\exp.ps1 |
flag: 73412036-7d8c-437b-9026-0c2ca1b7f79d
流程大概如下,可以根据S盒+调试确定是AES,轮数也是10
phrase函数把8bit输入和4bit索引合在一起变成12bit
check函数判断给定的12bit是否符合任一条件,即图中这一堆&v1&(v2==0),由于12bit里面有4bit索引,所以能过这个check的输入是固定的
爆破得到所有能过check的12bit输入
1 | #include"defs.h" |
AES key从程序里dump一份(0x405420):
1 | 3577402ECCA44A3F9AB72182F9B01F35 |
AES ECB解回去即可
加上uuid的横杠:
1 | 4d87ef03-77bb-491a-80f5-4620245807c4 |