测试文件:https://wwa.lanzous.com/is4hte2ulfc
代码处理
这道题是花指令相关题目,利用int 80h做中断。
首先将包含int 80h中断的sub_804857B,sub_80485C4函数和反调试函数sub_804865B全部nop掉。
接着,将
push 地址
...
pop ebx
jmp ebx
这种形式的代码,都修改为
jmp 地址
这样在反编译后能够看到跳转的函数
void __cdecl main(int a1, char **a2)
{
char *v2; // eax
int savedregs; // [esp+8h] [ebp+0h]
v2 = *a2;
puts("input your flag");
__isoc99_scanf("%d", &dword_804A038);
++dword_804A038;
++dword_804A038;
dword_804A038 -= 0x33333334;
++dword_804A038;
sub_8048751((int)&savedregs);
}
代码分析
第一部分
第9~13行代码,对输入num+3-0x33333334
第二部分
进入sub_8048751函数
int __usercall sub_8048753@<eax>(int a1@<ebp>)
{
_BYTE *v1; // eax
int result; // eax
int v3; // ecx
v1 = sub_8048691((_BYTE *)dword_804A038);
sub_8048691(v1 + 1);
puts("Wrong!");
result = 0;
v3 = *(_DWORD *)(a1 - 4);
return result;
}
打开sub_8048691函数
_BYTE *__usercall sub_8048691@<eax>(_BYTE *result@<eax>)
{
*result = 0x90u;
return result;
}
这个函数实际上就是在对num地址进行nop(0x90)操作,转到前面的汇编代码
我们可以看到,这条指令是直接跳转到Wrong处,那么我们只需要将这个跳转指令(两个字节)nop掉,那么就能输出Right。
因此num+3-0x33333334=0x8048965需要成立,则num=993507990,这样就得到了flag。
get flag!
flag{993507990}
来源:oschina
链接:https://my.oschina.net/u/4355104/blog/4331806