Bugku_逆向_Love

博客围绕CTF题目展开解题过程。下载文件运行后,介绍两种解题思路,舍弃效率低的脚本爆破法,采用OllyDbg调试程序。对无壳的C++编译文件进行调试,找到关键跳转和函数,分析栈数据与加密代码,最后结合汇编代码和对比字符串构造Python脚本得到flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://ctf.bugku.com/challenges#love

下载文件后运行一下看看
Bugku_逆向_Love
随便输入个123看看
Bugku_逆向_Love
解题思路:
很常见的程序流程,就是输入字符串与程序里的字符串对比,来输出结果,这时候我们有两种选择。
1.写个脚本来爆破。这是没有办法的办法,效率极低且不可靠,在某些情况下是唯一的办法,但在这道题没有必要,所以舍弃。
2.使用软件来调试程序代码,或直接反编译程序获得源码,在这里我用OllyDbg来调试程序。
解题流程:
拿到文件先来查壳
Bugku_逆向_Love
无壳,就是普通的c++编译的文件,使用OllyDbg打开文件
Bugku_逆向_Love

没有什么头绪,右键选择 中文搜索引擎->3.智能搜索
Bugku_逆向_Love
其中有几条很眼熟
Bugku_逆向_Love

这不就是我们输入字符串后提示的字符串吗,点进去看看

Bugku_逆向_Love
可以看到1035840处有一个跳转,根据1035842压栈的字符串来推断,1035847调用的函数是类似于printf的函数,也就是说1035840处的跳转决定了输出的是”wrong flag”还是”right flag”,我们继续向上看,寻找是什么控制关键跳转的执行。很明显,在103582e处调用了strncmp函数,而在其上,压入了一个奇怪的字符串进栈,根据开头猜的程序功能,要么,这就是程序想要我们输入的字符串。要么,是把我们输入的字符串加密后对比的字符串。而strncmp的结果就决定了关键跳转的执行与否。我们在strncmp处下一个断点,运行程序,输入1234567890。
Bugku_逆向_Love
对比栈里的数据可以得出,ecx中存储的是我们输入的字符串加密后的字符串,eax中存储着要对比多少个字符,那我们继续向上翻,找找是什么把我们输入的字符串(即ecx)加密。
Bugku_逆向_Love
在其上不远,我们就发现了一段很可疑的代码,我们在10357d0处下一个断点,重新运行程序,再次输入1234567890
Bugku_逆向_Love

运行到断点后,查看ebp-0xac附近的内存空间,发现了一段base64代码
Bugku_逆向_Love

也就是我们输入的字符串

分析这段加密代码
Bugku_逆向_Love

然后通过这段汇编代码和被对比字符串 “e3nifIH9b_C@n@dH” 来构造python脚本
Bugku_逆向_Love
得到flag
Bugku_逆向_Love
End

转载于:https://blog.51cto.com/13992485/2402916

### Oracle 中 `wm_concat` 函数的逆向操作或等效替代方案 在 Oracle 数据库中,`wm_concat` 是一个非官方但广泛使用的函数,用于将多行数据聚合为单个字符串。然而,Oracle 并未提供直接的逆向操作函数来拆分由 `wm_concat` 生成的字符串[^2]。为了实现逆向操作或替代功能,可以采用以下方法: #### 方法一:使用正则表达式和递归查询 如果目标是将一个逗号分隔的字符串拆分为多行记录,可以使用正则表达式结合递归查询来实现。以下是一个示例代码块: ```sql WITH data AS ( SELECT 'apple,banana,cherry,date' AS concatenated_string FROM DUAL ), split_data (id, str, token) AS ( SELECT LEVEL, REGEXP_SUBSTR(concatenated_string, '[^,]+', 1, LEVEL), NULL FROM data CONNECT BY LEVEL <= REGEXP_COUNT(concatenated_string, ',') + 1 ) SELECT id, str AS token FROM split_data; ``` 上述代码通过 `REGEXP_SUBSTR` 和 `CONNECT BY` 实现了字符串拆分,并将每个子字符串作为单独的一行输出[^3]。 #### 方法二:使用自定义 PL/SQL 函数 另一种方法是创建一个自定义的 PL/SQL 函数来实现字符串拆分。以下是一个示例函数: ```plsql CREATE OR REPLACE FUNCTION split_string(p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN SYS.ODCIVARCHAR2LIST PIPELINED AS v_token VARCHAR2(4000); BEGIN WHILE LENGTH(p_str) > 0 LOOP v_token := SUBSTR(p_str, 1, INSTR(p_str, p_delimiter) - 1); IF v_token IS NOT NULL THEN PIPE ROW(v_token); END IF; p_str := SUBSTR(p_str, INSTR(p_str, p_delimiter) + LENGTH(p_delimiter)); END LOOP; RETURN; END; / ``` 此函数接受两个参数:待拆分的字符串 `p_str` 和分隔符 `p_delimiter`。它会返回一个包含拆分后结果的集合类型 `SYS.ODCIVARCHAR2LIST`[^4]。 #### 方法三:利用 XMLType 和 `EXTRACTVALUE` 在某些场景下,可以借助 XMLType 和相关函数实现字符串拆分。以下是一个示例: ```sql SELECT TRIM(COLUMN_VALUE) AS token FROM XMLTABLE('"' || REPLACE('apple,banana,cherry,date', ',', '","') || '"'); ``` 该方法将字符串转换为 XML 格式,并使用 `XMLTABLE` 将其解析为多行记录[^5]。 --- ### 注意事项 - 上述方法均假设输入字符串以逗号作为分隔符。如果分隔符不同,请根据实际情况调整代码。 - 在 Oracle 12c 及更高版本中,可以使用内置的 `LISTAGG` 函数作为 `wm_concat` 的替代方案[^6]。对于逆向操作,仍需参考上述方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值