REVERSE-PRACTICE-BUUCTF-20

REVERSE-PRACTICE-BUUCTF-20

    • [SCTF2019]creakme
    • [网鼎杯 2020 青龙组]bang
    • [WUSTCTF2020]funnyre
    • Dig the way

[SCTF2019]creakme

exe程序,运行后提示输入ticket,无壳,用ida分析
交叉引用字符串“please input your ticket:”来到sub_402540函数
creakme-logic
分析sub_402320函数,在DebugBreak和return之间有一段代码引用
creakme-sub_402320
修改EIP从地址0x402412处开始执行,调试可知sub_402450函数是对.SCTF段数据的SMC
creakme-402412
回到sub_402540函数,往下走
分析sub_4024A0函数,过掉两个反调试,执行SMC好的.SCTF段的代码,发现是将静态可见的字符串">pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo"变成了动态可见的字符串"nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo="
creakme-sub_4024A0
回到sub_402540函数,往下走
获取输入input,拷贝input到Dst,sub_4020D0函数对Dst进行AES的CBC模式加密,密文存储在v2,令v4=v2,那段动态可见的字符串赋给v6,最后就是比较v4和v6
sub_4020D0->sub_401690
在sub_401690函数中发现两个字符串"sctfsctfsctfsctf"和"sycloversyclover",由于AES的CBC模式加密需要一个偏移量iv与第0块明文异或,于是可以确定iv=“sctfsctfsctfsctf”,key=“sycloversyclover”,参考:AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
creakme-sub_401690
creakme-sub_401690
已知key,iv,cipher,写解AES.CBC脚本即可得到flag

from Crypto.Cipher import AES
import base64
key="sycloversyclover"
iv="sctfsctfsctfsctf"
cipher=base64.b64decode("nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=")
aes=AES.new(key,AES.MODE_CBC,iv)
print(aes.decrypt(cipher))
#sctf{Ae3_C8c_I28_pKcs79ad4}

[网鼎杯 2020 青龙组]bang

apk文件,jadx-gui打开什么都没有,SecShell提示是加了壳
果然,这个apk加了梆梆的壳
bang-shell
使用frida脚本脱壳
bang-frida
脱壳后的dex文件再用jadx-gui分析,在com.example.how_debug.MainActivity类中找到flag
bang-flag

[WUSTCTF2020]funnyre

elf文件,运行后没有输入,无壳,ida分析
main函数没有被ida识别成函数,是因为有花指令
jz和jnz指令都会跳转到同一条(下一条)指令,把jz和jnz都nop掉
call后面的地址不存在,是因为在原本正确的指令字节基础上加了多余的字节,把call那条指令按d转成数据后,顺序地一个一个nop掉多余的字节,直到ida能够正确识别出指令
jz指令跳过了从地址0x400621开始的两个字节,也是直接nop掉jz
funnyre-fakeorder
总共有4处类似这样的花指令,去除完全后,选中main函数的全部红色代码,按p创建函数,F5反汇编
main函数中,验证输入的长度是否为38,且有flag{}包住,对花括号内的32个字符做300多次运算,最后与已知的unk_4025C0比较,验证输入
funnyre-main
angr参考:angr学习【一】
脚本参考:buuctf刷题记录25 [WUSTCTF2020]funnyre
调用angr框架写脚本即可得到flag

import angr
import claripyp=angr.Project('./attachment',load_options={"auto_load_libs": False})
f=p.factory
state = f.entry_state(addr=0x400605)#设置state开始运行时的地址
flag = claripy.BVS('flag',8*32)#要求的内容有32个,用BVS转成二进制给flag变量
state.memory.store(0x603055+0x300+5,flag)#因为程序没有输入,所以直接把字符串设置到内存
state.regs.rdx=0x603055+0x300
state.regs.rdi=0x603055+0x300+5#然后设置两个寄存器sm = p.factory.simulation_manager(state)#准备从state开始遍历路径print("ready")sm.explore(find=0x401DAE)#遍历到成功的地址if sm.found:print("sucess")x=sm.found[0].solver.eval(flag,cast_to=bytes)print(x)
else:print('error')
#ready
#sucess
#b'1dc20f6e3d497d15cef47d9a66d6f1af'

Dig the way

