[第五空间]nop
第一次写这种题,看网上其他大佬的代码处理有点晕,这里提供一种不同的思路(xky太强了)
ida打开,发现f5反编译的代码太诡异,直接输入完东西后就跳地址,应该是用了花指令什么的来混淆,所以直接看汇编代码
我们从最开的输入一步步分析,
这里OFFSET是将数值回送变量或标号的偏移地址值,所以意味着我们这里是要输入数字的(从%d也可以看出)
然后把我们的输入给了number(这个number是我自己改的,方便看)
然后按照程序顺序来看,
number给了eax,eax自加一,然后跳到loc_80486F5,
然后又把eax给了number(就是相当于number自加一,而eax相当于一个中间变量),接着执行sub_804857B函数,
由于sub_804857B里面是仅仅对eax进行的操作,并没有把eax给了number,而且后面的eax后来又再次被number赋值,所以对程序没啥影响,直接略过(后来才知道是反调试函数)
再往下还是number给eax,eax++,跳转到loc_8048701
这里又把eax给了number,加上之间的,number现在已经加了二,
由于sub_80485C4(这张图里面有三处)里面是仅仅对eax进行的操作,并没有把eax给了number,而且后面的eax后来又再次被number赋值,同之前的那个函数一样,对程序没有影响(后来才知道是反调试函数)
再往下分析,就是eax+0x0CCCCCCCC,这样从最开始,刚开始输入的number就成了
number=number+2+0x0CCCCCCCC
然后再次把number给了eax,之后调用sub_8048753,这个数最后一个函数,应该是到了判断我们的输入的地方了
这里先把number给了eax,然后执行sub_8048691函数,之后eax++,再执行一遍sub_8048691,然后就到判断对错的地方了
蹊跷的是,这里程序是直接跳到错误地方,无论你输入什么也是错误,可以从文本模式看出
然后根据这个题目nop就想到:可能是sub_8048691执行了某些操作吧这个08048765的数据给nop了,
由于执行了两遍sub_8048691,我们只需要让第一次的nop掉08048764,第二次nop掉08048765的就行了
进入这个函数看看,
补充知识点:1.nop的机械码是0x90
通俗点讲,ptr就是指向的整个程序的内容,然后这里就把ptr[eax]的位置的内容变成了nop,验证了我们上面的猜想
那么我们就得到这样一个式子
n
u
m
b
e
r
+
2
+
0
x
C
C
C
C
C
C
C
C
=
0
x
08048764
number+2+0xCCCCCCCC=0x08048764
number+2+0xCCCCCCCC=0x08048764
由于这里涉及到溢出(0xCCCCCCCC怎么也比0x0804848764),所以我们不能按正常的加减法来算,得这样算
0
x
f
f
f
f
f
f
f
f
−
(
0
x
c
c
c
c
c
c
c
c
−
0
x
08048765
)
−
2
0xffffffff-(0xcccccccc-0x08048765)-2
0xffffffff−(0xcccccccc−0x08048765)−2
得到
993507990
常的加减法来算,得这样算
0
x
f
f
f
f
f
f
f
f
−
(
0
x
c
c
c
c
c
c
c
c
−
0
x
08048765
)
−
2
0xffffffff-(0xcccccccc-0x08048765)-2
0xffffffff−(0xcccccccc−0x08048765)−2
得到:993507990
验证是正确的,所以flag为:flag{993507990}