首页
社区
课程
招聘
[原创]CTF2019_Q1_Repwn
2019-3-12 17:38 2065

[原创]CTF2019_Q1_Repwn

2019-3-12 17:38
2065

首先从第八位对预定义字符串进行比较:

.text:00401350                 movzx   eax, byte ptr [edx+ebp-38h]
.text:00401355                 cmp     al, [ecx+ebx]
.text:00401358                 jnz     short loc_40136C
.text:0040135A                 inc     edx
.text:0040135B                 inc     ecx
.text:0040135C                 cmp     edx, 0Bh
.text:0040135F                 jle     short loc_401350

即X1Y0uN3t
而后在sub_401460中:

int __cdecl sub_401460(char *Str)
{
  char Dest; // [esp+8h] [ebp-10h]

  if ( strlen(Str) == 0x18 )
  {
    if ( sub_4013B0((int)Str) )
    {
      Str[20] -= 88;
      Str[21] -= 70;
      Str[22] -= 3;
      Str[23] -= 107;
      strcpy(&Dest, Str);
    }
  }
  else
  {
    printf("String Length is Wrong");
  }
  return 0;
}

首先判断了字符串长度
而后进入sub_4013B0,是几个方程判断:

int __cdecl sub_4013B0(int a1)
{
  int v1; // ebx
  int v2; // ecx
  int v3; // esi
  int result; // eax

  str_to_num(a1);
  v1 = num[3] + 1000 * num[0] + 100 * num[1] + 10 * num[2];
  v2 = num[5] + 10 * num[4];
  v3 = num[7] + 10 * num[6];
  result = 2 * (v1 + v2);
  if ( result == 0xFC8 )
  {
    result = 3 * v2 / 2;
    if ( result + 100 * v3 == 0x73 )
    {
      result = 1;
      if ( v1 - 110 * v3 != 0x76C )
        result = printf("Key_Is_Wrong,Please_Input_Again!");
    }
  }
  return result;
}

大致推测前八位为十进制字符且分成三个数v1,v2,v3,而后由方程组解出三个数:

from z3 import *

x=Int('x')
y=Int('y')
z=Int('z')
solver=Solver()
solver.add((2*(x+y))%0xffffffff==0xfc8)
solver.add((2*(x+y))%0xffffffff==0xfc8)
solver.add((3*y/2+100*z)%0xffffffff==0x73)
solver.add((x-110*z)%0xffffffff==0x76c)
solver.add(x<9999)
solver.add(y<99)
solver.add(x>0)
solver.add(y>0)
solver.add(z>0)
solver.add(z<99)
print(solver.check())
print(solver.model())

得到:

sat
[z = 1, y = 10, x = 2010]

即前面8位为20101001
最后可以看到最后:

      Str[20] -= 88;
      Str[21] -= 70;
      Str[22] -= 3;
      Str[23] -= 107;
      strcpy(&Dest, Str);

存在溢出,类似2017年的一题
需要我们跳到另一处判断
我是通过字符串引用看到sub_4018B0处代码
上层引用看到401BF0处代码未定义,且有printf和system等操作(可疑)

key=[
  0xf0, 0x1b, 0x40, 0x00
]
key[0]+=88
key[1]+=70
key[2]+=3
key[3]+=107
for i in key:
  x+=chr(i%256)
print x

可以得到最后4字节HaCk
输入20101001X1Y0uN3tG00d即可跳到另一处加密
会再次输入并检测字符串,这里通过程序流的关键处理步骤,(好像PiED的插件也可以)可以看出是DES加密,密钥为XiyouNet(开始我把子秘钥位置当做密钥二进制卡了一大会,犯傻了):

from Crypto.Cipher import DES

key = 'XiyouNet'
kirin=DES.new(key,DES.MODE_ECB)
s=kirin.decrypt("\x9d\xb0\x84\xac\x97\x04\x1e\x30")
print s
#Wel1C0me
#Currect,Flag_Format_Is_Input1+Input2

第二步字符串:Wel1C0me


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2019-3-16 20:29 被梅零落编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回