攻防世界--key
测试文件:https://adworld.xctf.org.cn/media/task/attachments/c6cf449ae4b7498eba5027c533386a40.exe
1.准备

获取信息:
- 32位文件
2.IDA打开
反汇编main函数
void sub_401100()
{
signed int v0; // esi
signed int v1; // esi
unsigned int v2; // edi
void **v3; // ebx
void **v4; // eax
int v5; // ecx
int v6; // ST04_4
int v7; // ST08_4
int v8; // ST0C_4
int v9; // eax
int v10; // ST0C_4
char *v11; // esi
int v12; // ecx
void **v13; // eax
int v14; // eax
int v15; // ST0C_4
int v16; // eax
int v17; // ST0C_4
int v18; // eax
int v19; // ST0C_4
int v20; // eax
int v21; // ST0C_4
int v22; // eax
int v23; // ST0C_4
int v24; // eax
int v25; // ST0C_4
int v26; // eax
int v27; // ST0C_4
int v28; // eax
int v29; // [esp-4h] [ebp-13Ch]
int Dst; // [esp+14h] [ebp-124h]
char v31[]; // [esp+20h] [ebp-118h]
char v32; // [esp+24h] [ebp-114h]
int v33; // [esp+5Ch] [ebp-DCh]
char v34; // [esp+61h] [ebp-D7h]
int v35; // [esp+64h] [ebp-D4h]
int v36; // [esp+68h] [ebp-D0h]
char v37; // [esp+6Ch] [ebp-CCh]
FILE *File; // [esp+70h] [ebp-C8h]
char v39; // [esp+84h] [ebp-B4h]
void *v40; // [esp+CCh] [ebp-6Ch]
int v41; // [esp+DCh] [ebp-5Ch]
unsigned int v42; // [esp+E0h] [ebp-58h]
void *v43; // [esp+E4h] [ebp-54h]
unsigned int v44; // [esp+F4h] [ebp-44h]
unsigned int v45; // [esp+F8h] [ebp-40h]
void *Memory[]; // [esp+FCh] [ebp-3Ch]
unsigned int v47; // [esp+10Ch] [ebp-2Ch]
unsigned int v48; // [esp+110h] [ebp-28h]
__int128 v49; // [esp+114h] [ebp-24h]
__int16 v50; // [esp+124h] [ebp-14h]
char v51; // [esp+126h] [ebp-12h]
int v52; // [esp+134h] [ebp-4h] v45 = ;
v44 = ;
LOBYTE(v43) = ;
v52 = ;
v42 = ;
v41 = ;
LOBYTE(v40) = ;
LOBYTE(v52) = ;
v0 = ;
v47 = 'dime';
LOWORD(v48) = 'a';
*(_OWORD *)Memory = xmmword_40528C; // htadimehtadimeht
v50 = '.<';
v51 = ;
v49 = xmmword_4052A4; // <<<....++++---->
do
{
sub_4021E0(&v40, 1u, (*((_BYTE *)Memory + v0) ^ *((_BYTE *)&v49 + v0)) + );
++v0;
}
while ( v0 < );
v1 = ;
v48 = ;
v47 = ;
LOBYTE(Memory[]) = ;
LOBYTE(v52) = ;
v2 = v42;
v3 = (void **)v40;
do
{
v4 = &v40;
if ( v2 >= 0x10 )
v4 = v3;
sub_4021E0(Memory, 1u, *((_BYTE *)v4 + v1++) + );
}
while ( v1 < );
memset(&Dst, , 0xB8u);
sub_401620(v5, v6, v7, v8);
LOBYTE(v52) = ;
if ( v31[*(_DWORD *)(Dst + )] & )
{
v9 = sub_402A00(std::cerr, "?W?h?a?t h?a?p?p?e?n?", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v9, v10);
exit(-);
}
sub_402E90(&Dst, &v43);
v11 = &v32;
if ( File )
{
if ( !(unsigned __int8)sub_4022F0(&v32) )
v11 = ;
if ( fclose(File) )
v11 = ;
}
else
{
v11 = ;
}
v37 = ;
v34 = ;
std::basic_streambuf<char,std::char_traits<char>>::_Init(&v32);
v35 = dword_408590;
File = ;
v36 = dword_408594;
v33 = ;
if ( !v11 )
std::basic_ios<char,std::char_traits<char>>::setstate((char *)&Dst + *(_DWORD *)(Dst + ), , );
v13 = Memory;
if ( v48 >= 0x10 )
v13 = (void **)Memory[];
if ( sub_4020C0(&v43, v12, v44, (int)v13, v47) )
{
v28 = sub_402A00(std::cout, "=W=r=o=n=g=K=e=y=", sub_402C50);
}
else
{
v14 = sub_402A00(std::cout, "|------------------------------|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v14, v15);
v16 = sub_402A00(std::cout, "|==============================|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v16, v17);
v18 = sub_402A00(std::cout, "|==============================|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v18, v19);
v20 = sub_402A00(std::cout, "|==============================|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v20, v21);
v22 = sub_402A00(std::cout, "\\ /\\ /\\ /\\ /\\==============|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v22, v23);
v24 = sub_402A00(std::cout, " \\/ \\/ \\/ \\/ \\=============|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v24, v25);
v26 = sub_402A00(std::cout, " |-------------|", sub_402C50);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v26, v27);
std::basic_ostream<char,std::char_traits<char>>::operator<<(std::cout, sub_402C50);
v28 = sub_402A00(std::cout, "Congrats You got it!", sub_402C50);
}
std::basic_ostream<char,std::char_traits<char>>::operator<<(v28, v29);
sub_401570(&v39);
std::basic_ios<char,std::char_traits<char>>::~basic_ios<char,std::char_traits<char>>(&v39);
if ( v48 >= 0x10 )
sub_402630(Memory[], v48 + );
if ( v2 >= 0x10 )
sub_402630(v3, v2 + );
if ( v45 >= 0x10 )
sub_402630(v43, v45 + );
}
第74行调用sub_4021E0函数的最后一个参数生成了一个字符传入。连起来生成字符串
#include <iostream> #define _BYTE unsigned char using namespace std; int main()
{
const char* Memory = "themidathemidathemid";
const char* v50 = ">----++++....<<<<.";
signed int v0 = 0;
char str;
do {
str = (*(Memory + v0) ^ *(v50 + v0)) + 22;
cout << str;
++v0;
} while (v0 < 18);
system("PAUSE");
return 0;
}
`[^VZe`uYaY]`s^joY
3.OD打开
程序打开输出是这样

使用OD打开之后,定位到字符串处,发现前面有条指令是可以跳过这段字符串输出的
. 8B40 mov eax,dword ptr ds:[eax+0x4]
. F68405 E8FEFF>test byte ptr ss:[ebp+eax-0x118],0x6
0021123E 74 25 je Xkey.00211265
. 8B0D C8502100 mov ecx,dword ptr ds:[<&MSVCP140.std::ce>; MSVCP140.std::cerr
. BA E4522100 mov edx,key.002152E4 ; ASCII "?W?h?a?t h?a?p?p?e?n?"
0021124B . 502C2100 push key.00212C50
. E8 AB170000 call key.00212A00
. 8BC8 mov ecx,eax
. FF15 call dword ptr ds:[<&MSVCP140.std::basic>; MSVCP140.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::operator<<
0021125D . 6A FF push -0x1 ; /status = FFFFFFFF (-1.)
0021125F . FF15 call dword ptr ds:[<&api-ms-win-crt-runt>; \exit
因此我们可以判断出,这段字符串就是个烟雾弹,让我们不能进入真正的程序的,而真正的key就在下面。
4.代码分析
if ( v48 >= 0x10 )
v13 = (void **)Memory[];
if ( sub_4020C0(&v43, v12, v44, (int)v13, v47) )
{
v28 = sub_402A00(std::cout, "=W=r=o=n=g=K=e=y=", sub_402C50);
}
else
{
...
通过这段代码我们可以知道,sub_4020C0函数就藏着key,OD中找到对应的代码,设置断点
. FF75 D4 push dword ptr ss:[ebp-0x2C]
0021131A . 0F4345 C4 cmovnb eax,dword ptr ss:[ebp-0x3C]
0021131E . push eax
0021131F . FF75 BC push dword ptr ss:[ebp-0x44]
. push ecx
. 8D4D AC lea ecx,dword ptr ss:[ebp-0x54]
00211326 . E8 950D0000 call key.002120C0
前面都是函数的参数,运行到断点处
在寄存器处,我们找到了我们需要的key

5.get flag!
idg_cni~bjbfi|gsxb
攻防世界--key的更多相关文章
- 攻防世界 reverse evil
这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...
- 记录下做攻防世界的misc题
0x00 记录一下,代表自己做过 0x01 flag_universe 看简介是来自2018年的百越杯. 将文件下载下来后,就一个flag_universe.pcapng文件,wireshark打开. ...
- 异或加密 - cr2-many-time-secrets(攻防世界) - 异性相吸(buuctf)
Crib dragging attack 在开始了解 Crib dragging attack 之前,先来理一理 异或. 异或加密 [详情请戳这里] XOR 加密简介 异或加密特性: ① 两个值相同时 ...
- RSA(攻防世界)Rsa256 -- cr4-poor-rsa
RSA256 [攻防世界] 题目链接 [RSA256] 下载附件得到两个文件. 猜测第一个 txt 文件 可能为RSA加密密文 ,第二个估计就是密钥.依次打开看看: 果然如此. 目标: 寻找 n.e. ...
- Poem Codes - 攻防世界(Decrypt-the-Message)
Poem Codes Poem Code 最显著的特点就是一首诗歌. 详情请戳这里 让我们一起来过滤一遍这个神奇的加密过程~ ① 给出一首诗歌 for my purpose holds to sail ...
- 攻防世界_MISC进阶区_Get-the-key.txt(详细)
攻防世界MISC进阶之Get-the-key.txt 啥话也不说,咱们直接看题吧! 首先下载附件看到一个压缩包: 我们直接解压,看到一个文件,也没有后缀名,先用 file 看一下文件属性: 发现是是L ...
- 攻防世界 reverse 进阶 APK-逆向2
APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...
- 攻防世界 reverse 进阶 10 Reverse Box
攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...
- 攻防世界(九)PHP2
攻防世界系列:PHP2 1.打开什么信息也没有. 尝试各种首页index.php index.html 加 [F12]没有结果,最后发现是index.phps .phps文件是什么? phps文件就 ...
随机推荐
- css 上下居中的广法
方法1 .text{ text-align:center; font-size:0; } .text span{ vertical-align:middle; display:inline-block ...
- python新动态执行 文件头标识 禁止断言
1.exec “python语句” 2. 3.禁止断言
- CF643E Bear and Destroying Subtrees
题解 我们可以先写出\(dp\)式来. 设\(dp[u][i]\)表示以\(u\)为根的子树深度不超过\(i-1\)的概率 \(dp[u][i]=\prod (dp[v][i-1]+1)*\frac{ ...
- 小程序封装wx.request,以及调用
1.新建一个api目录,与pages同级 2.在api目录下新建一个api.js文件 3.编写代码 const host = 'http://test.test.cn' const wxRequest ...
- 一文读懂跨平台框架 Flutter 的搭建与运行
作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架. 之前我们为大 ...
- Vim 编辑器学习笔记
参考资料: 世界上最牛的编辑器: Vim 1
- telnet测试端口是否打开?
如何测试远程服务器的某个端口是否打开? 例如: telnet 192.168.1.1 5000 返回: Trying 127.0.0.1...Connected to 127.0.0.1.Escape ...
- wowza 降低延迟
转自:http://www.ttstream.com/wowza/live/howToAchieveTheLowestLatencyFromCaptureToPlayback 这篇文章介绍了在用R ...
- React-Native 之 GD (十九)TabBarItem 逻辑完善 / 关闭筛选菜单滑动手势 / Navigator 掉帧卡顿问题处理
1.TabBarItem 逻辑完善 那么为了更好的用户体验,我们这边还需要来处理一下点击 TabBarItem 的一下细节,那就是当用户点击 Item 时,可能只是单纯的想进行页面的 切换或者置顶操作 ...
- Zotero引用文献格式(软件学报)
最近在写一篇综述,要处理大量引用文献,选用Zotero作为文献管理工具.在插入参考文献目录时需要遵循格式,奈何网上找不到<软件学报>对应的csl模板文件,所以决定自己动手修改.在此记录下自 ...