NSSCTF ROUND#28 动态调试 WriteUp

WriteUp

题目信息

来源:NSSCTF
名称:ROUND#28 动态调试
分类:Reverse
描述:无

题目链接: https://www.nssctf.cn/contest/732/

解题思路

首先使用DIE对文件进行查壳,发现这是一个无壳的32位ELF文件。

于是使用32位IDA对文件进行反汇编,得到伪代码如下:

为方便阅读伪代码,修改变量名如下:

分析伪代码可以知道,我们输入的字符串ins,每一位都会与随机数异或,这时候我们可以猜想这个随机seed是一个定值(如果是动态的,那么即便是flag,每次随机异或得到的结果和goal几乎都不一样)。

然后查看关键变量goal,并计算goal字符串长度为35(0x22-0x00 + 1)

那么我们可以直接先输入'1'*35,得到异或后的序列,然后再将该序列各位与'1'异或,这样子得到的序列就是各位的异或值。

思路有了,现在设置断点:

然后进入动态调试阶段:

先输入35个'1',

然后查看异或后的序列ins,

提取出这些数据,

[0xB9, 0xB2, 0x92, 0x4F, 0xDB, 0x90, 0x8B, 0x14, 0x43, 0xFE, 0x2C, 0x5F, 0x48, 0x61, 0x26, 0x61, 0x9D, 0x5E, 0xE3, 0x25, 0x8C, 0x54, 0x84, 0x6D, 0x69, 0x4C, 0xDE, 0x52, 0x68, 0x47, 0x65, 0xB7, 0x0D, 0x18, 0x58]

然后编写脚本得到所有异或值,

[136, 131, 163, 126, 234, 161, 186, 37, 114, 207, 29, 110, 121, 80, 23, 80, 172, 111, 210, 20, 189, 101, 181, 92, 88, 125, 239, 99, 89, 118, 84, 134, 60, 41, 105]

接着提取goal的值,

[0xB9, 0xB2, 0x92, 0x4F, 0xDB, 0x90, 0x8B, 0x14, 0x43, 0xFE, 0x2C, 0x5F, 0x48, 0x61, 0x26, 0x61, 0x9D, 0x5E, 0xE3, 0x25, 0x8C, 0x54, 0x84, 0x6D, 0x69, 0x4C, 0xDE, 0x52, 0x68, 0x47, 0x65, 0xB7, 0x0D, 0x18, 0x58]

再次编写脚本,将goal与各异或值进行异或,即可得到flag

使用工具

DIE
IDA
Vscode

工具链接: https://pan.baidu.com/s/1dzK8gcFjYEvnj_aA0UjBeQ?pwd=ry2d 提取码: ry2d

Flag

NSSCTF{WeLcoMe_T0_the_Rand0m_W0rld}

总结

通过本次题目学习到:
动态分析

posted @ 2025-03-22 22:17  Binary-0  阅读(160)  评论(0)    收藏  举报