一.程序分析

首先还是将程序进行查壳

IDA打开后尝试f5,发现因为堆栈不平衡,无法直接反编译,所以修改一下

选项->常规->反汇编

勾选堆栈指针,快捷键alt+k,将SP修改为零,如果下面还遇到同理

二.伪代码分析

int __cdecl main(int argc, const char **argv, const char **envp)
{char v4; // [esp+12h] [ebp-96h]char v5; // [esp+44h] [ebp-64h]DWORD flOldProtect; // [esp+94h] [ebp-14h]size_t v7; // [esp+98h] [ebp-10h]int i; // [esp+9Ch] [ebp-Ch]__main();puts("please input you flag:");if ( VirtualProtect(encrypt, 0xC8u, 4u, &flOldProtect) == 0 )exit(1);scanf("%40s", &v4);v7 = strlen(&v4);if ( v7 != 24 ){puts("Wrong!");exit(0);}strcpy(&v5, &v4);wrong(&v4);omg(&v4);for ( i = 0; i <= 186; ++i )*((_BYTE *)encrypt + i) ^= 0x41u;if ( encrypt(&v5) != 0 )finally(&v5);return 0;
}

查看伪代码,直接可以看出flag字符串长度是0x18也就是24,有两个加密函数,wrong和omg

wrong:首先对输入的flag的每个字节根据并1后是否为真进行了亦或下标的操作

char *__cdecl wrong(char *a1)
{char *result; // eaxsigned int i; // [esp+Ch] [ebp-4h]for ( i = 0; i <= 23; ++i ){if ( i & 1 ){result = &a1[i];a1[i] -= i;}else{result = &a1[i];a1[i] ^= i;}}return result;
}

omg:wrong得到的结果跟一个全局变量unk_4030C0比较

int __cdecl omg(char *a1)
{int result; // eaxint v2[24]; // [esp+18h] [ebp-80h]int i; // [esp+78h] [ebp-20h]int v4; // [esp+7Ch] [ebp-1Ch]v4 = 1;qmemcpy(v2, &unk_4030C0, sizeof(v2));for ( i = 0; i <= 23; ++i ){if ( a1[i] != v2[i] )v4 = 0;}if ( v4 == 1 )result = puts("hahahaha_do_you_find_me?");elseresult = puts("wrong ~~ But seems a little program");return result;
}

可以简单还原出来,但发现是一个假的flag

脚本:

result="fkcd\x7fagd;Vka{&;Pc_MZq\x0c7f"
i=0
flag=""
for j in result:if(i&1):flag+=chr(ord(j)+i)else:flag+=chr(ord(j)^i)i+=1
print flag

三.smc自修改代码

在下面分析时,发现一个encrpt函数,但f5并不能反汇编成功

for ( i = 0; i <= 186; ++i )
    *((_BYTE *)encrypt + i) ^= 0x41u;
  if ( encrypt(&v5) != 0 )
    finally(&v5);

这里的for循环应该是把程序里加壳的部分给脱壳,所以动态调试,也因为看到这么多次的循环,猜测为smc自修改代码

意思是自我修改的代码,使程序在运行时自我修改。

用途包括:

1) 使一些重要的跳转位置爆破无效化 (以 smc 对重要位置进行覆写)

2) 使一些重要代码隐藏 (在必要时才实时产生重要代码段,防止程序被人静态分析,也防止一些透过搜寻的破解方法)

在汇编视图的界面,可以看到对一个函数进行了一些操作,很明显可以看出右边的操作是循环对这个函数进行解密,解密之后直接调用,进去这个函数会发现是一堆乱码。

所以OD直接定位到这个函数,下断点,

这一部分对应的是刚才的for循环

f7进入call,会发现这里已经解密

用olldump直接脱壳

这时候就可以用IDA的f5静态调试了

int __cdecl sub_401500(int a1)
{int v2[19]; // [esp+1Ch] [ebp-6Ch]int v3; // [esp+68h] [ebp-20h]int i; // [esp+6Ch] [ebp-1Ch]v3 = 1;qmemcpy(v2, &unk_403040, sizeof(v2));for ( i = 0; i <= 18; ++i ){if ( (char)(*(_BYTE *)(i + a1) ^ aHahahahaDoYouF[i]) != v2[i] ){puts("wrong ~");v3 = 0;exit(0);}}if ( v3 == 1 )puts("come here");return v3;
}

对输入的内容和hahahaha_do_you_find_me?这个字符串进行异或,然后和一个全局变量进行比较,注意只异或了19个字节,然后写出脚本还原一下:

result2="\x0e\x0d\x09\x06\x13\x05\x58\x56\x3e\x06\x0c\x3c\x1f\x57\x14\x6b\x57\x59\x0d"
flag=""
haha="hahahaha_do_you_find_me?"
for i in range(19):flag+=chr(ord(haha[i])^ord(result2[i]))
print(flag)

