首页 > 其他分享 >攻防世界-难度1- xxxorrr

攻防世界-难度1- xxxorrr

时间:2024-04-28 23:14:44浏览次数:25  
标签:__ 攻防 函数 xxxorrr int64 main rsp 难度 sub

攻防世界-逆向-难度1
根据提示应该是异或加密,找到密文和密钥,再异或回去就得到原文。
参考
https://blog.csdn.net/qq_63699339/article/details/130657034
官方wp

逆向解法

梳理一下程序执行逻辑
1.在main函数之前的init-array段首先执行了sub84A

在 ELF (Executable and Linkable Format) 文件中,Initialization Function Table 是一种特殊的数据结构,用于存储在程序启动时(在 main 函数执行之前)需要调用的一系列初始化函数的地址。这个机制允许程序或库执行必要的初始化任务,例如设置全局变量的初始状态、注册回调函数、初始化硬件设备或执行其他任何启动前准备工作。
如果 sub_840 的地址被包含在 ELF 的 Initialization Function Table 中,那么它会在程序的主逻辑开始执行之前被自动调用。这种自动调用是由程序的启动代码(通常是由编译器和链接器自动生成的一部分)负责的,该代码会遍历 Initialization Function Table 中的所有条目,并按照它们出现的顺序调用每个函数

image.png
2.进行了第一次异或处理
image.png
3.再来看main函数,sub_A90函数是做什么的
image.png
4.点进去
image.png
5.查一下_cxa_atexit的资料后就很清楚了,_cxa_atexit在exit函数中注册进程退出回调函数来实现析构
简单理解就是执行exit退出,会调用一个回调函数,这个回调函数就是sub916
image.png
6.再回到main函数,流程逻辑就明确了
image.png

整个程序对s1进行两次异或,第一次的密钥是(2 * i + 65) , 第二次的密钥是 s2[i],各循环33次

分析程序执行逻辑

ida64打开,字符串表看一下有没有什么线索
image.png
猜测这串字符跟flag有关,ctrl+x查看引用
image.png
有三个函数引用了,逐个查看

unsigned __int64 sub_84A()
{
    signed int i; // [rsp+Ch] [rbp-14h]
    unsigned __int64 v2; // [rsp+18h] [rbp-8h]

    v2 = __readfsqword(0x28u);
    for ( i = 0; i <= 33; ++i )
        s1[i] ^= 2 * i + 65;
    return __readfsqword(0x28u) ^ v2;
}
unsigned __int64 sub_916()
{
    unsigned __int64 v1; // [rsp+8h] [rbp-8h]

    v1 = __readfsqword(0x28u);
    if ( !strcmp(s1, s2) )
        puts("Congratulations!");
    else
        puts("Wrong!");
    return __readfsqword(0x28u) ^ v1;
}
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
    signed int i; // [rsp+Ch] [rbp-34h]
    char s[40]; // [rsp+10h] [rbp-30h]
    unsigned __int64 v6; // [rsp+38h] [rbp-8h]

    v6 = __readfsqword(0x28u);
    sub_A90(sub_916, a2, a3);
    fgets(s, 35, stdin);
    for ( i = 0; i <= 33; ++i )
        s1[i] ^= s[i];
    return 0LL;
}

可以看到对s1(“qasxcytgsasxcvrefghnrfghnjedfgbhn”)处理了两次

for ( i = 0; i <= 33; ++i )
    s1[i] ^= 2 * i + 65;

for ( i = 0; i <= 33; ++i )
    s1[i] ^= s[i];

由此可得:

s1 = 'qasxcytgsasxcvrefghnrfghnjedfgbhn'
s2=[ 0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46, 0x17, 0x46, 
  0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C, 
  0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0x77, 0x4F, 0x7A, 0x71, 0x43, 
  0x2B, 0x26, 0x89, 0xFE, 0x00]

for i in range(0,33):
    print(chr(ord(s1[i]) ^ (2 * i + 65) ^ s2[i]), end='')

总结

  1. ELF文件存在Initialization Function Table 数据结构,里面定义的函数会先于main函数被执行。
  2. _cxa_atexit是exit执行前的时刻,调用传入的回调函数,实现析构。__cxa_atexit 主要用于C++环境中,以确保全局和静态对象的析构函数能够正确地被调用。

