Writeup(2020.7.8-2020.7.14)

buuctf新年礼物

查壳,除壳,ida打开
直接找到main函数
观察字符串
flag{HappyNewYear!}

buuctf[BJDCTF 2nd]8086

先查壳,发现没壳,拉进IDA。
Start 函数中调用了sub_10030函数,进去查看Writeup(2020.7.8-2020.7.14)_第1张图片

发现sub_10030函数是个死循环,不断跳转到自身。Writeup(2020.7.8-2020.7.14)_第2张图片

直接查看汇编,这是一个由8086汇编写成的程序。第一段数据段是将这串字符串写入物理地址,并取名aUDuTZWjQGjzZWz。Writeup(2020.7.8-2020.7.14)_第3张图片

接下来则是代码段,就是刚才的死循环段。但是后面还有一串数据,估计就是真正的代码。选中,按C,选force,强制转换成汇编。Writeup(2020.7.8-2020.7.14)_第4张图片

这里是循环0x22次。字符串和0x1f抑或,抑或的结果就是flag了。

a = ']U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b'
flag = ''
for i in a:
    flag += chr(ord(i)^0x1F)
print(flag)

BJD{jack_de_hu1b1an_xuede_henHa0}
此部分借鉴自https://blog.csdn.net/qq_44625297/article/details/105158182

buuctf xor

直接ida打开
查看main函数及其伪代码

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   char *v3; // rsi
 4   int result; // eax
 5   signed int i; // [rsp+2Ch] [rbp-124h]
 6   char v6[264]; // [rsp+40h] [rbp-110h]
 7   __int64 v7; // [rsp+148h] [rbp-8h]
 8 
 9   memset(v6, 0, 0x100uLL);
10   v3 = (char *)256;
11   printf("Input your flag:\n", 0LL);
12   get_line(v6, 256LL);
13   if ( strlen(v6) != 33 )
14     goto LABEL_12;
15   for ( i = 1; i < 33; ++i )
16     v6[i] ^= v6[i - 1];
17   v3 = global;
18   if ( !strncmp(v6, global, 0x21uLL) )
19     printf("Success", v3);
20   else
21 LABEL_12:
22     printf("Failed", v3);
23   result = __stack_chk_guard;
24   if ( __stack_chk_guard == v7 )
25     result = 0;
26   return result;
27 }

分析可知,flag长度为33位(15,16的循环语句)
并且我们可以得到语句的处理方式,将global反向处理即可
脚本

str1 = ['f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v',
        '"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O']

x = 'f'

for i in range(1, len(str1)):
    if (isinstance(str1[i], str)):
        if (isinstance(str1[i - 1], str)):
            x += chr(ord(str1[i]) ^ ord(str1[i - 1]))
        else:
            x += chr(ord(str1[i]) ^ str1[i - 1])
    else:
        x += chr(str1[i] ^ ord(str1[i - 1]))

print(x)

(脚本借鉴自https://www.cnblogs.com/Mayfly-nymph/p/11461575.html)
flag{QianQiuWanDai_YiTongJiangHu}

buuctfSimpleRev

文件直接ida,32位不行就64位
打开找到main函数,f5查看伪代码
Writeup(2020.7.8-2020.7.14)_第5张图片
发现Detry()应该是判断函数
打开继续查看
淦,不会了
开始百度
http://shangdixinxi.com/detail-1448227.html

buuctf内涵的软件

查壳,无壳,ida打开
妈的这出题人是智障
真的内涵
一看就看出来了

int __cdecl main_0()
{
  int result; // eax
  char v1; // [esp+4Ch] [ebp-Ch]
  const char *v2; // [esp+50h] [ebp-8h]
  int v3; // [esp+54h] [ebp-4h]

  v3 = 5;
  v2 = "DBAPP{49d3c93df25caad81232130f3d2ebfad}";
  while ( v3 >= 0 )
  {
    printf(aD, v3);
    sub_40100A();
    --v3;
  }
  printf(
    "\n"
    "\n"
    "\n"
    "这里本来应该是答案的,但是粗心的程序员忘记把变量写进来了,你要不逆向试试看:(Y/N)\n");
  v1 = 1;
  scanf("%c", &v1);
  if ( v1 == 89 )
  {
    printf(aOdIda);
    result = sub_40100A();
  }
  else
  {
    if ( v1 == 78 )
      printf(asc_425034);
    else
      printf("输入错误,没有提示.");
    result = sub_40100A();
  }
  return result;
}

flag就是花括号包的部分
flag{49d3c93df25caad81232130f3d2ebfad}
(持续更新…)

你可能感兴趣的:(信息安全,debug)