XCTF-csaw2013reversing2

三种做法

1、ida静态分析修改指令

main函数反编译的代码

由于运行之后的是乱码,所以可以猜测生成flag的函数没有执行,所以需要跳到生成flag的函数执行,但是前面的中断函数不能执行,需要nop掉,并且后面退出程序的函数不能执行,需要跳到弹框函数继续执行。(修改的路径和文件名不要有中文,我用ida修改的时候踩了坑,大家可以试一试)

ida修改代码的方法:

1、鼠标停留在要修改的汇编代码上,然后点击Edit > Patch program > Assemble(中文:编辑 > 修补程序 > 汇编)

2、修改完成后:Edit > Patch program > Apply pathes to input file > OK(中文:编辑 > 修补程序 > 修补程序应用到输入文件 > 确定)

修改之前的汇编代码

修改之后的汇编代码

修改完成之后,直接运行文件,得到flag

2、ollydbg动态调试,nop大法

将文件导入ollydbg后,直接右键 > 中文搜索引擎 > 智能搜索,找到Flag

双击之后向上找到IsDebuggerPresent函数,点击这句汇编,F4让程序运行到此处

F8两次,发现一个跳转,根据之前ida的分析,这应该就是那个if语句的判断,跳过的中间部分就是生成flag的函数,所以我们把这个跳转nop掉

继续F8执行,执行到int 3,这是中断语句,所以也nop掉

F8执行完生成flag的函数后,后面有一个大跳转,跳到退出程序的函数

所以我们把这个跳转也给nop掉,继续F8,执行完一个MessageBoxA(弹框)函数后,发现程序此时处于Running状态,弹出一个什么也没有的框,其实这是另外一个弹框函数,真正输出flag的弹框函数是后面那个,在我们之前那个ida的修改之后的汇编图也可以发现,确实是有一个没有被调用的弹框函数,所以我们之前可以那个nop掉的跳转改为跳转到下面那个弹框函数,但既然说了是nop大法,就nop到底

点击中止之后,发现又要执行一个跳转,跳过了我们真正的弹框函数

将这个跳转nop掉,接着F8,就可以看到flag了

3、 分析代码写脚本

main函数代码

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  int v3; // ecx
  CHAR *lpMem; // [esp+8h] [ebp-Ch]
  HANDLE hHeap; // [esp+10h] [ebp-4h]

  hHeap = HeapCreate(0x40000u, 0, 0);
  lpMem = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + 1);
  memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);
  if ( sub_40102A() || IsDebuggerPresent() )
  {
    __debugbreak();
    sub_401000(v3 + 4, lpMem);
    ExitProcess(0xFFFFFFFF);
  }
  MessageBoxA(0, lpMem + 1, "Flag", 2u);
  HeapFree(hHeap, 0, lpMem);
  HeapDestroy(hHeap);
  ExitProcess(0);
}

关键函数sub_401000的两个参数,v3后面没有用到,向上找lpMem的赋值语句,memcpy_s,将unk_409B10地址的值给了它,双击查看

进入sub_401000函数内部,代码

unsigned int __fastcall sub_401000(int a1, int a2)
{
  int v2; // esi
  unsigned int v3; // eax
  unsigned int v4; // ecx
  unsigned int result; // eax

  v2 = dword_409B38;
  v3 = a2 + 1 + strlen((const char *)(a2 + 1)) + 1;
  v4 = 0;
  result = ((v3 - (a2 + 2)) >> 2) + 1;
  if ( result )
  {
    do
      *(_DWORD *)(a2 + 4 * v4++) ^= v2;
    while ( v4 < result );
  }
  return result;
}

a2也就是lpMem,发现后面的异或语句有v2,向上找v2的赋值语句,找到v2 = dword_409B38,双击dword_409B38,找到内容

这里是四个字节显示的,又由于小端存储,所以顺序是颠倒的,我们可以将其转换成一个字节查看