标签:__,攻防,函数,xxxorrr,int64,main,rsp,难度,sub
From: https://www.cnblogs.com/Rainy-Day/p/18164707

相关文章

  • 攻防世界-难度1- bad_python
    the.pycisbroken,canyouhelpmerecover?攻防世界难度1-bad_pythonpython头部观察文件名pyre.cpython-36.pyc,说明是在python3.6环境下编译的,那么需要恢复正常pyc3.6对应的首部16字节。uncompyle6pip3installuncompyle6uncompyle6--versionuncompyle6pyre.cpython......
  • 攻防世界---unseping
    一.题干二.pop链的构造反序列化执行__wakeup魔术方法->waf函数对传入的参数进行过滤->执行__destruct魔术方法->利用call_user_func_array执行回调函数ping三.绕过过滤1.首先,waf函数过滤了ls命令,可以使用空变量${Z}或者''或者""绕过:<?phphighlight_file(__FILE__);class......
  • 攻防世界-难度1- easyEZbaby_app
    攻防世界-难度1-easyEZbaby_app文件格式文件格式(APK,JAR,WAR,RAR)在不同的技术领域和应用场景中有着各自的作用和特点:APK全称:AndroidPackage用途:APK文件是Android平台上的应用程序包格式。它是一种压缩格式,包含了Android应用运行所需的所有文件,包括代码、资源、资产、证......
  • 攻防世界-难度1- toddler_regs
    攻防世界-难度1toddler_regs.zip运行ida静态分析shift+f12搜索字符串点过去F5先搞定g_team_idx,一路跟过去F5g_team_idx=23;还需要两个数组内容:team[]和teamjnu[],点过去就行了。只需要提取其中的内容就行了。注意字符串末尾是'\0',编写脚本时要注意这点team=......
  • 攻防世界-难度1- toddler_regs
    攻防世界-难度1toddler_regs.zip运行idashift+f12搜索字符串点过去F5先搞定g_team_idx,一路跟过去F5g_team_idx=23;还需要两个数组内容:team[]和teamjnu[],点过去就行了。只需要提取其中的内容就行了。注意字符串末尾是'\0',编写脚本时要注意这点team="""......
  • 攻防世界逆向-难度1- easyre-xctf
    攻防世界-难度1easyre-xctf.zipUpx壳这里先直接用工具脱壳,后面学会手动脱壳再回来补充。工具下载地址:https://down.52pojie.cn/?query=upxupx.exe-deasyre.exe再查一次,避免多重壳。逆向分析ida搜索字符串,shift+F12是flag的第2部分,现在查找第一部分。打开反汇编子......
  • 攻防世界逆向-难度1- CatFly
    难度1题目CatFlyLinux下的elf二进制文件,strings一下没发现什么信息。参考:https://xia0ji233.pro/2023/01/01/Nepnep-CatCTF2022/index.htmlhttps://blog.csdn.net/Lynnette177/article/details/132616817解题思路:遍历正确密钥,解密dword_E120(flag密文),注意sub_62B5()获取的......
  • 攻防世界 Windows_Reverse1
    第一次遇见地址偏移间接操作,记录一下wp的思路方法不是我的,我只是做记录理思路题目分析过程PE查壳,有一个UPX壳 用工具脱壳 IDA看看main函数两个关键参数:input(v6改名)和flag(v4改名)光看反汇编函数,这两个参数怎么都联系不起来想着地址说不定连在一起呢?-00000404......
  • 【攻防实操系列+内网渗透篇】--第2章:内网渗透攻击基础①
    以域控为基础架构,通过域控实现对用户和计算机资源的统一管理,带来便利的同时也成为了最受攻击者重点攻击的集权系统。针对域控的攻击技术,在Windows通用攻击技术的基础上自成一套技术体系,将AD域攻防分为信息收集、权限提升、凭证窃取、横向移动、权限维持等攻击阶段,把域环境下众多......
  • 【攻防实操系列+内网渗透篇】--第3章:内网渗透防护基础①
    针对AD域安全防护产品,商业的如MicrosoftDefenderforIdentity、Tenable.ad、ITDR-AD,开源的WatchAD,都是可以选择的方向。面对众多的AD域攻击行为,我们也可以选择自建检测策略,通过分析AD域控的日志,对攻击行为进行实时检测。将AD域日志引入日志分析平台,通过模拟域攻击行为产生攻击......