BUUCTF Mysterious

这篇具有很好参考价值的文章主要介绍了BUUCTF Mysterious。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
通过题目简介和下载得到的文件格式分析,该题需要对该文件进行逆向分析

查壳

逆向第一步分析文件格式,以及查看是否加壳,本例用exeinfoPE进行以上操作
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
可知该程序大概率是vc6.0编译的32位程序,可以用od分析(od只能分析32位程序),并且没有加壳。

IDA静态分析

方法一:通过WinMain函数分析

用ida打开该程序
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
从函数名称表里能看到非常显眼的WinMain函数,熟悉windows sdk的同学肯定马上就能反应过来这是窗口程序,而不是控制台程序。
tips:其实直接打开这个程序也能看出。
附图:
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
一般的win32程序就是用WinMain函数作为主函数,通过操作系统调用回调函数,对用户的操作做出对应的反馈。
于是我们可以直接双击这个WinMain函数,对其进行反编译。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
反编译后得到下图
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
再双击这个返回值(这里有点套娃的意思,return WinMain(hInstance, hPrevInstance, lpCmdLine, nShowCmd)这个函数就是winmain函数,但是却把他写成返回值,我不知道这里是ida的问题还是别的什么问题)
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
发现是一个DialogBoxParamA函数,也就是对话框函数。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
给出一个msdn上对DialogBoxParamA函数的解释
链接: https://learn.microsoft.com/zh-CN/windows/win32/api/winuser/nf-winuser-dialogboxparama
之前我们讲了,既然要知道我输入数值之后程序做出了什么样的反应。那就必须要找回调函数。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft

mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
DialogFunc便是指向对话框过程的指针,这个对话框过程便是一个回调函数。双击这个这个函数查看他的代码
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
再双击这个返回值(为什么函数体就是一个孤独的返回值呢,其实这里是一个间接调用,sub_401090这个函数它其实就是DialogFunc()这个回调函数),这样就看到这个回调函数的内容了,接下来就一条代码一条代码分析咯
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft

方法二:通过string window取巧分析

有的同学对windows sdk不熟悉,想不到WinMain函数这个切入点,那么可以抛开上面的分析思路,打开ida后快捷键shift+F12直接打开string window。
立马就能发现well done这个非常可疑的字符串。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
双击这个字符串查看他在内存中的位置
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
双击后边的sub_401090函数,查看调用这个字符串的函数,来到汇编图形界面,按f5反编译。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
这样就来到了这个关键函数(回调函数)了。
这两种方法都可以达到相同的目的。

接下来分析这个回调函数
分享一个msdn对DialogFunc的解释
链接: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nc-winuser-dlgproc
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
和我们分析的函数int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4)进行比对,可知hwnd是句柄,a2便是消息,a3,a4是其他消息。

接着分析
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft

用memset函数把string为首地址的0x104个内存空间的值都置0。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
前面说了a2是消息,那么16对应的应该是WM_CLOSE这个宏定义,273对应的应该是用户按下确认键之类的吧(这里我不确定具体是什么,因为目前我对对话框过程也不是很了解,也是边学边做,说的不对的见谅)。
a3(wparam)是一个附带的消息,往往是坐标值之类的东西。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
附上该函数的msdn链接: https://learn.microsoft.com/zh-CN/windows/win32/api/Winuser/nf-winuser-getdlgitemtexta
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
可知,该函数把输入框里的值复制到&string指向的缓冲区。
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
得到string的字符个数,如果大于6就结束该程序。
下面是解题的关键——v10
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft

