题目下载:下载
下载完后发现是个压缩包,所以解压完成后载入IDA。
先执行一下程序: 发现这个flag是个假的,而我们也没有进行输入就跳出这个东西,所以在可能是检验某种flag的形式而不是对输入的flag进行检查。
看一看程序,
发现这是一种SSE指令集。
更多指令,可查看SSE指令集学习__mm_srai_epi16_林小鱼的猫的博客-CSDN博客SSE2的一些常用指令集介绍__mm_loadu_si128_小白的进阶的博客-CSDN博客
SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是继MMX的扩展指令集。SSE指令集提供了70条新指令。AMD后来在Athlon XP中加入了对这个新指令集的支持。
SSE指令,被包含在头文件:“emmintrin.h”(SSE2)中,且大多数SSE操作需要所给的数据是16-bytes对齐;
SSE(Streaming SIMD Extensions),是一种SIMD(单指令,多数据)指令集,即利用一个指令同时对多个资料进行相同的动作.SSE指令主要包含了四个部分:单精度浮点数运算指令,整数运算指令,缓存控制指令和状态控制指令。
SSE指令新增8个128位的寄存器(XMM0到XMM7),可以用来计算任何基本数据类型的数据,使用之前,需要将数据从内存加载到这些暂存器中,且加载的数据高位在前,低位在后。
部分指令:1._mm_load_si128(_m128i * p):返回一个_m128i的寄存器,将p指向的数据读到寄存器中,加载128位的值,p一般是通过类型转换得到的;
2._mm_unpacklo_epi8(_m128i S0,_m128i S1):将S0和S1的低64位数以8位为单位进行交错;
3._mm_unpackhi_epi8(_m128i S0,_m128i S1):将S0和S1的高64位数以8位为单位进行交错;
4._mm_add_epi32(_m128i S0,_m128i S1):返回一个_m128i的寄存器,将S0和S1中对应位置的32bit整数分别相加;
5._mm_srli_si128(a,imm)表示:将a进行逻辑右移imm位,高位填充0。
6._mm_cvtsi128_si32(a)表示:将a的低32位赋值给一个32bits的整数,返回值为r=a0;
在看输出代码
所以看出来haystack就是我们要的flag,而中间的那些个SSE操作好像并没有改变haystack结果,所以可以不用管,既然后面的代码输出没有什么东西,那就观察前面的代码: 对v3进行操作,然后分别放到byte_6012A8,byte_6012A9,byte_6012AA,byte_6012AB,在.bss区可以知道他们和后面的dword_6012AC是占连续的空间的,可以看成一个数组。然后是一个if判断。
getenv是函数名,从环境中取字符串,获取环境变量的值,getenv用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。getenv函数的返回值存储在一个全局二维数组里,当你再次使用getenv函数时不用担心会覆盖上次的调用结果。
如果要知道haystack就运行for循环,而byte_6012A8数组里面有dword_6012AC,它是未知的,要想知道它,则if语句必须成立。所以根据里面的条件( getenv("ASIS") && (*(_DWORD *)getenv("CTF") ^ v3) == 0xFEEBFEEB)知道getenv("CTF")==0x4ff2da0a,
getenv("ASIS")不为0就行,盲猜也是0x4ff2da0a。然后改环境变量。
我们导入linux的环境变量,这里也补充一些基本知识:(注意:export只能在当前终端中有效,终端关闭就没用了)
(通过printf可以导入十六进制整数类型,值得积累)
export ASIS="$(printf "\x0a\xda\xf2\x4f")" #注意参数是从低位到高位的
export CTF="$(printf "\x0a\xda\xf2\x4f")"
所以就能获得flag了。(根据if语句,按道理ASIS的环境变量不是0就可以,但是试了试好像不可以,wuwuwu~)
环境变量:【Linux】Linux中的环境变量及其意义_linux环境变量的作用_蒋灵瑜的笔记本的博客-CSDN博客
环境变量是操作系统为了满足不同的应用场景而预先在系统内设置的一大批全局变量。
环境变量相关命令:1、set:显示本地定义的shell变量和环境变量。
2、unset:取消环境变量。
3、export:将本地变量设置为全局变量。
4、env:显示所有环境变量。
5、echo:显示某个环境变量的值
上一篇:第三章 完善MBR