然后根据源码写脚本,写的有点不太明白,记录一下

代码参照文章:https://www.cnblogs.com/DirWang/p/11420740.html

x=[0xbb,0xaa,0xcc,0xdd]
y=[0xBB,0xCC,0xA0,0xBC,0xDC,0xD1,0xBE,0xB8,0xCD,0xCF,0xBE,0xAE,0xD2,0xC4,0xAB,0x82,0xD2,0xD9,0x93,0xB3,0xD4,0xDE,0x93,0xA9,0xD3,0xCB,0xB8,0x82,0xD3,0xCB,0xBE,0xB9,0x9A,0xD7,0xCC,0xDD]
i=0
z=[]
while i<len(y):
    t=chr(y[i]^x[i%4])
    z.append(t)
    i+=1
print(z)
print(''.join(z))

 

['\x00', 'f', 'l', 'a', 'g', '{', 'r', 'e', 'v', 'e', 'r', 's', 'i', 'n', 'g', '_', 'i', 's', '_', 'n', 'o', 't', '_', 't', 'h', 'a', 't', '_', 'h', 'a', 'r', 'd', '!', '}', '\x00', '\x00']
flag{reversing_is_not_that_hard!}

这里就可以知道为什么调用第一个弹窗会输出空白,因为第一个弹窗函数,是直接从第一个字符输出的,但是第一个字符解码后为'\0',直接截断,所以会输出空白,第二个弹窗是从lpMem+1开始输出的

### XCTF WEB进阶 Fakebook 解题报告 #### 源码分析 Fakebook 类似于社交网络平台,在此环境中存在多个功能模块,包括但不限于用户注册、登录以及个人信息管理等功能。通过查看源代码发现,该应用可能存在多种安全漏洞。 对于假想的 `fakebook` 平台而言,其核心逻辑通常围绕着用户的会话管理和数据交互展开。假设存在如下简化版 PHP 伪代码表示部分关键业务流程: ```php <?php class User { public $username; public $password; function login($input_username, $input_password){ // 存在一个潜在的安全隐患:未对输入做严格验证 if ($this->username === $input_username && md5($input_password) === $this->password){ $_SESSION['logged_in'] = true; return "Login successful"; } return "Invalid credentials"; } } ?> ``` 上述代码片段展示了用户认证过程中可能存在的安全隐患——使用弱哈希算法 MD5 对密码进行了处理[^1]。 #### 安全问题剖析 基于以上描述可以推测出几个主要攻击面: - **弱哈希函数**:MD5 已经被证明不再适合用于保护敏感信息,因为它容易受到碰撞攻击的影响。 - **缺乏输入过滤机制**:未能有效防止恶意字符进入系统内部,这可能导致 SQL 注入或其他类型的注入攻击发生。 - **不恰当的错误消息返回**:当用户名或密码错误时给出的具体提示可能会帮助攻击者缩小猜测范围。 #### 利用技巧 针对这些弱点,参赛选手可以从以下几个方面入手尝试突破并解决问题: - 尝试暴力破解或者彩虹表查找已知 MD5 值对应的原始字符串; - 测试是否存在其他形式的数据注入风险点,比如 URL 参数、POST 请求体内的字段等位置; - 探索是否有任何地方暴露出过多调试信息给外部访问者利用; 成功完成挑战后一般可以获得 flag 或者进一步的操作权限作为奖励。 #### 复现过程 为了模拟真实的渗透测试场景,建议按照以下方式构建实验环境来进行练习: 1. 构建一个类似的 Web 应用程序框架,确保其中包含了所有必要的组件和服务依赖关系; 2. 实施相应的防护措施来抵御常见的Web 攻击手段,如 XSS 和 CSRF 等; 3. 使用工具辅助自动化执行某些特定任务,例如 Hydra 可以用来实施字典攻击尝试登陆接口; 4. 记录每一步操作细节以便后续总结经验教训,并分享给社区成员共同学习进步。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值