测试文件: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的更多相关文章

  1. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  2. 记录下做攻防世界的misc题

    0x00 记录一下,代表自己做过 0x01 flag_universe 看简介是来自2018年的百越杯. 将文件下载下来后,就一个flag_universe.pcapng文件,wireshark打开. ...

  3. 异或加密 - cr2-many-time-secrets(攻防世界) - 异性相吸(buuctf)

    Crib dragging attack 在开始了解 Crib dragging attack 之前,先来理一理 异或. 异或加密 [详情请戳这里] XOR 加密简介 异或加密特性: ① 两个值相同时 ...

  4. RSA(攻防世界)Rsa256 -- cr4-poor-rsa

    RSA256 [攻防世界] 题目链接 [RSA256] 下载附件得到两个文件. 猜测第一个 txt 文件 可能为RSA加密密文 ,第二个估计就是密钥.依次打开看看: 果然如此. 目标: 寻找 n.e. ...

  5. Poem Codes - 攻防世界(Decrypt-the-Message)

    Poem Codes Poem Code 最显著的特点就是一首诗歌. 详情请戳这里 让我们一起来过滤一遍这个神奇的加密过程~ ① 给出一首诗歌 for my purpose holds to sail ...

  6. 攻防世界_MISC进阶区_Get-the-key.txt(详细)

    攻防世界MISC进阶之Get-the-key.txt 啥话也不说,咱们直接看题吧! 首先下载附件看到一个压缩包: 我们直接解压,看到一个文件,也没有后缀名,先用 file 看一下文件属性: 发现是是L ...

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

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

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

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

  9. 攻防世界(九)PHP2

    攻防世界系列:PHP2  1.打开什么信息也没有. 尝试各种首页index.php index.html 加 [F12]没有结果,最后发现是index.phps .phps文件是什么? phps文件就 ...

随机推荐

  1. 【leetcode】1109. Corporate Flight Bookings

    题目如下: There are n flights, and they are labeled from 1 to n. We have a list of flight bookings.  The ...

  2. HTML中的表单<form>标签

    一.HTML表单 HTML 表单用于搜集不同类型的用户输入. HTML 表单包含表单元素,表单元素指的是不同类型的 input 元素.复选框.单选按钮.提交按钮等等. 关于表单的更多内容可以参考htt ...

  3. Java——常用类(StringBuffer)

    [StringBuffer]   <1>java.lang.StringBuffer代表可变的字符序列. <2>StringBuffer和String类似,但是StringBu ...

  4. 【PowerOJ1744&网络流24题】方格取数问题(最小割)

    题意: n,m<=30 思路: [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图X集合中顶点 ...

  5. CF1012F Passports

    http://codeforces.com/problemset/problem/1012/F 题解 考虑\(p=1\)的情况. 我们可以把题意理解成平面上有一些线段,你需要给每条线段分配一个长度给定 ...

  6. VXcode学习

    1.安装中文包(chinese) 2.打开控制面板ctrl+shift+p

  7. How to call javascript function on page load in asp.net

    How to call javascript function on page load in asp.net 解答1,使用RegisterStartupScript来运行 需要注意的是,下面的dem ...

  8. 迭代器遍历列表 构造方法 constructor ArrayList Vector LinkedList Array List 时间复杂度

    package priceton; import java.io.IOException; import java.util.concurrent.CyclicBarrier; import java ...

  9. 十五、jenkins环境配置

    1. jenkins包下载,下载地址:https://jenkins.io/download/ 版本:Jenkins 2.134,下载war包 2. JDK下载:下载地址:http://www.ora ...

  10. LinkedBlockingDeque 源码分析

    LinkedBlockingDeque LinkedBlockingDeque 能解决什么问题?什么时候使用 LinkedBlockingDeque? 1)LinkedBlockingDeque 是基 ...