首页 > 其他分享 >一道关于逆向的实战CTF题目分析

一道关于逆向的实战CTF题目分析

时间:2024-07-12 17:31:21浏览次数:19  
标签:逆向 xor int 0x000076D8 a1 CTF a2 题目 left

前言

本题自带call型花指令,考验选手对花指令的理解程度。加密属于基础的异或和左右移位加密。主要考察选手的基础能力,动态调试和写脚本的能力。在这篇文章,详细记录了我的分析过程,相信你会有很大收获。

1、查壳

image

PE64位,没壳程序

2、IDA分析去花指令

使用IDA打开时,发现一片红,很正常的CTF考点:花指令

sub_main

image

当务之急是如何去除花指令,继续向下分析,发现了一些端倪

image

花指令的形成是干扰编译器的分析,但又不会影响程序的正常运行。

那么显而易见,会将某个寄存器进行push(保存)然后对其进行复杂操作,最终pop(恢复)该寄存器的值,程序正常执行。

而在本程序中,可以发现该手法:

push ebx
.....
pop ebx

中间的过程均无需再看,直接NOP操作。

image

nop完记得保存修改。

image

接下来就可以分析main函数啦

image

而这两个函数恰好均为关键的函数。

【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

sub_401040

image

此时,我们可以看到函数开头的位置存在多个push操作,不要急着nop。对照函数结束的部分,避免误杀友军。

image

可以看到pop和push是相互对应的,开头push,结束就要pop。

此时注意到:push、pop不是要nop的点,我们继续分析

image

熟悉混淆的朋友一定可以识别出这是一个call型混淆。

call一个地址,然后修改堆栈返回值,retn跳过混淆,相对之前的混淆需要对堆栈有一定的理解。

识别出来,进行nop即可

image

得到加密函数

image

int __cdecl sub_401040(char a1, int a2)
{
  return ((a2 ^ a1) << 8) - a2;
}

sub_401080

来分析另一个函数

相同的操作

image

image

得到加密算法

int __cdecl sub_401080(char a1, int a2)
{
  
  return a2 ^ (a1 << 8);
}

3、分析加密流程

image

那么现在的任务是获得加密函数的顺序,这里采用动态调试的方法来获得:

image

得到顺序

left
xor
xor
left
xor
left
left
xor
left
left
xor
xor
xor
left
left
left
xor
xor
xor
left
xor
xor
left
xor
left
left
left
left
xor
xor
xor
left

将left用1替代,xor用0替代,得到顺序:

int temp[32] = { 1,0,0,1,0,1,1,0,1,1,0,0,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1 };

‍密文可以看到是:

dword_402120 数组
unsigned int dword_402120[32] = {
    0x00004408, 0x000068D8, 0x00007AD8, 0x00004308, 0x00007BD8, 0x00004608, 0x00007B08, 0x000070D8, 
    0x00003308, 0x00007308, 0x000076D8, 0x00005CD8, 0x000076D8, 0x00006608, 0x00006908, 0x00006E08, 
    0x00004BD8, 0x000076D8, 0x00003FD8, 0x00006F08, 0x00005ED8, 0x000076D8, 0x00007408, 0x000046D8, 
    0x00005F08, 0x00006308, 0x00003408, 0x00007408, 0x000076D8, 0x000044D8, 0x00004CD8, 0x00007D08
};

image

4、写出解密算法

​
#include <stdio.h>
​
​
void left(unsigned int a1, unsigned int a2) {
    //  (a1>>8)^a2
    printf("%c", ((a1 ^ a2)>>8 ));
}
void xors(unsigned int a1, unsigned int a2) {
    //(((a1+a2)>>8)^a2)
    printf("%c", (((a1 + a2) >> 8) ^ a2));
}
int main()
{
    unsigned int dword_402120[32] = {
    0x00004408, 0x000068D8, 0x00007AD8, 0x00004308, 0x00007BD8, 0x00004608, 0x00007B08, 0x000070D8,
    0x00003308, 0x00007308, 0x000076D8, 0x00005CD8, 0x000076D8, 0x00006608, 0x00006908, 0x00006E08,
    0x00004BD8, 0x000076D8, 0x00003FD8, 0x00006F08, 0x00005ED8, 0x000076D8, 0x00007408, 0x000046D8,
    0x00005F08, 0x00006308, 0x00003408, 0x00007408, 0x000076D8, 0x000044D8, 0x00004CD8, 0x00007D08
    };
    int temp[32] = { 1,0,0,1,0,1,1,0,1,1,0,0,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1 };
    for (size_t i = 0; i < 32; i++)
    {
        if (temp[i]) {
            //left
            left(dword_402120[i], 8);
        }
        else {
            //xor
            xors(dword_402120[i], 40);
​
        }
    }
​
​
​
}

