ctf.360.cn第二届,逆向部分writeup——第五题

题目:见附件

这是最后一题,难度加倍。

看题目意思,应该是模拟一个下载者,从网上下载一个shellcode然后执行。要求修复这个shellcode然后获得key。

OD载入MFC_ASM.exe,F9出现程序界面。

由于平时写C程序访问网络都直接用socket,找了一下竟然没有发现socket调用,看了导入表,发现原来使用wininet.dll提供的http封装。

(这里不知道有没有更好的方法能让OD跟踪到button按钮的用户代码调用,还请大牛不吝赐教)

直接按button,出现错误:

此时的栈情况:

BBBBBBBB和DDDDDDD数据和Exploit.html文件里面开头的是一致的,可见程序已经将Exploit.html下载并拷贝到了堆栈地址0012DF30。

为了跟踪到button按钮的处理函数,还是从字符串入手,随便翻翻发现:

此处有http协议的引用,下断点后,按button能停下来。一路F8,可以跟到00401519处,此处的retn指令返回到了shellcode中的错误地址。

需要注意的是,shellcode的起始地址是0012DF30,但00401518处的leave指令,会将esp指向0012E130。这个地址里面的值,就是前面错误对话框中出现的值。

之所以要指出这个,是因为当前的esp指向了shellcode内部,如果执行shellcode代码,会覆盖掉shellcode的一些区域,导致出错。这就就是需要修正的第一个有问题的地方。

下面就是要分析Exploit.html这个文件了,载入IDA,进行静态分析。由于对windows下的shellcode不是很熟悉,这里花了非常多的时间。关键点就是如大牛提示的,需要一个一个函数分析,一段一段shellcode中的字节寻找。由于这个shellcode的复杂度,修复实际上就是寻找到一个合适的入口点,然后在OD中将EIP指向它,直接执行就可以弹出key。

函数还是比较容易寻找的,一般以push ebp开头,后面跟着sub esp(或add esp)。IDA能分析出一些函数,许多还是要自己去寻找。

这里IDA的Xrefs功能(快捷键X)实在是太有用了。

最终分析下来的函数列表:

这里几个关键函数我都做了注释,里面有非常多的代码值得学习,比如fs:[eax]这种获取kernel32基址的方法,以及建立shellcode的导入函数表,运行时动态获取当前指令地址,从而实现在shellcode中寻址与shellcode加载地址无关。

这里几乎找全了shellcode中的所有函数,通过Xrefs分析,还是没有哪里调用了FindFunctions等关键函数,也就是没有找到入口。只能在IDA代码text视图下,一点点的看,终于在00000CDD处找到一段没有定义的数据字节。按C,定义为code后:

Great!入口点应该就在这里了。因为其他地方出了字符串表和00字节,没有多余的疑似未定义代码了。

OD载入,断点在00401518处,修改EBP为0012DF30。F8到00401519,修改当前栈上0012DF34处的值为0012DF30+CDD。然后F9,直接弹出对话框,key就在这里啦!

时间: 2024-10-29 19:07:53

ctf.360.cn第二届,逆向部分writeup——第五题的相关文章

ctf.360.cn第二届,逆向部分writeup——第四题

