0x01 题目描述

题目比较简单,不过这种题感觉比单纯的逆向算法来有意思的多,所以记录一下~

0x02 脱壳

先拖到IDA瞅一眼,发现加壳了

用PEID查一下是什么壳,但是没有查出来。使用Strings看一下有没有什么可参考的信息,发现是UPX 3.91的壳,
但是在UPX官网上下载的脱壳工具并没有成功脱壳,那么手脱吧。

UPX的脱壳比较简单,找到pushad 和popad下断点,然后往下跟就好,找到的OEP

使用OD打开evil.exe,首先可以看到开头的一段在循环调用一个函数,函数内进行了pushad, popad操作

我们之间跳过这段循环F4跳到循环的下一条指令,然后继续跟进,发现这儿还有个pushad

之间看后面的代码,发现popad,F4到popad后继续往下跟(也可以在pushad的时候在栈上下硬件访问断点)
到这个地方已经很明显是程序的入口点了

右键使用OllyDump将程序dump出来即可,UPX加壳的程序不需要修复IAT就可以直接运行

0x03 代码分析

将脱壳后的程序拖入IDA(有些函数名有所修改)

sub_401370函数的逻辑如下,主要行为为拷贝evil.exe到%temp%下一份,在从资源中释放evil.docx文件到当前目录
创建一个进程evil.exe "evil.exe",然后打开docx

delete_exe的功能很简单,就是如果命令行参数个数为2(即之前新创建的进程),则循环删除evil.exe文件

read_shellcode_from_internet_jpg从http://www.ddctf.com/x.jpg中读取数据。x.jpg即题目中的x.jpg,自建服务器然后将x.jpg放在
服务器上,修改本地hosts将www.ddctf.com指向自建服务器即可

之后是两个解码函数,这里可以直接忽略其中的逻辑。
然后是执行shellcode的函数execute_shellcode,OD动态跟一下看执行的shellcode内容是什么

使用OD动态跟到执行shellcode的地方,发现一堆push数据的地方,这在shellcode中是一种典型的字符串存储手段,
执行完push之后,在数据窗口检查栈内存中存储的数据即可看到Key

最新文章

  1. vim 用法
  2. Final-阶段站立会议6
  3. rabbitmq qos prefetch count的设置与作用
  4. 使用LIBSVM工具实现样本分类预测——MatLab
  5. Parcelable和Serializable的区别
  6. paip.快捷方式分组管理最佳实践ObjectDock
  7. 1.2 XmlBeanFactory的实例化
  8. 转:[译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序
  9. 实现字符串匹配的KMP算法
  10. wordpress教程之自带缩略图功能
  11. qq邮箱是怎么做到同一个浏览器让多个不用用户同时打开的? --session的控制
  12. github从上传代码到发布静态网站
  13. PL/SQL 游标 (实验七)
  14. 一款PHP环境整合工具—VertrigoServ介绍
  15. 并发concurrent---1
  16. 2017-11-4—模拟PID电路(参考ADN8834datasheet)
  17. Python3+mitmproxy安装使用教程(Windows)
  18. 只知道ajax?你已经out了
  19. 利用朴素贝叶斯分类算法对搜狐新闻进行分类(python)
  20. Windows安装python3.x后,pip list警告!DEPRECATION: The default format will switch to columns in the future.

热门文章

  1. Ubuntu 添加中文字体
  2. Ubuntu下使用Git_1
  3. 第十六篇 Python之迭代器与生成器
  4. Python 套接字的使用 (1)
  5. Java IO学习--输入输出流
  6. [Linux] umount目录提示device is busy的解决方法
  7. PAT——乙级1022:D进制的A+B &乙级1037:在霍格沃茨找零钱
  8. [C/C++] new/delete和malloc/free基本区别
  9. HDU 4582 DFS spanning tree(DFS+贪心)(2013ACM-ICPC杭州赛区全国邀请赛)
  10. android-ViewList的通用ViewHold