easyre1
本人今天才开始学的逆向,汇编上课也没咋听,师傅们请点喷
题目下载文件,拖进IDA,然后可以直接看到汇编源码了
按f5就能看到源码了,直接看c语言代码
直接把flag{this_Is_a_EaSyRe}交上去就行了
reverse1
下载程序,只看见一个程序
直接在IDA打开(要查壳的后面遇到再说吧,现在还在学习)
点开没有发现main函数,这是有一个思路就是看看string视图(我这的话views里头有个open subviews里头就有)
搁着呢
发现有个提示字符串点开看看
看见了比较有用的东西
db在汇编语言里面是一个在内存分配一个或多个字节空间的指令,可以用来定义字符串,在这里意思是,定义一个名为 aInputTheFlag
的字节数组,并将字符串 'input the flag:'
存储在该数组中,末尾以 0
作为字符串的结束符(也就是我们熟悉的c语言里头/0作为字符串的末尾)
之后我们双击这个aInputTheFlag
变量,按x跳到引用该变量的程序,查看汇编程序和伪代码
看伪代码,可知它要我们输入str1,然后利用strncmp()函数和str2进行比较
前提知识:int strncmp(const char *str1, const char *str2, size_t n);
str1,str2为比较的两个函数,n表示要比较的长度,当返回值为:
<0 str1<str2
=0 str1=str2
>0 str1>str2
是在不行就看成str1-str2吧(按字典比较的,字符串比较是比较基础的知识了),因此题目里头就是要str1=str2才能猜对flag
这下问题变为这个str2的值为什么?
继续查看str2的信息,发现
lea rcx, Str2 ; "{hello_world}"
这个代码就是把Str2的地址(不是str2字符串内容哈)加载到寄存器rcx里头,后面有个注释{hello_world},怀疑就是str2的值,然后继续在string视图里头看{hello_world}这个字符串,发现
直接确定了,但是伪代码里头还有一段对str2处理的代码,这里审计一下(在IDA里头我们可以把ascii数字引住然后按r,这样就会变成字符了)
for ( j = 0; ; ++j )
{
v8 = j; //v8记录当前枚举到的字符串位置
v2 = j_strlen(Str2); //v2记录字符串的长度
if ( v8 > v2 ) //当v8超过v2时结束循环,说白了就是遍历字符串!!
break;
if ( Str2[j] == 111 )//当str2里头出现ascii值为111的字符,即遇到'o',我们就把它改成'0'
Str2[j] = 48;
}
总的来说就是把字符串里头的'o'改为‘0’
因此,我们就得到了flag:
flag{hell0_w0rld}
reverse2
和上一题一样,也是要你输入一个字符串,然后让你输入的字符串和修改过的flag进行比较(上面那个函数好像是和操作系统有关的,也不懂他是啥,不重要)
此时我们的任务就是找到这个flag变量了,要看看flag变量储存的是什么字符串
对flag双击,找到定义flag的汇编程序片段
这里往flag赋值了'{' ,往aHackingForFun赋值了'hacking_for_fun}’,这里我查了一下(如有错误,请师傅们指正)虽然flag和aHackingForFun是两个不同的变量,但是地址相邻(一个0x601080一个0x601081)程序在处理的时候可能会组合这两个数据(也就是读取flag的时候也会将后面的aHackingForFun连起来形成{hacking_for_fun})
然后我们看一下c语言里头处理flag的部分(将ascii编码的数字引用按r得到字符原型)
for ( i = 0; i <= strlen(&flag); ++i )
{
if ( *(&flag + i) == 'i' || *(&flag + i) == 'r' )
*(&flag + i) = '1';
}
说白了就是遍历字符串,将字符串里头的'i'和'r'变成'1' (c语言在逆向是基础!)
综上所述,得到payload
flag{hack1ng_fo1_fun}
内涵的软件
这里拖到IDA直接看到汇编源码里头有个奇怪的字符串了,盲猜就是flag
交上去就是了,但是我这个IDA按f5打不开这个源码也不到为啥到时候有时间再看看吧