exe程序,运行后直接闪退,无壳,ida分析
栈溢出的题目
main函数的主要逻辑为
读取data文件到v7,执行func0,func1和func2函数,返回值分别赋给v9,v10和v11,如果v11为0,则调用get_key函数获得flag。但是对于func2函数,无论传入的参数为何值,其返回值永远为正,v11不可能为0,而对于func1函数,如果传入的参数合适,其返回值可以为0,于是便需要通过func0函数交换v15和v16所存储的函数指针,使得执行func1函数时,其返回值可以赋给v11

int __cdecl main(int argc, const char **argv, const char **envp)
{int result; // eaxint v4; // ebxsize_t v5; // eaxint v6; // ebxchar v7[20]; // [esp+1Ch] [ebp-48h]int v8; // [esp+30h] [ebp-34h]int v9; // [esp+34h] [ebp-30h]int v10; // [esp+38h] [ebp-2Ch]int v11; // [esp+3Ch] [ebp-28h]int v12; // [esp+40h] [ebp-24h]int v13; // [esp+44h] [ebp-20h]signed int (__cdecl *v14)(int, int, int); // [esp+48h] [ebp-1Ch]int (__cdecl *v15)(int, int, int); // [esp+4Ch] [ebp-18h]int (__cdecl *v16)(int, int, int); // [esp+50h] [ebp-14h]int v17; // [esp+54h] [ebp-10h]int v18; // [esp+58h] [ebp-Ch]FILE *v19; // [esp+5Ch] [ebp-8h]__main();v14 = func0;                                  // 交换值v15 = func1;                                  // 含abs的运算,返回值可正可负可零v16 = func2;                                  // 含abs的运算,返回值永正v8 = 0;v9 = 1;v10 = 2;v11 = 3;v12 = 3;v13 = 4;v19 = fopen("data", "rb");                    // 打开data文件流if ( !v19 )return -1;fseek(v19, 0, 2);                             // 指针指到文件流末尾v18 = ftell(v19);                             // 获取文件大小fseek(v19, 0, 0);                             // 指针指回文件开始v17 = ftell(v19);if ( v17 ){puts("something wrong");result = 0;}else{for ( i = 0; i < v18; ++i ){v4 = i;v7[v4] = fgetc(v19);                      // data文件的字节读到v7// 由于v7只是个20字节大小的数组,如果data文件中的字节数大于20,则会把v8~v13的值覆盖掉,即栈溢出}v5 = strlen(v7);if ( v5 <= v18 ){v18 = v11;                                // v18=v11,且v18在获取flag的函数get_key中用到i = 0;v17 = v13;while ( i <= 2 ){v6 = i + 1;*(&v8 + v6) = (*(&v14 + i))((int)&v8, v12, v13);// 执行func0,func1和func2,返回值分别赋给v9,v10,v11v12 = ++i;                              // v12和v13用i赋值v13 = i + 1;}if ( v11 ){result = -1;}else                                      // v11为0时,执行get_key获得flag{get_key(v18, v17);system("PAUSE");result = 0;}}else{result = -1;}}return result;
}

由于程序读取data文件是从头到尾全部读取,而v7只有20个字节大小,如果data文件的字节数大于20,多出来的字节就会将v8,v9,v10等等这些变量覆盖
v12和v13被程序赋值为3和4,进入func0函数后并不能达到交换v15和v16的目的,因为此时func0函数中参与运算的变量为v11和v12,而不是v15和v16。于是便利用程序读data文件有可能覆盖v12和v13的漏洞,将v12和v13覆盖为7和8
v7有20个字节,v8~v11是4个int,也就是4x4=16个字节,于是data文件需要从第36个字节开始,将v12和v13覆盖为7和8,data为
digtheway-data
发现exe程序还是运行后闪退,调试发现func1函数的返回值v11还是为正
仔细看调用func0~func2这部分代码,在v12和v13分别为7和8作为参数传入func0函数交换v15和v16后,v15执行func2函数,v16执行func1函数,而在循环中v12和v13由i赋值,当执行v16(func1)函数时,v12和v13的值分别为2和3
digtheway-logic
也就是说,func1函数执行时,实际上是abs(v10+v11)-abs(v11)-abs(v10)+2,v10等于2,要使返回的值为0,则需v11为-1,于是同样利用程序data读文件的漏洞将v11覆盖为-1,data为
digtheway-data
再次运行exe程序,得到flag
digtheway-flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web Reference和Service Reference的区别

