吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4116|回复: 11
收起左侧

[CTF] LitCTF-RE -程序和人有一个能跑就行了 【简单探究】

[复制链接]
枫MapleLCG 发表于 2023-5-16 23:40
本帖最后由 枫MapleLCG 于 2023-5-17 09:57 编辑

初步分析

sub_4015A0是一个RC4加密函数,key为litctf

加密Buf2(我们输入的flag)后,与Buf1比较,不过Buf1是假数据。解密出来得到的是

LitCTF{this_is_a_fake_flag}。

数据是假的,但是函数是正常的功能函数。

接着我们需要注意sub_475190这个函数,也就是那一串红条。

这个函数很特别,里面进行了一些我看不懂的操作。当你在函数外试图F8步过的时候,会进入到正确密文的处理流程里,但其实这时并没有步过sub_475190。因为处理正确密文的操作是在sub_475190里调用的,而这时你的调试器就会在这个流程里中断。

根据其他选手写的wp,据说是C++异常处理。但目前没有人给出一个详细的说明(坐等官方wp)

我自己临时补充了相关的知识,感觉这题并不是简单使用了C++里的try、catch、throw等函数

因为我找不到使用这些函数的特征。。应该是用了别的方法来处理异常。

这边提一嘴一个非常简单发现”解密正确密文“流程的方法

如图,右边是正常的解密流程,左边是虚假的流程。其实只有密文不一样。

ida提供的汇编代码是能够正确反映各操作的关系的,但是转伪代码的时候忽略掉了。

正确的flag是:LitCTF{welcome_to_the_litctf}

浅浅探究

这题的最终题解数为50几个,但实际上只是为了解题的话,简单的可怕。这告诉我们不要太依赖f5

但他究竟是怎么阻碍我们用伪代码分析的呢?emm,说实话,我也不知道

就算你使用普通的try、catch、throw函数,ida的伪代码也是会忽略掉catch里的代码的。

但我现在好奇的是他到底是怎么处理异常的,或者说真的是用了异常处理吗?

我们跟进sub_475190,经过恶心眩晕的大量F7步进操作,最终让程序进入正确解密流程的函数为:

sub_475190 --> sub_40AC80 --> LABEL_10: sub_40A4C0,如图:

我们把目光聚焦到:

return (*(*a1+36))

这是个函数地址,指向正确的解密流程。

这个地址怎么得到的?看下汇编

地址存在了ecx,ecx又是“ebx+偏移”得到的,而再往上溯源,看地址40ACD7就会发现ebx是”eax+偏移“得来的

而eax的值又是箭头所指向的call赋予的。也就是说,正确的地址,是eax经过了一系列的偏移得到的。

经过计算,偏移量为36,眼熟吗?

return (*(*a1+36))

而此时eax所存地址即为a1。

那我们来看看,这个call,究竟是干嘛的

sub_417C90是一些线程操作,水平有限,看不懂

sub_41C120有提到:_InterlockedAdd()我也不知道干嘛的

总之v5的值即为eax

按照eax存的地址,内存窗口追过去,就是这样


堆栈里是这样

嗯,本人水平有限,分析到这就分析不动了。

不过看到这里,也许确实是用异常处理的方式来执行正确流程
那到底怎么执行的这个异常处理的- -
坐等wp。

免费评分

参与人数 9威望 +1 吾爱币 +27 热心值 +8 收起 理由
SD7935 + 1 + 1 用心讨论,共获提升!
SYWZWL + 1 + 1 我很赞同!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Spacecraft + 1 认真学习
杨辣子 + 1 + 1 热心回复!
抱歉、 + 1 用心讨论,共获提升!
xaibin + 1 + 1 值得学习,不错。
afo2023 + 1 + 1 这个好
zz08808 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2023-5-17 05:15

需要指出,ida在这里的伪代码有逻辑问题。

IDA 是对的。因为 memcmp 的返回值是相等返回 0,即 FALSE

点评

但是程序在你输入不等的内容,才会输出u are wrong  详情 回复 发表于 2023-5-17 09:45

免费评分

参与人数 1吾爱币 +1 收起 理由
枫MapleLCG + 1 用心讨论,共获提升!

查看全部评分

 楼主| 枫MapleLCG 发表于 2023-5-17 00:19
afo2023 发表于 2023-5-17 02:06
DQQQQQ 发表于 2023-5-17 09:29
是的
C系列 的比较函数。 是相等为0,大于为1,小与为负数

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
枫MapleLCG + 1 + 1 用心讨论,共获提升!

查看全部评分

Daneellee 发表于 2023-5-17 09:35
感谢楼主分享!
 楼主| 枫MapleLCG 发表于 2023-5-17 09:45
本帖最后由 枫MapleLCG 于 2023-5-17 09:48 编辑
爱飞的猫 发表于 2023-5-17 05:15
[md]> 需要指出,ida在这里的伪代码有逻辑问题。

IDA 是对的。因为 `memcmp` 的返回值是相等返回 `0`, ...

哦,好像是哦,写晕了
YeeYue 发表于 2023-5-17 10:26
感谢楼主分享
mtsfhh 发表于 2023-5-17 19:23
没想到在这还看得到litctf的wp
Idonk 发表于 2023-5-17 20:28
一开始还真没关注到这个,没想到能看到litctf的题
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 19:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表