BUUCTF第十六、十七题解题思路

目录

第十六题pyre

第十七题easyre


第十六题pyre

下载文件后根据后缀得知文件为python文件,查壳。

pyc文件,需要先反汇编,用Easy Python Decompiler打开pyc文件,反汇编后会生成一个pyc_dis文件,用Typora打开。

print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = ['\x1f',
 '\x12',
 '\x1d',
 '(',
 '0',
 '4',
 '\x01',
 '\x06',
 '\x14',
 '4',
 ',',
 '\x1b',
 'U',
 '?',
 'o',
 '6',
 '*',
 ':',
 '\x01',
 'D',
 ';',
 '%',
 '\x13']

分析代码:将input1中的每一位替换得到code,再将code每一位与后一位异或,得到下面输出的code,写脚本解出input1就可以得到flag。

import base64
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06',
        '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':',
        '\x01', 'D', ';', '%', '\x13']
input1 = ""
for i in range(len(code) - 2, -1, -1):
    code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))

for i in range(len(code)):
    input1 += chr((ord(code[i]) - i) % 128)

print(input1)

解得flag为{Just_Re_1s_Ha66y!}

第十七题easyre

先解压,得到可执行文件,查壳

32位,upx壳,使用CCF进行脱壳。

将脱壳后的exe文件用32位IDA打开,检索字符串,可以看到一个字符串“You are correct!”,应该与flag有关,对其交叉引用找到函数进行反汇编得到伪代码。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  _BYTE v4[12]; // [esp+12h] [ebp-2Eh] BYREF
  _DWORD v5[3]; // [esp+1Eh] [ebp-22h]
  _BYTE v6[5]; // [esp+2Ah] [ebp-16h] BYREF
  int v7; // [esp+2Fh] [ebp-11h]
  int v8; // [esp+33h] [ebp-Dh]
  int v9; // [esp+37h] [ebp-9h]
  char v10; // [esp+3Bh] [ebp-5h]
  int i; // [esp+3Ch] [ebp-4h]

  __main();
  qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));
  printf("Please input:");
  scanf("%s", v6);
  if ( v6[0] != 65 || v6[1] != 67 || v6[2] != 84 || v6[3] != 70 || v6[4] != 123 || v10 != 125 )
    return 0;
  v5[0] = v7;
  v5[1] = v8;
  v5[2] = v9;
  for ( i = 0; i <= 11; ++i )
  {
    if ( v4[i] != _data_start__[*((char *)v5 + i) - 1] )
      return 0;
  }
  printf("You are correct!");
  return 0;
}

分析代码:将字符串“*F'\"N,\"(I?+@”复制到v4中去,将输入的内容赋值给v6,如果v6的值不等于A、C、T、F、{、},返回0,将v7赋值给v5[0],将v8赋值给v5[1]、将v9赋值给v5[2],for循环11次,如果v4中字符串的一位不等于_data_start__中的一位-1,返回0。查看一下_data_start__,发现它的值为“~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%# !"”,写脚本。

import base64

v4 = "*F'\"N,\"(I?+@"
flag = ""
dict1 = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%# !\""
for i in v4:
    flag += chr(dict1.index(i) + 1)
print(flag)

解得flag为flag{U9X^1S^W6@T?}。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值