2020 "第五空间"智能安全大赛 Re nop

测试文件:https://wwa.lanzous.com/is4hte2ulfc

 

代码处理

 

这道题是花指令相关题目,利用int 80h做中断。

首先将包含int 80h中断的sub_804857Bsub_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}

posted @ 2020-06-27 15:14  Hk_Mayfly  阅读(423)  评论(3编辑  收藏  举报