flag{d07abccf8a410c

只有十九个字节,还缺少五个,IDA中看程序的逻辑发现调用flag校验函数之后还有一个finally函数,这个函数正常执行是执行不到的,这个函数同样是加密的,从刚刚从OD中脱出来的程序中可以看到这个函数的明文:

int __cdecl sub_40159A(_BYTE *a1)
{unsigned int v1; // eaxint result; // eaxchar v3; // [esp+13h] [ebp-15h]char v4; // [esp+14h] [ebp-14h]char v5; // [esp+15h] [ebp-13h]char v6; // [esp+16h] [ebp-12h]char v7; // [esp+17h] [ebp-11h]int v8; // [esp+18h] [ebp-10h]int v9; // [esp+1Ch] [ebp-Ch]v3 = '%';v4 = 't';v5 = 'p';v6 = '&';v7 = ':';v1 = time(0);srand(v1);v9 = rand() % 100;v8 = 0;if ( (*a1 != '%') == v9 )result = puts("Really??? Did you find it?OMG!!!");elseresult = puts("I hide the last part, you will not succeed!!!");return result;
}

这里每次得数都是随机的,根本无法爆破,因为flag最后一个字节一定是‘}’,那么用‘:’^‘}’=0x47,然后使用“%tp&:”分别异或0x47得到最后5个字节。

完整的脚本:

result2="\x0e\x0d\x09\x06\x13\x05\x58\x56\x3e\x06\x0c\x3c\x1f\x57\x14\x6b\x57\x59\x0d\x47\x47\x47\x47\x47"
flag=""
haha="hahahaha_do_you_fin%tp&:"
for i in range(24):flag+=chr(ord(haha[i])^ord(result2[i]))
print(flag)

flag{d07abccf8a410cb37a}

BUUCTF-网鼎杯2020-青龙组-joker相关推荐

  1. Buuctf[网鼎杯 2020 青龙组]AreUSerialz

    [网鼎杯 2020 青龙组]AreUSerialz 打开题目仔细阅读源码 <?phpinclude("flag.php"); highlight_file(__FILE__) ...

  2. Buuctf [网鼎杯 2020 青龙组]jocker 题解

    目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...

  3. re -25 buuctf [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker 前话:ida7.6设置栏内没有general,可以通过ctrl+shift+p打开命令面板,搜索option打开设置选项,于Disassembly设置堆栈显示 ...

  4. BUUCTF·[网鼎杯 2020 青龙组]boom·WP

    BUUCTF在线评测 (buuoj.cn) 附件 是一个可运行的文件 回车出现: 分析 猜测是C编写的,拉到编译器,发现提示是二进制文件 那就用010Editor打开 查找了一下flag,这不就是跟附 ...

  5. [BUUCTF][网鼎杯 2020 青龙组]jocker 分析与记录

    无壳,IDA打开可以直接进入main函数: 第12行调用VirtualProtect函数更改了offset encrypt处的访问保护权限 BOOL VirtualProtect(LPVOID lpA ...

  6. BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker

    BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker 先看下文件信息,没有加壳,32位程序 运行一下,又是一道字符串比较的题目 用IDA32位打开,分析一下 // positive ...

  7. undefsafe原型链[网鼎杯 2020 青龙组]notes

    感觉是考原型链但还是有点不知道如何下手,呜呜呜呜呜呜. 从浅入深 Javascript 原型链与原型链污染 [网鼎杯 2020 青龙组]notes var express = require('exp ...

  8. [网鼎杯 2020 青龙组]AreUSerialz WP

    [网鼎杯 2020 青龙组]AreUSerialz WP 看到题目,首先进入代码审计 <?phpinclude("flag.php");//在文件中插入flag.php文件的 ...

  9. [网鼎杯 2020 青龙组]jocker

    [网鼎杯 2020 青龙组]jocker SMC(self-Modifying Code): 自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的.在程 ...

  10. [网鼎杯 2020 青龙组]boom复现

    2020 网鼎杯 青龙组 boom复现 直接开整 下载题目附件,解压后发现是个.exe文件,丢进终端运行 跟着提示继续,任意键: 得到一串md5密文,在线解密解密即可: 输入后得到一个三元一次方程组( ...

最新文章

  1. 干货丨从感知机到深度神经网络,带你入坑深度学习
  2. 同一label显示不同字体
  3. 二、“究恒常之宇宙,成一家之学说”
  4. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一3.3.3 供应实验室...
  5. 强大的金融类图表库 TradingView 使用分享
  6. python的模块导入问题_python导入模块错误怎么解决
  7. su封面插件_这届SU太优秀,一张纸建出一座音乐厅?
  8. mysql日志恢复的时间格式_mysql binlog 日志恢复数据
  9. 安装Python3.5后,pip报错Fatal error in launcher: Unable to create process using ‘“‘解决方案
  10. 【视觉SLAM14讲】【汇总】
  11. dmg为什么下载成php,解答:dmg是什么意思,dmg文件如何打开,及怎么把dmg转换成iso
  12. java 文本提取_Java 提取PDF 文本内容
  13. 绘图 | G2色块图
  14. B75经典门户商业版Discuz模板下载
  15. maven dependency 警告:Overriding managed version XXX for XXX
  16. IDEA使用技巧之教你一招:隐藏指定文件/文件夹
  17. python爬虫12306查票
  18. vue中浏览器全屏和退出全屏
  19. 微信营销七(微信朋友圈发文技巧)
  20. 测量面积的手机软件有哪些?这两个不能错过

热门文章

  1. https://developer.aliyun.com/group/cloud?aly_as=stGCd_wh?_k=g6zacxsource=5176.11533457userCode=9fo
  2. ENC1编码器插USB-4G卡托后如何获取IP并通过无线方式访问后台
  3. Flutter异常收集
  4. 亚洲首台BMD8K切换台开箱
  5. Java-Map集合
  6. 云服务器有什么优势和特点?
  7. 双栈路由Linux,Linux模拟IPV6双栈路由器实现方案
  8. Ubuntu文件查找命令集合
  9. VaaS 之“成长史”
  10. 2020大学生网络安全知识大赛总决赛模拟卷错题集(10)