linux逆向 视频教程,一道linux ctf入门题逆向。

本文详细介绍了如何使用IDA分析C语言编写的程序,通过跟踪main函数和check函数,理解其内部逻辑。程序通过随机生成数字并与预设的密钥进行异或操作,来验证用户输入的正确性。当16次验证中有17次正确时,程序会显示flag。作者给出了关键代码,并解析了如何计算出正确的密钥,从而成功解密并获得flag。
摘要由CSDN通过智能技术生成

本帖最后由 whyIDA 于 2017-12-1 11:45 编辑

下载地址:

https://www.52pojie.cn/forum.php ... &page=3#pid17643200

先用ida分析,main 函数入口。

[C] 纯文本查看 复制代码int __cdecl main(int argc, const char **argv, const char **envp)

{

int result; // eax

__int64 v4; // [rsp+0h] [rbp-20h]

__int64 v5; // [rsp+8h] [rbp-18h]

__int16 v6; // [rsp+10h] [rbp-10h]

int v7; // [rsp+14h] [rbp-Ch]

int v8; // [rsp+18h] [rbp-8h]

int i; // [rsp+1Ch] [rbp-4h]

puts("welcome");

v4 = 0x6D64616E696D6461LL;

v5 = 0x3332313332316E69LL;

v6 = 51;

v8 = 0;

for ( i = 0; i <= 16; ++i )

{

v7 = rand() % 255;

if ( (unsigned int)check(v7, *((char *)&v4 + i), i) )

++v8;

}

if ( v8 == 17 )

result = puts("good job,now you know what is flag!");

else

result = puts("wrong\ntry again!!!");

return result;

}

check 函数

[C] 纯文本查看 复制代码signed __int64 __fastcall check(unsigned int a1, unsigned int a2, int a3)

{

int v4; // [rsp+10h] [rbp-50h]

int v5; // [rsp+14h] [rbp-4Ch]

int v6; // [rsp+18h] [rbp-48h]

int v7; // [rsp+1Ch] [rbp-44h]

int v8; // [rsp+20h] [rbp-40h]

int v9; // [rsp+24h] [rbp-3Ch]

int v10; // [rsp+28h] [rbp-38h]

int v11; // [rsp+2Ch] [rbp-34h]

int v12; // [rsp+30h] [rbp-30h]

int v13; // [rsp+34h] [rbp-2Ch]

int v14; // [rsp+38h] [rbp-28h]

int v15; // [rsp+3Ch] [rbp-24h]

int v16; // [rsp+40h] [rbp-20h]

int v17; // [rsp+44h] [rbp-1Ch]

int v18; // [rsp+48h] [rbp-18h]

int v19; // [rsp+4Ch] [rbp-14h]

int v20; // [rsp+50h] [rbp-10h]

v4 = 7;

v5 = 8;

v6 = 12;

v7 = 14;

v8 = 21;

v9 = 13;

v10 = 13;

v11 = 3;

v12 = 28;

v13 = 22;

v14 = 110;

v15 = 93;

v16 = 64;

v17 = 110;

v18 = 93;

v19 = 88;

v20 = 78;

if ( (a2 ^ a1) != *(&v4 + a3) )

return 0LL;

printf("%d,%d,%d\n", a1, a2, (unsigned int)*(&v4 + a3));

putchar(a2 ^ a1);

return 1LL;

}

关键代码

[C] 纯文本查看 复制代码if ( (a2 ^ a1) != *(&v4 + a3) )

只要算出随机数就可得到flag

也就是a1=*(&v4 + a3) ^a2

[Python] 纯文本查看 复制代码tmp=[7,8,12,14,21,13,13,3,28,22,110,93,64,110,93,88,78]

tmp2=[0x61, 0x64, 0x6d, 0x69, 0x6e, 0x61, 0x64, 0x6d,0x69,0x6E,0x31,0x32,0x33,0x31,0x32,0x33]

t=[]

for i in range(16):

t= ((tmp[i])^(tmp2[i]))

print(chr(t),end='')

55fd2b2273b5a8b4531f72773c469d6e.gif

捕获.JPG (194.99 KB, 下载次数: 1)

2017-11-9 11:23 上传

55fd2b2273b5a8b4531f72773c469d6e.gif

捕获1.JPG (29.9 KB, 下载次数: 0)

2017-12-1 11:40 上传

感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CTF逆向CTF竞赛中的一种型之一,通过逆向工程方法来解决问入门CTF逆向需要了解的知识领域很广泛,比如二进制文件、硬件逆向、反汇编技术、加密算法、网络协议等等。下面是一个简单的脑图,介绍了CTF逆向入门所需要掌握的知识点: 首先是二进制文件的相关知识,包括ELF、PE等格式的文件结构和常见工具的使用。其次是反汇编和调试技术,了解汇编语言和调试器的使用方法,可以帮助我们在逆向分析中更深入地了解程序逻辑。接下来是加密算法和转换方式的理解,比如Base64、SHA、AES、DES等加密方式的原理和常见攻击方式。此外,网络协议的了解也是非常重要的,包括TCP/IP协议、HTTP协议、UDP协议等,可以帮助我们理解网络数据的传输和安全隐患。最后,还需要了解一些常见的漏洞和技术,比如堆栈溢出、格式化字符串漏洞、ROP等,可以帮助我们攻击和利用目标程序。总的来说,CTF逆向入门需要多方面的知识储备和实践经验,在不断学习和实践过程中提升自己的能力,才能更好地应对复杂的逆向挑战。 ### 回答2: ctf逆向(reverse)是赛事中的一项重要技能,难度较高,需要掌握一定的专业知识。以下是初学者入门ctf逆向的脑图: 1.计算机组成原理:掌握计算机的各种硬件组件和内部结构,如处理器、内存、I/O设备等。 2.汇编语言:掌握常用汇编指令和机器指令,包括基本的数据类型、运算符、控制结构和子程序等。 3.操作系统:理解操作系统原理,掌握基本的程序调试和反汇编工具,如IDA Pro、OllyDbg等。 4.反编译:了解反编译工具和技术,学会使用OllyDbg进行程序的动态调试和逆向分析。 5.加密技术:了解常见的加密和解密算法,如MD5、SHA1、AES、RSA等。 6.漏洞利用:掌握常见的漏洞类型和利用技术,如缓冲区溢出、格式化字符串漏洞、堆溢出等。 7.网络安全:了解网络安全基础知识,包括TCP/IP协议、网络攻击和防御、网络数据包分析等。 8.实践和练习:参加ctf比赛,通过练习和实践逐步提高自己的逆向技能和解能力。 通过以上脑图的学习,初学者可以逐步掌握ctf逆向技能,提高自己在竞赛中的排名和成绩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值