在回调函数的顶部我们知道了v10是一个int变量,而atoi()函数是用来将ascii(char型)转化为integer(int型)
转载一个链接链接: https://blog.csdn.net/u010806950/article/details/105505540?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166562775916782417052552%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166562775916782417052552&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-105505540-null-null.142v53control,201v3control&utm_term=atoi&spm=1018.2226.3001.4187
可知v10的值是将string字符串 转化为int型之后加1的值
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
从if的判断条件可以反推,v10=atoi(&string)+1=123
,atoi(&string)=122,所以sting的值为"122xxx",即开头三个数为122,但总共有几个字符暂不可知。接下来把v12,v13,v14转化成ascii码看看
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
接着往下看
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
于是Text=“flag”,然后是置零操作
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
itoa()函数的功能是将integer转化为ascii,第一个参数是要转化的值,第二个参数是转化后值的储存地址,第三个数是要转化的值的进制,这里为10进制。
大家可能纳闷,v5是一个char变量,&v5是什么意思,&v5取地址,把要转化的值存到以v5为首地址的数组中,ida中将v5定义为一个char变量,但这并不代表他就是char,他有可能是char[]数组。
接下来
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
第一条代码使Text=“flag{”,接着第二条指令使Text=“flag{123”,到最后Text=“flag{123_Buff3r_0v3rf|0w}”
接着是一个messagebox,well done是标题,Text是内容
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft

得到flag:flag{123_Buff3r_0v3rf|0w}

OD动态分析

但是得到了flag还不够,想知道我在文本框里输入什么值可以使程序输出messagebox。于是用od打开这个程序,定位到GetDlgItemTextA(hWnd, 1002, &String, 260);这个函数的汇编指令。该怎么做呢。
先在ida汇编图形界面中找到GetDlgItemTextA(hWnd, 1002, &String, 260);这个函数
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
发现了在这里
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
按空格进入文本界面
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft得到这条指令的VA(虚拟地址)为40113e
于是就定位到了这条指令的位置,在od中跳转到这个地址,并在push eax处下断点(根据右边的注释我们可以看到这里eax的值是输入框中字符串存放的首地址)
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
运行程序,我们之前说了sting的值为"122xxx",我们只能确定前三个数是122,后边的不确定,因此我们在输入框中输入122,接着程序运行到断点,,此时发现eax的值为19f5dc,于是在数据窗口中跳转到19f5dc这个地址
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
选定第一个19f5dc这个字节进行跟随
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
接着我们单步步过(f8),运行完40113e处的GetDlgItemTextA函数
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft

发现‘31’32‘’32‘也就是122传进了19f5dc这个地址处,我们接着单步步过往下执行,运行到4011a7处
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
这个指令对应的就是v10== 123
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
我们接着往下走,运行到4011b4处
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
4011b4处这条指令把一个字节大小的值以补零的方式(movsx)传给eax,接着4011bb处将eax和0x78(’x‘)作比较
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
我们可以注意到这个字节大小的值的地址是19f5df,正好在’31‘32‘‘32’(19f5dc–19f5de)的后边一个字节,而19f5dc不正好就是输入框中字符串存放的首地址吗!于是便能联想到
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
这个if判断里v12,v13,v14也是文本框中输入值的一部分,那么理性推测文本框中的值也就是string=“122xyz”。那我们把这个值输到文本框里运行程序试一下
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
果然得到了正确答案,flag显现出来了,证明我们之前的推理正确。
最后再提一下
mysterious buuctf,buuctf,windows,网络安全,c语言,.net,microsoft
在ida界面中仔细观察string,v12,v13,v14的地址分别是esp+25c,esp+25f,esp+260,esp+261,会发现他们是连起来的(25ch–261h),正好6个字节,string虽然被ida判定为char类型,但不代表源代码中string便是char类型,实际上它应该是char string[6],之所以被判定为char类型,是ida的判断而已,不代表一定正确,这样就能解释的清string与v12,v13,v14之间的关系了,事实上这个小细节在reverse赛题中经常遇到,做题时多留意留意变量之间的地址关系,会有意想不到的收获。这道题就讲到这,有些地方思路比较绕弯,说的不对还请指正,谢谢。文章来源地址https://www.toymoban.com/news/detail-810578.html

到了这里,关于BUUCTF Mysterious的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BUUCTF qr 1

    BUUCTF:https://buuoj.cn/challenges 题目描述: 这是一个二维码,谁用谁知道! 密文: 下载附件,得到一张二维码图片。 解题思路: 1、这是一道签到题,扫描二维码得到flag。 flag:

    2024年02月08日
    浏览(36)
  • BUUCTF中的“新年快乐”

    0x00 前言 今天看了一下日期,距过年还有28天,正好今天做的题目也叫新年快乐,就提前给大家拜个早年,祝大家早年幸福。 0x01 正文 虽然是新年快乐的题,但是打开是一点儿都不快乐,它让我输入flag。 既然这样的话,那只好PE一下打开看看啰。   于是,遇见了做题以来的

    2024年02月08日
    浏览(42)
  • BUUCTF Mysterious

    通过题目简介和下载得到的文件格式分析,该题需要对该文件进行逆向分析 逆向第一步分析文件格式,以及查看是否加壳,本例用exeinfoPE进行以上操作 可知该程序大概率是vc6.0编译的32位程序,可以用od分析(od只能分析32位程序),并且没有加壳。 用ida打开该程序 从函数名

    2024年01月21日
    浏览(40)
  • BUUCTF:[MRCTF2020]套娃

    查看源码发现 PHP非法参数名传参问题,详细请参考我的这篇文章:谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用 %0a 换行符绕过,payload: /?b.u.p.t=23333%0a 得到下一步信息: secrettw.php 注释中的是 JsFuck ,用这个网站去运行即可得到信息:https://jsfuck.com POST传个 Merak=moc

    2024年02月07日
    浏览(43)
  • BUUCTF-一叶障目 解析

    打开文件发现一张png图片,里面没有内容,使用tweakpng打开 tweakpng报错 ,说明crc校验值对不上 有两种可能,一是crc值被修改,二是图片的宽高被修改(在ctf中多半是后者) 先尝试修改crc值为55900eef,发现打开后没有变化,于是尝试爆破图片宽高 首先需要获取图片的crc值  于

    2024年02月05日
    浏览(36)
  • BUUCTF rsarsa

    题目: Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm. p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q =  1187484383798029703209240584865365685276091015454338090765004019

    2024年02月05日
    浏览(37)
  • BUUCTF-菜刀666

    题目:   使用wireshark打开数据流: 看题目就知道应该是一个菜刀的流量,也就是HTTP流量。在应用显示过滤器中输入http,先看统计里的http请求,统计-HTTP-请求   看到这个1.php的提示,返回来看一下它里面有什么内容:     这里发现一个压缩包, 导出分组字节流,11.zip flag找

    2024年02月16日
    浏览(30)
  • BUUCTF

    exeinfo查壳 64位,无壳,用ida64打开 首先查看字符串表 发现flag exeinfo查壳 64位,无壳,用ida64打开 首先查看字符串 发现疑似flag的字符串 查看引用该字符串的函数 Str2即是该字符串。注意到有一个strcmp()函数,所以基本确定Str2即是flag。有一个for循环处理了Str2:当Str2中有一

    2024年02月05日
    浏览(35)
  • BUUCTF reverse题解汇总

    本文是BUUCTF平台reverse题解的汇总 题解均来自本人博客 目录 Page1 Page2 Page3 Page4 easyre reverse1 reverse2 内涵的软件 新年快乐 xor helloworld reverse3 不一样的flag SimpleRev Java逆向解密 [GXYCTF2019]luck_guy [BJDCTF2020]JustRE 刮开有奖 简单注册器 pyre [ACTF新生赛2020]easyre findit rsa [ACTF新生赛2020]rome

    2024年02月03日
    浏览(32)
  • BUUCTF刷题记录

    首先,它从GET请求中获取名为\\\"host\\\"的参数,并将其赋值给变量$host。 接下来,代码使用 escapeshellarg() 函数对$host进行转义,以防止命令注入攻击。这个函数会在字符串的开头和结尾添加单引号,会将其中的单引号字符\\\'加一个转义符,再加上一对单引号进行链接单,转义为 \\\'

    2024年01月17日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包