今天因为项目需要使用服务引用&#xff0c;就按之前的经验添加上了&#xff0c;步骤如下&#xff1a; 项目根目录——引用——右键——添加服务引用——高级——添加Web引用——输入接口的URL地址——回车&#xff08;下方出现的就是接口的定义的方法&#xff09;——修改Web引…

REVERSE-PRACTICE-BUUCTF-21

REVERSE-PRACTICE-BUUCTF-21[SCTF2019]babyre[MRCTF2020]EasyCpp[GUET-CTF2019]encrypt[QCTF2018]Xman-babymips[SCTF2019]babyre elf文件&#xff0c;无壳&#xff0c;用ida分析 在start函数中看到main函数的字样&#xff0c;但是左侧函数窗没有找到main函数 原因是main函数中…

原型设计工具——“墨刀”的介绍与基本教程

一、产品介绍 &#xff08;1&#xff09;产品简介&#xff1a; 墨刀是一款在线原型设计与协同工具&#xff0c;借助墨刀&#xff0c;产品经理、设计师、开发、销售、运营及创业者等用户群体&#xff0c;能够搭建为产品原型&#xff0c;演示项目效果。 &#xff08;2&#xf…

MockPlus原型设计介绍

在第八周的课堂上&#xff0c;王文娟老师在校园系统上发布了对于自行选择的原型设计软件进行资料查找以及自学的任务。因为之前的课程学习需要&#xff0c;我们已经大概掌握了原型设计软件Axure的使用&#xff0c;因此在这里&#xff0c;我选择了另一原型设计进行介绍&#xff…

REVERSE-PRACTICE-BUUCTF-22

REVERSE-PRACTICE-BUUCTF-22[SCTF2019]Who is he[FlareOn2]very_success[NPUCTF2020]Baby Obfuscation[HDCTF2019]MFC[SCTF2019]Who is he unity游戏&#xff0c;运行后输入&#xff0c;点击按钮检验输入 dnSpy打开Who is he\Who is he_Data\Managed\Assembly-CSharp.dll 在Te…

浅谈常见的NoSQL技术方案和选型

前言 在互联网和大数据的背景下&#xff0c;越来越多的网站、应用系统需要支撑 海量数据存储、高并发请求、高可用、高可扩展性 等特性要求。传统的 关系型数据库 已经难以应对类似的需求&#xff0c;各种各样的 NoSQL&#xff08;Not Only SQL&#xff09;数据库因此而产生。…

REVERSE-PRACTICE-BUUCTF-23

REVERSE-PRACTICE-BUUCTF-23[2019红帽杯]Snake[BSidesSF2019]blink[De1CTF2019]Re_Sign[ACTF新生赛2020]Splendid_MineCraft[2019红帽杯]Snake unity游戏&#xff0c;dnSpy打开Snake\Snake_Data\Managed\Assembly-CSharp.dll 发现要载入Interface这个dll ida打开Snake\Snake_…

REVERSE-PRACTICE-BUUCTF-24

REVERSE-PRACTICE-BUUCTF-24[watevrCTF 2019]Timeout[SUCTF2019]hardcpp[CISCN2018]2ex[UTCTF2020]babymips[watevrCTF 2019]Timeout elf文件&#xff0c;无壳&#xff0c;ida分析 main函数中signal&#xff0c;alarm&#xff0c;delay三个函数配合使用是为了反调试 交叉引用…

REVERSE-PRACTICE-BUUCTF-25

REVERSE-PRACTICE-BUUCTF-25特殊的 BASE64[FlareOn1]Javascrap[WMCTF2020]easy_re[NPUCTF2020]BasicASM特殊的 BASE64 exe程序&#xff0c;运行后输入&#xff0c;无壳&#xff0c;ida分析 main函数&#xff0c;读取输入&#xff0c;进行变表base64编码&#xff0c;与rightFla…

REVERSE-PRACTICE-BUUCTF-26

REVERSE-PRACTICE-BUUCTF-26[FlareOn6]FlareBear[SUCTF2018]babyre[GKCTF2020]WannaReverse[FlareOn4]greek_to_me[FlareOn6]FlareBear apk文件&#xff0c;模拟器上运行&#xff0c;创建一个小熊&#xff0c;有三种方式交互&#xff0c;分别为“吃饭”&#xff0c;“篮球”以…

C#的变迁史02 - C# 2.0篇

