天天看点

Reversing.kr Easy Keygen、Easy Unpack

Reversing.kr Easy Keygen、Easy Unpack

一天一道CTF题目,能多不能少

Easy Keygen

下载文件打开,发现readme.txt中存在提示:

Reversing.kr Easy Keygen、Easy Unpack

大概意思是找对应这一串数字的名字,,,

用IDA打开,找到输入的地方,得到一个主要的函数:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  signed int v3; // ebp
  signed int i; // esi
  char v6; // [esp+Ch] [ebp-130h]
  char v7; // [esp+Dh] [ebp-12Fh]
  char v8; // [esp+Eh] [ebp-12Eh]
  char v9; // [esp+10h] [ebp-12Ch]
  char v10; // [esp+11h] [ebp-12Bh]
  __int16 v11; // [esp+71h] [ebp-CBh]
  char v12; // [esp+73h] [ebp-C9h]
  char v13; // [esp+74h] [ebp-C8h]
  char v14; // [esp+75h] [ebp-C7h]
  __int16 v15; // [esp+139h] [ebp-3h]
  char v16; // [esp+13Bh] [ebp-1h]

  v9 = 0;
  v13 = 0;
  memset(&v10, 0, 0x60u);
  v11 = 0;
  v12 = 0;
  memset(&v14, 0, 0xC4u);
  v15 = 0;
  v16 = 0;
  v6 = 16;
  v7 = 32;
  v8 = 48;
  sub_4011B9(aInputName);
  scanf(aS, &v9);
  v3 = 0;
  for ( i = 0; v3 < (signed int)strlen(&v9); ++i )
  {
    if ( i >= 3 )
      i = 0;
    sprintf(&v13, aS02x, &v13, *(&v9 + v3++) ^ *(&v6 + i));
  }
  memset(&v9, 0, 0x64u);
  sub_4011B9(aInputSerial);
  scanf(aS, &v9);
  if ( !strcmp(&v9, &v13) )
    sub_4011B9(aCorrect);
  else
    sub_4011B9(aWrong);
  return 0;
}
           

关键地方:

Reversing.kr Easy Keygen、Easy Unpack

首先输入名字,然后根据名字得到一串字符

后面再对你输入的字符进行比较,一样就输出正确

直接编写脚本:

s = "5B134977135E7D13"

v3 = 0
v6 = [16,32,48]

flag = ""
for i in range(0,int(len(s)/2)):
	x = int(str(s[i*2:(i+1)*2]),16)
	#print((x ^ (v6 + v4)) - v3)
	flag += chr(x ^ (v6[i % 3]))
print(flag)
           

得到flag:

K3yg3nm3

Easy Unpack

看名字就知道是脱壳~

直接下载打开,也有一个readme.txt:

Reversing.kr Easy Keygen、Easy Unpack

找到OEP也就是程序入口地址

直接用OD打开,载入的时候会弹出如下一个框:

Reversing.kr Easy Keygen、Easy Unpack

这个时候我们就要选择否,并且一般这个时候使用的是单步跟踪法

关于单步跟踪法:

单步跟踪法就是利用OD的单条指令执行功能,从壳的入口一直执行到OEP,最终通过这个OEP将原程序dump出来。然当,在单步跟踪的时候需要跳过一些不能执行到的指令。

  使用单步跟踪法追踪OEP的常见步骤:

  1、用OD载入待脱壳文件,如果出现压缩提示,选择“不分析代码”;

  2、向下单步跟踪,实现向下的跳转;

  3、遇到程序往上跳转的时候(包括循环),在回跳的下一句代码上单击并按键盘上的“F4”键跳过回跳指令;

  4、OD中的绿色线条表示跳转没有实理,不必理会,红色线条表示跳转已经实现;

  5、如果刚载入程序的时候,在附近有一个CALL指令,那么就要按键盘上的“F7”键跟进这个CALL内,不然程序很容易运行起来;

  6、在跟踪的时候,如果执行某个CALL指令后就运行,一定要按键盘上的“F7”键进入这个CALL之内再单步跟踪;

  7、遇到在popad指令下的远转移指令时,要格处注意,因为这个远转移指令的目的地很可能就是OEP。

根据上面的步骤来一步一步执行,最后来到如下图的地方:

Reversing.kr Easy Keygen、Easy Unpack

继续执行来都如下地方:

Reversing.kr Easy Keygen、Easy Unpack

如此熟悉,很想平时的程序入口地址,而且刚刚那个jmp跳这么远

怀疑刚刚那个jmp跳过来的就是OEP地址

直接提交00401150

正确~~