逆向攻防世界CTF系列7-logmein

==重要知识点:不同ida版本的反编译结果不同!!!==

image-20241013153345811

64位,main函数

image-20241013153530468

image-20241013153543860

目的是执行最后的这段代码

image-20241013153729858

审计代码,v3长度>=v8长度

if ( i >= strlen(v8) ) sub_4007C0(); 则可知v3长度必须等于v8长度,否则下标i会>=v8

==看到下面那段代码的时候发现怎么都解释不通,后来发现了一个震惊小白的事,就是不同版本的ida反编译的伪代码不同,我刚才用的是idapro 8.3 然后去试了idapro7.7 和idapro 7.0,发现7的反编译结果才是正确的,如下图==

image-20241013181454096

用上了v6和v7,而之前的伪代码都没有用上!!!!

让我们再解读一下下面那个语句吧:

重点是:(_BYTE *)&v7的意思是,把longlong型的v7强制转化为byte型的地址,简单的说,就是把它看成字符串(C语言字符串本质都是指针首地址+偏移)。

用v7的值10进制转16进制,得到:ebmarah

这个题目除了基本的IDA pro的一些小小的快捷键之外,还需要知道小端序和大端序的知识,怎么去判断是小端序和大端序,大概就是在做题的时候,如果碰到我们需要手动去转字符的,应该就是反转一下字符的位置,实在不行大端序和小端序都去试一下。

反转他:harambe

v8 = ":\"AL_RT^L*.?+6/46"
v7 = 'harambe'

for i in range(len(v8)):
    char = ord(v7[i % 7]) ^ ord(v8[i])  
    print(chr(char), end='') 

解释下这段脚本,两个字符不能直接异或因此要用ord,将字符转为字符再异或,再chr转到字符

得到RC3-2016-XORISGUD

chr() 用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
参数:i—可以是10进制也可以是16进制的形式的数字
返回值:当前整数对应的ASCII字符,分别输入十进制数和十六进制数

ord()函数是chr()函数的配对函数,它以一个字符作为参数,返回对应的ASCII数值。
返回值:对应的十进制整数

hex()函数用于将10进制整数转换为16进制,以字符串形式表示。

oct() 函数将一个整数转换成8进制字符串。