这是2017 ddctf的一道逆向题,

挑战:《恶意软件分析》

赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件。随后IT部门发现小A的电脑发出了异常网络访问请求,进一步调查发现小A当时所打开的附件其实是一个伪装成word文档的恶意可执行文件。

赛题描述: 请在试着分析evil.exe和其所下载的x.jpg, 从中找出key.

评分标准: 密钥正确则可进入下一题。

攻防世界只给了exe文件,没有给x.jpg文件,(每个人的x.jpg文件是不同的,解得的flag也是不一样的。)

查壳: UPX(3.91)[NRV,best]

脱壳:

工具脱壳失败,手动脱壳。

两次esp脱壳法,dump。

(第一次脱没脱干净,但发现可以静态分析,0.0)

具体分析可参考:

【CTF习题】恶意软件分析
https://www.52pojie.cn/thread-679122-1-1.html
(出处: 吾爱破解论坛)

 1 int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
2 {
3 char *new_data; // ST10_4
4 int key[67]; // [esp+4h] [ebp-118h]
5 size_t dwSize; // [esp+114h] [ebp-8h]
6 void *jpg_data; // [esp+118h] [ebp-4h]
7
8 if ( sub_401370(hInstance) == 6 )
9 return 0;
10 sub_401620();
11 jpg_data = download_xjpg_4018F0(&dwSize);
12 if ( jpg_data )
13 {
14 if ( dwSize )
15 {
16 new_data = malloc(dwSize);
17 init_key_401740(key, 0x4A8754F5745174ui64);
18 decrypt_401800(key, jpg_data, new_data, dwSize);
19 exec_shellcode_401220(new_data, dwSize);
20 }
21 free(jpg_data);
22 }
23 return 0;
24 }

在decrypt_401800函数中,我把参数一定义成了个结构体,两个int型成员,一个byte[256]数组

00000000 key_struct      struc ; (sizeof=0x108, mappedto_22)
00000000 x dd ?
00000004 y dd ?
00000008 key_data db 256 dup(?)
00000108 key_struct ends

这样再看清晰了一些

 1 void __cdecl decrypt_401800(key_struct *key, char *jpg_data, char *new_data, unsigned int dwsize)
2 {
3 unsigned __int8 v4; // ST02_1
4 unsigned __int8 v5; // ST03_1
5 unsigned int i; // [esp+4h] [ebp-4h]
6
7 for ( i = 0; i < dwsize; ++i )
8 {
9 key->x = (key->x + 1) % 256;
10 key->y = (key->key_data[key->x] + key->y) % 256;
11 v4 = key->key_data[key->x];
12 v5 = key->key_data[key->y];
13 key->key_data[key->x] = v5;
14 key->key_data[key->y] = v4;
15 new_data[i] = key->key_data[(v5 + v4) % 256] ^ jpg_data[i];
16 }
17 }

wp:

 1 key=[]
2 a=0x4A8754F5745174
3 temp=[0 for i in range(8)]
4 for i in range(8):
5 temp[i]=a
6 a=a>>8
7 for i in range(256):
8 key.append((i+temp[i%8])&0xff)
9
10
11 f=open('x.jpg','rb')
12 jpg_data=f.read()
13 new_data=[]
14 f.close()
15 x=0
16 y=0
17 for i in range(len(jpg_data)):
18 x=(x+1)%256
19 y=(key[x]+y)%256
20 key[x],key[y]=key[y],key[x]
21 new_data.append(((key[(key[x]+key[y])%256]^jpg_data[i])^i)&0xff)
22 # print(new_data)
23 mf=open('mydecrypt','wb')
24 mf.write(bytes(new_data))
25 mf.close()
26
27 new_data=bytes(new_data)
28 flag = []
29 i = 0
30 while(i<len(new_data)):
31 if(new_data[i]==0x68):#这里是解析push指令,保存压栈数据
32 flag.append(new_data[i+1:i+5])
33 i += 3
34 i += 1
35
36 for i in flag[::-1]: #输出压栈数据
37 print(str(i)[2:-1], end='')
38 print()

输出:

