测试文件: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}