getit
难度系数: ⭐⭐⭐
题目来源: SharifCTF 2016
题目描述:菜鸡发现这个程序偷偷摸摸在自己的机器上搞事情,它决定一探究竟
题目场景: 暂无
拿到手,查一下是否有壳
无壳,ELF,64位
直接ida打开,啊好复杂,直接f5看伪代码,main函数的伪代码
哇,看我看见了什么,flag.的气息,十有八九就分析这部分内容就okk啦。
第一部分是定义了一些变量,然后是一个循环,再往下就是写一个文件,往文件内写一些目前还不知道的东西。
最后还有一个remove,是不是不删除就可以最后看到文件里的内容,我觉得还行,那我就先看看往文件里写了什么
以我不深厚的代码功底,粗略扫一下,v5,u,t,p,这几个都比较可疑
v5是在开头定义的,__int64类型,还是从零开始,排除。
找u的值
看我发现了什么,u,t,p,s的值都有了,经过我慎重的思考,这个t的值的这个大括号是不是很想flag的样子
t的值是啥子呦,怎么还有个53h,作为一个逆向小萌新,肯定是不知道怎么解决的啦,但是我偶然,看见了题目来源是 SharifCTF 2016 是不是和辣个harifCTF一样,53h代表着S?
这是什么神秘的转换,我查查,最后发现ASCLL码的16进制53是S,好像恍然大悟,嗯??~~!!!
继续看我们的代码,在while循环里有t的值,现在就需要让那一串问号现形了。
开始着手写代码啦
多余的变量统统删掉,把报错的地方修修改改
1 #include <stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char v3; // al 6 long long v5=0; // [rsp+0h] [rbp-40h] 7 char s[] = "c61b68366edeb7bdce3c6820314b7498"; 8 char t[] = "SharifCTF{????????????????????????????????}"; 9 10 while ( (signed int)v5 < strlen(s) ) 11 { 12 if ( v5 & 1 ) 13 v3 = 1; 14 else 15 v3 = -1; 16 *(t + (signed int)v5 + 10) = s[(signed int)v5] + v3; 17 v5++; 18 } 19 printf("%s",t); 20 return 0; 21 22 }
哈!成功!
敲开心!!
年轻的我还是太年轻啦,看大佬的评论才知道,原来用文本打开可以直接看到t的值
收获满满!!!
加油!未来可期