Key: DDCTF-cc49badacb1c4d69bd4ae7173d9e9ade@didichuxing.comXCongratsX   user32.dll A\x8eN\x0e\xec

这题做的话最简单的方法就是搭本地服务,然后动态调试,省时省力。

整体上程序流程清晰,算法还原也不复杂。

脱壳请参考:https://www.cnblogs.com/dliv3/p/6909066.html

攻防世界 key来源:https://blog.csdn.net/qq_38025365/article/details/89389311

DDCTF-01c981e4d5ea4da6b38b2990abbaf411@didichuxing.com

(滴滴的题还是蛮有趣的)

攻防世界 reverse evil的更多相关文章

  1. 攻防世界 reverse 进阶 10 Reverse Box

    攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...

  2. 攻防世界 reverse tt3441810

    tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...

  3. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

  4. 攻防世界 reverse Windows_Reverse2

    Windows_Reverse2   2019_DDCTF 查壳: 寻找oep-->dump-->iat修复   便可成功脱壳 int __cdecl main(int argc, con ...

  5. 攻防世界 reverse BabyXor

    BabyXor     2019_UNCTF 查壳 脱壳 dump 脱壳后 IDA静态分析 int main_0() { void *v0; // eax int v1; // ST5C_4 char ...

  6. 攻防世界 reverse parallel-comparator-200

    parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...

  7. 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017

    8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...

  8. 攻防世界 reverse easy_Maze

    easy_Maze 从题目可得知是简单的迷宫问题 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 ...

  9. 攻防世界 reverse seven

    seven  hctf2018 这是一个驱动文件 ida载入,查找字符串 根据字符串来到函数:sub_1400012F0 __int64 __fastcall sub_1400012F0(__int6 ...

随机推荐

  1. 在浏览器上播放m3u8视频

    在edge上有效 <video width="600" controls> <source src="https://www.gentaji.com/2 ...

  2. VAST二月上线交易所,打通NGK各大币种之间通道!

    1月20日,管理着超过8.7万亿美元资产的全球最大资产管理公司贝莱德似乎已批准其旗下两个相关基金--贝莱德全球分配基金公司和贝莱德基金投资比特币期货.提交给美国证券交易委员会的招股说明书文件显示,贝莱 ...

  3. NGK公链全面服务旅游经济

    有数据显示,2019 年全球旅游总收入已达 6.5万亿美元, 占全球 GDP 的 7.3%,旅游业发展所创造的收益,于全球经济的重要性,不言而喻. 在旅游产业蓬勃发展的同时,中心化运营模式下却仍存在痛 ...

  4. 国内源安装ROS2

    资料参考: https://www.mscto.com/op/428870.html 需要修正的一点是,使用如下的命令添加源: sudo sh -c 'echo "deb [arch=$(d ...

  5. 从跳频技术聊CDMA/WIFI之母海蒂·拉玛传奇的一生

    导语:本篇的内容都是 文末的参考文章摘要而来的,本人根据自己的癖好,以及对 海蒂·拉玛 人生的感慨整理成本文. "WiFi"之母的海蒂·拉玛在中国的知名度,比起克劳德·香农应该也不 ...

  6. 文字链接Link

    效果展示: 代码展示: <el-table-column label="引流扫码人数" align="center"> <template s ...

  7. Elasticsearch 7.x配置用户名密码访问 开启x-pack验证

    一.修改elasticsearch 配置文件 1.在配置文件中开启x-pack验证 #进入es安装目录下的config目录 vim elasticsearch.yml # 配置X-Pack http. ...

  8. React Context 理解和使用

    写在前面 ​ 鉴于笔者学习此内容章节 React官方文档 时感到阅读理解抽象困难,所以决定根据文档理解写一篇自己对Context的理解,文章附带示例,以为更易于理解学习.更多内容请参考 React官方 ...

  9. linux之docker 安装 mysql

    首先进入docker : 命令:systemctl start docker 查詢一下docker的状态: 命令:docker images   现在开始安装mysql了,第一步拉取镜像 命令:doc ...

  10. python爬取股票最新数据并用excel绘制树状图

    大家好,最近大A的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊. 不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们. 以下截图 ...