到此,恭喜你学会了分析一道CTF题目最基本的步骤。

更多网安技能的在线实操练习,请点击这里>>

  

标签:逆向,xor,int,0x000076D8,a1,CTF,a2,题目,left
From: https://www.cnblogs.com/hetianlab/p/18299030

相关文章

  • 07--JS07--逆向03:字体反爬
    JS逆向03:字体反爬jsvmp:代码虚拟化保护方案ast:抽象语法树1.字体文件、字体反爬###1字体文件.ttf.woff或.eot在计算机内存中,文字就是一堆二进制(unicode),要以文字图形的样子,展示给用户看就要指定它们之间的对应关系,就是字体文件书法字体、火星文......
  • BUUCTF刷题_RoarCTF 2019_Easy Calc
    个人刷题学习记录,如有错误请多多指教进入题目如下,猜测是命令注入,输入ls弹框,估计是做了过滤查看页面源代码,发现一串代码,但是不怎么看得懂,查看网上大佬的wp进行学习看了别人的解题步骤知道这里有个url,存在calc.php,访问一下看看是啥上面注释里面写了有waf,猜测这里应该是waf的......
  • ctfshow sql-labs(笔记)
    这是当时做题的时候记得笔记有些乱看不懂的可以私我判断闭合方式:id=1’and1=1–+*正常回显*id=1’and1=2–+*异常回显*id=1and1=1*正常回显*id=1and1=2*异常回显*id=1’)and1=1–+回显正常id=1’)and1=2–+回显异常id=1")and1=1–+正常回显id=1......
  • Day1:20240712做题目
     1.Verilog语言是直接连接,不叫赋值。assign变量a=2'b00;//前面是位数,后面是二进制。 2.Verilog中,wire或者其他信号是直接传递(值)的。assigna=b //实时传递,b的值发生变化,a也会立即变化aninputportisadriverorsource,whileanoutputportisasink.//输入......
  • C语言大端存储和小端存储到底有什么区别? 结尾详细题目加深理解
    一.为什么有大端小端模式?        大端模式(Big-endian)和小端模式(Little-endian)是计算机科学中数据存储的一种方式,它们指的是多字节数据类型(如整数、浮点数等)在内存中的字节序(byteorder)。这两种模式的主要区别在于数据的最高有效字节(MSB)和最低有效字节(LSB)的存储位置。......
  • 【逆向基础】九、dnSpy使用技巧随记
    一、dnSpy逆向工具的使用1、反汇编适用范围:C#,.NET等语言编写的程序2、工具的获取:dnSpy(ps:大家可自行去网页搜索下载最新版)3、打开需要反汇编的程序,成功后出现如图所示的界面4、dnSpy反汇编.NET程序后,可以像开发一样对目标程序进行调试,所以我们根据自己的喜好,设置对......
  • 分析逆向案例十三——拍拍贷登录密码逆向和JS原型链
    网址:拍拍贷登陆页面,找登陆包,密码和用户名都进行了加密。直接参数搜索,一眼下面的第二条,直接点击进入加密位置打上断点分析,一个加密嵌套另一个加密。中间的e.md5好像是md5加密,打印一下看看 现在都记住了,这就是小写的md5加密。好了,解决了一个,进入encrypt函数。发现是一......
  • 某手创作服务 __NS_sig3 sig3 | js 逆向
    拿获取作品列表为例https://cp.kuaishou.com/rest/cp/works/v2/video/pc/photo/list?__NS_sig3=xxxxxxxxxxx搜索__NS_sig3发现__NS_sig3是一个异步回调生成的值s().call("$encode",[i,{suc:function(e){t(`__NS_sig3=${e}`)},err:function(t){e(t)}}])具体逻辑就是:......
  • 经典算法题目记录
    力扣1001.两数之和(复习)题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。......
  • 蓝队初级常见面试题目
    内网模块内网渗透思路(1)目标:对目标服务器所在的内网资源进行渗透最终获取域控制权限的过程(域控制权限可以控制内网中所有的用户和设备);管理员以一台主机作为域控制器,将内网中其余主机加入到域控当中,那么这台域控制器就可以控制其余的所有主机;所以内网的渗透最终目的就是拿下与控制......