whatamitoyou-小白详解

通过逆向工程解析一个程序的加密机制,利用IDA和EDB调试器定位关键逻辑,分析汇编代码,最终成功获取密钥并解锁程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验吧题目的writeup(小白详细(图))是本人,不存在抄袭,writeup不知道成功没,查询不到,所以在这里简略备份记录一下研究成果;

UE打开

可以看到是文件头是ELF,内部有linux的库字符,使用gcc编译;去linux系统下看文件

ELF信息

百度得知ELF是linux下的文件头,运行readelf –h whatamitoyou可以查看文件头信息

可以看到该文件是AMDx86-64生成的64位可执行文件,我们环境支持运行,chmod 744给权限后运行一下,发现出错

初步猜测是内存溢出或者内部代码计算出问题,用gdb试探一下,发现在40191C处执行出错,但是没有捕捉到函数名之类的额外提示,意料之中

调试还是要专业工具来,安装好IDA后将linux_server64拷贝到linux系统中,给权限运行如果程序是32位就拷贝linux_server(看雪:IDA-Linux教程https://bbs.pediy.com/thread-247830-1.htm

 

几个指令段转伪代码看看,前面gdb提示错误在40191C处,转到,F5查看伪代码

正好是main函数

关键逻辑如下

v282、v283、v285与生成KEY有关,变量定义v283=0,前后代码分析,该变量是统计字符长度;v285=&v140那么我们去看v140是什么,变量定义为8字节,变量赋值转为char字符后发现是一个单词,依次转到v144(140~144代码中是个char数组?)

循环中v282是我们输入的参数,用于计算指针偏移量,拼接字符串,而他的定义为char

根据题目和前期出现的字符串,可以搜索到一首歌My Best Friends InThe World(What Am I To You?)。对比这首歌可以看出hex内的歌词顺序是乱,Key的长度应该是歌词的句数(n=35),成功整理歌词顺序则可获取KEY

断点到while下第一句,然后运行程序,打开视图->Strings;查看内存中各句歌词的地址(如果没有,就断点在v283处,重新打开Strings)

歌词顺序可知:

歌词第一句为”Everyone, Bubblegum I’m so dumb”,下一句是”I should have just told you”

我们搜索这两句

第一句7FFF718A4E10

第二句7FFF718A46F0

计算偏移量为6F0-E10=-720;偏移量居然出现负数,这明显不对,按理说第二句应该是第一句指针后移一定量的,IDA内存读取不行啊;(这里小白研究了近5个小时,没研究出结果,后面上网搜索视频解答,发现是IDA的锅)

EDB

kali打开edb debugger调试,执行命令“edb --run '/root/whatamitoyou' aaaaaaaaaaaaaa”,根据IDA中获取到的地址,在edb中断点到“00000000004018ED”

运行程序到断点处,然后在内存中转到rax地址处查看,是第一句歌词(0x00007ffebe03fce0),接下来搜索第二句歌词位置

有两处cb8和df0,很明显应该是df0,不过这里我将两个地址在内存中的数据都查看了,分析一下为啥IDA找的是错误的,明显IDA找到的是cb8位置出的,没有找到df0处的,这里两处其实都是指向5c0处,不知道为什么IDA没找到后面哪个,毕竟用的绿色版,唉

KEY获取计算

汇总上面分析结果:

第一句歌词地址0x00007ffebe03fce0;

第二句歌词地址0x00007ffebe03fdf0;

指针汇编语句mov     rax, [rax+rdx*8];

伪代码v285 = (__int64 *)v285[v282 - 65 + 32LL];

可得计算公式:

v282 - 65 + 32=rdx;//rdx由前面的汇编计算出来,然后传给指针汇编语句

0x00007ffebe03fce0+rdx*8=0x00007ffebe03fdf0;//第一句歌词偏移后指针指向第二句歌词

计算出

rdx*8=0x110;rdx=0x22

  v282-33=34;v282=67 //ASCII “C”

因此第一个字符为ASCII码67,即字符C;

依次类推,得到剩下的输入。

完整的输入为CBDABCADBCCABBABBABACBCCABDADBABABB

加上这个参数运行程序得到“Your password is tjctf{pblgjd}”

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值