题目:见附件 这题开始有些小复杂了. 运行程序,可以看见界面如下 注意看"隐藏信息完毕!"字符串的位置 直接搜索push 40405c,找到代码位置401a48. 网上翻找到代码块的入口地址4017a0.很显然这是一个非常长的函数,使用IDA进行静态分析.   v2 = CreateFileA(*((LPCSTR *)v1 + 24), 0x80000000u, 1u, 0, 3u, 0x80u, 0);   if ( v2 == (HANDLE)-1 )   {     result

ctf.360.cn第二届,逆向部分writeup——第二题

题目:见附件 这题目被提示的运行两次坑了. OD载入,设置命令行参数pass.db. F8到VirtualAlloc函数,发现size参数为0,导致函数调用失败. 根据pass.db长度,设置size=0x10,F8继续. 发现CreateFileA的FileName参数依然是pass.db,修改成pas1.db. F9正常运行,得到pas1.db文件. 实际上,这里pas1.db的内容已经是答案了,受到提示影响"patch掉bug后运行两次",所以得到pas2.db后,怎么提交都不对

ctf.360.cn第二届,逆向部分writeup——第三题

题目:见附件 这题目是最快搞定的,提示很明确 exe直接运行出错,OD打开后,发现入口点就是一个jmp F8,跟踪到jmp后的地址,发现了程序运行出错的原因. 实际上这个题目就是模拟病毒感染exe,修改文件入口指令,插入恶意代码的行为. 修补实际上就是找到真实的入口函数头的代码,将前面的jmp等指令nop掉.(修改OEP也行)

为了CTF比赛,如何学习逆向和反汇编?

作者:无名侠链接:https://www.zhihu.com/question/23810828/answer/138696052来源:知乎著作权归作者所有,转载请联系作者获得授权. 元旦节马上就要过去,赶紧趁着12点之前写完回答. ====如果觉得本文对你有用,请点个赞并关注一下我吧~==== 我做逆向大概四年左右,虽然我没有参加过CTF,但还是可以写一些关于如何学习逆向方面的内容~ 逆向实际上是很枯燥的工作,我能从枯燥中感到快乐,这就是支撑我学习逆向的动力了. 学习逆向后有什么用?难道就仅仅

浏览器被hao.360.cn劫持怎么办

特么的现在互联网太没节操了,一大早发现我的浏览器被hao.360.cn劫持了,弄了好久都没弄好,后来一想可能是因为qvod的原因,这可是哥当年看片的神器啊…… 废话不说: 1,进入:C:\ProgramData\QvodPlayer\QvodWebBase2,点开1.0.0.53(或者其它)文件夹3,直接删除里面的文件是删除不了的.更改QvodWebBase64.dll后缀名为QvodWebBase64.txt然后打开就没有了 会不会再出现情况,还需要再看……

桌面以及任务栏的所有浏览器,被加上了 hao.360.cn的网址

桌面以及任务栏的所有浏览器,被加上了hao.360.cn的网址 也不知道是安装了什么软件,中了360的招. 桌面以及任务栏的所有浏览器,被加上了hao.360.cn的网址. 这种东西,肯定是该死的360 周鸿祎或者及其走狗做的了. 修改方法: 1)桌面快捷方式,可以右键点击,选择属性. i) 常规 标签页,把只读属性去掉 ii) 快捷方式 标签页的[目标]里,把 http://hao.360.cn/?src=lm&ls=n4a2f6f3a91 的部分删除. 2)开始菜单 快捷方式 右键点击,然后

ISCC 2016 逆向部分 writeup

ISCC2016 逆向部分 by GoldsNow 做了这套题目感觉涨了不少的姿势..渣渣就只能够用渣渣的方法 题目下载 Help me 描述:I've got a difficult task and I can't solve it. I need your help! 思路:爆破 ELF64位的程序,直接在IDA中打开,可以看出来思路应该是比较清晰 先点进去main函数来进行分析. for ( i = 0; i <= 15; ++i ) { if ( !(v11 & 1) ) ++v5

第二届TSCTF比赛writeup及心得-Web

1. 送分题 一开始真没明白为什么叫送分题,后来明白了,泪流满面..我只想说,查看源码这个事情一辈子都不能忘. 还是推荐以后都用这个,就不会漏了 2.Do you know time 网页显示一张福利图片,下载下来,随便用二进制打开图片,翻到最后面,发现了代码,种子确定了,srand就没意义了,种子是由time()函数确定的,发到服务器上总要一点时间,所以我们用time()+30的时间做种子,然后运行程序,就差不多能撞到服务器上的time()的时间. 但是一开始死活没找到入口,我还以为有什么信息

实验吧逆向catalyst-system Writeup

下载之后查看知道为ELF文件,linux中执行之后发现很慢: 拖入ida中查看发现有循环调用 sleep 函数: 这是已经改过了,edit -> patch program -> change byte 修改一下比较参数可以去除等待时间,总共去除两处: 运行之后发现是输入 username 和 passsword 的方式: 那么问题就在两者上面了. 反编译之后查看源码,v8对应username, v7为password. 点进第一个函数,在 return 中是对用户名的判断,易推断出用户名为