在此重申一下&#xff0c;本文仅代表个人观点&#xff0c;如有不妥之处&#xff0c;还请自己辨别。 第一代的值类型装箱与拆箱的效率极其低下&#xff0c;特别是在集合中的表现&#xff0c;所以第二代C#重点解决了装箱的问题&#xff0c;加入了泛型。1. 泛型 - 珍惜生命&#x…

REVERSE-PRACTICE-BUUCTF-27

REVERSE-PRACTICE-BUUCTF-27[XMAN2018排位赛]Dragon Quest[羊城杯 2020]easyre[watevrCTF 2019]Repyc[2019红帽杯]calc[XMAN2018排位赛]Dragon Quest elf文件&#xff0c;无壳&#xff0c;ida分析 main函数&#xff0c;读取输入&#xff0c;start_quest函数验证输入&#xff0…

C#的变迁史03 - C# 3.0篇

C# 3.0 (.NET 3.5, VS2008) 第三代C#在语法元素基本完备的基础上提供了全新的开发工具和集合数据查询方式&#xff0c;极大的方便了开发。 1. WPF&#xff0c;WCF&#xff0c;WF 这3个工程类型奠定了新一代.NET开发的客户端模型&#xff0c;通信模型&#xff0c;工作流模型。 …

REVERSE-PRACTICE-BUUCTF-28

REVERSE-PRACTICE-BUUCTF-28[FlareOn6]Memecat Battlestation[b01lers2020]chugga_chugga[INSHack2018]Tricky-Part1[watevrCTF 2019]esreveR[FlareOn6]Memecat Battlestation .Net程序&#xff0c;运行后输入weapon code&#xff0c;用dnSpy打开 在Stage1Form直接找到第一个w…

C#的变迁史04 - C# 4.0 之多线程篇

在.NET 4.0中&#xff0c;并行计算与多线程得到了一定程度的加强&#xff0c;这主要体现在并行对象Parallel&#xff0c;多线程Task&#xff0c;与PLinq。这里对这些相关的特性一起总结一下。 使用Thread方式的线程无疑是比较麻烦的&#xff0c;于是在这个版本中有了改善的版本…

REVERSE-PRACTICE-BUUCTF-29

REVERSE-PRACTICE-BUUCTF-29[FlareOn1]Shellolololol[CFI-CTF 2018]powerPacked[INSHack2018]Tricky-Part2[CFI-CTF 2018]Automated Reversing[FlareOn1]Shellolololol exe程序&#xff0c;直接不能运行&#xff0c;无壳&#xff0c;ida分析 简单F8单步调试发现&#xff0c;在…

C#的变迁史05 - C# 4.0篇

C# 4.0 (.NET 4.0, VS2010) 第四代C#借鉴了动态语言的特性&#xff0c;搞出了动态语言运行时&#xff0c;真的是全面向“高大上”靠齐啊。 1. DLR动态语言运行时 C#作为静态语言&#xff0c;它需要编译以后运行&#xff0c;在编译的过程中&#xff0c;编译器要检查语法的正确性…

REVERSE-PRACTICE-BUUCTF-30

REVERSE-PRACTICE-BUUCTF-30[RCTF2019]DontEatMe[b01lers2020]little_engine[NPUCTF2020]你好sao啊[MRCTF2020]Shit[RCTF2019]DontEatMe exe程序&#xff0c;运行后输入&#xff0c;无壳&#xff0c;用ida分析 交叉引用字符串来到sub_401260函数&#xff0c;读取输入&#xff…

C#的变迁史06 - C# 4.0 之并行处理篇

前面看完了Task对象&#xff0c;这里再看一下另一个息息相关的对象Parallel。 Parallel对象 Parallel对象封装了能够利用多核并行执行的多线程操作&#xff0c;其内部使用Task来分装多线程的任务并试图将它们分配到不同的内核中并行执行。请注意“试图”这个词&#xff0c;Par…

REVERSE-PRACTICE-BUUCTF-31

REVERSE-PRACTICE-BUUCTF-31[羊城杯 2020]login[羊城杯 2020]Bytecode[羊城杯 2020]babyre[ACTF新生赛2020]fungame[羊城杯 2020]login exe程序&#xff0c;运行后输入&#xff0c;无壳&#xff0c;ida分析 没找到主要逻辑&#xff0c;在字符串窗口看到一些“py”的字样&#…