[第五空间]re nop题目详解

[第五空间]nop

第一次写这种题,看网上其他大佬的代码处理有点晕,这里提供一种不同的思路(xky太强了)

ida打开,发现f5反编译的代码太诡异,直接输入完东西后就跳地址,应该是用了花指令什么的来混淆,所以直接看汇编代码

[第五空间]re nop题目详解_第1张图片

我们从最开的输入一步步分析,

这里OFFSET是将数值回送变量或标号的偏移地址值,所以意味着我们这里是要输入数字的(从%d也可以看出)

然后把我们的输入给了number(这个number是我自己改的,方便看)

然后按照程序顺序来看,

[第五空间]re nop题目详解_第2张图片

number给了eax,eax自加一,然后跳到loc_80486F5,

[第五空间]re nop题目详解_第3张图片

然后又把eax给了number(就是相当于number自加一,而eax相当于一个中间变量),接着执行sub_804857B函数,

[第五空间]re nop题目详解_第4张图片

由于sub_804857B里面是仅仅对eax进行的操作,并没有把eax给了number,而且后面的eax后来又再次被number赋值,所以对程序没啥影响,直接略过(后来才知道是反调试函数)

再往下还是number给eax,eax++,跳转到loc_8048701

[第五空间]re nop题目详解_第5张图片

这里又把eax给了number,加上之间的,number现在已经加了二,

由于sub_80485C4(这张图里面有三处)里面是仅仅对eax进行的操作,并没有把eax给了number,而且后面的eax后来又再次被number赋值,同之前的那个函数一样,对程序没有影响(后来才知道是反调试函数)

再往下分析,就是eax+0x0CCCCCCCC,这样从最开始,刚开始输入的number就成了

number=number+2+0x0CCCCCCCC

然后再次把number给了eax,之后调用sub_8048753,这个数最后一个函数,应该是到了判断我们的输入的地方了

[第五空间]re nop题目详解_第6张图片

这里先把number给了eax,然后执行sub_8048691函数,之后eax++,再执行一遍sub_8048691,然后就到判断对错的地方了

蹊跷的是,这里程序是直接跳到错误地方,无论你输入什么也是错误,可以从文本模式看出

[第五空间]re nop题目详解_第7张图片

然后根据这个题目nop就想到:可能是sub_8048691执行了某些操作吧这个08048765的数据给nop了,

由于执行了两遍sub_8048691,我们只需要让第一次的nop掉08048764,第二次nop掉08048765的就行了

进入这个函数看看,

[第五空间]re nop题目详解_第8张图片

补充知识点:1.nop的机械码是0x90

[第五空间]re nop题目详解_第9张图片

通俗点讲,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(0xcccccccc0x08048765)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(0xcccccccc0x08048765)2
得到:993507990

验证是正确的,所以flag为:flag{993507990}

你可能感兴趣的:(ctf,逆向)