攻防世界--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文件就 ...
随机推荐
- angularjs表单注册--两次密码验证
html <div class="container" ng-controller="RegisterCtrl"> <form name=&q ...
- celery结合redis 使用
使用 Redis¶ 安装¶ 对 Redis 的支持需要额外的依赖.你可以用 celery[redis] 捆绑 同时安装 Celery 和这些依赖: $ pip install -U celery[re ...
- jquery-时间轴滑动
效果预览图: html: <div class="tim"> <div class="timdiv"> <div class=&q ...
- 搭建 .Net RabbitMQ 开发环境
开发环境,window 10 64位,VS2017,系统账号需要用administrator. 1 先需要安装erlang语言开发包,一路默认安装就是了,地址:http://www.erlang.or ...
- django model 操作总结
使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的数据一一对应 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足 ...
- 解决:@Auarowired为null
使用@Auarowired时程序报空指针.如图: 将private 更改为 public 即可
- svn 服务器操作
mkdir /var/svn/svnrepos/aaasvnadmin create /var/svn/svnrepos/aaasvnserve -d -r /var/svn/svnrepos #启动 ...
- centos 7 安装Telnet并设为开机自启动、开防火墙端口
[root@b ~]# rpm -qa | grep telnettelnet-0.17-64.el7.x86_64telnet-server-0.17-64.el7.x86_64[root@b ~] ...
- 在vue中如何引jquer
最近学习vue,习惯性的通过<script>标签引入jquery,写完后报错才想起来,这种方式在vue是不适用的. 1:因为已经安装了vue脚手架,所以需要在webpack中全局引入jqu ...
- Krypton Suite of .NET WinForms Controls
The Krypton Suite of .NET WinForms controls are now freely available for use in personal or commeric ...