攻防世界Reverse解题(二)

导读:本篇文章讲解 攻防世界Reverse解题(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


介绍:记录解题过程

5.Hello, CTF(16进制转ASCII码得到flag)

题目描述:菜鸡发现Flag似乎并不一定是明文比较的
题目场景: 暂无
题目附件: 附件1

  • 下载附件1 得到一个exe文件
    <1>.查壳

<2>.拖入IDA

  • main文件:
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int i; // ebx
  char v4; // al
  int result; // eax
  int v6; // [esp+0h] [ebp-70h]
  int v7; // [esp+0h] [ebp-70h]
  char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
  char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
  char v10[32]; // [esp+28h] [ebp-48h] BYREF
  __int16 v11; // [esp+48h] [ebp-28h]
  char v12; // [esp+4Ah] [ebp-26h]
  char v13[36]; // [esp+4Ch] [ebp-24h] BYREF

  strcpy(v13, "437261636b4d654a757374466f7246756e");
  while ( 1 )
  {
    memset(v10, 0, sizeof(v10));
    v11 = 0;
    v12 = 0;
    sub_40134B(aPleaseInputYou, v6);
    scanf("%s", v9);
    if ( strlen(v9) > 0x11 )
      break;
    for ( i = 0; i < 17; ++i )
    {
      v4 = v9[i];
      if ( !v4 )
        break;
      sprintf(Buffer, "%x", v4);
      strcat(v10, Buffer);
    }
    if ( !strcmp(v10, v13) )
      sub_40134B(aSuccess, v7);
    else
      sub_40134B(aWrong, v7);
  }
  sub_40134B(aWrong, v7);
  result = --Stream._cnt;
  if ( Stream._cnt < 0 )
    return _filbuf(&Stream);
  ++Stream._ptr;
  return result;
}
437261636b4d654a757374466f7246756e
  • 将16进制转ASCII码得到flag:
CrackMeJustForFun

6.open-source(修改源码输出flag)

题目描述:菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码
题目场景: 暂无
题目附件: 附件1

  • 下载附件1 得到一个c文件
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 4) {
    	printf("what?\n");
    	exit(1);
    }

    unsigned int first = atoi(argv[1]);
    if (first != 0xcafe) {
    	printf("you are wrong, sorry.\n");
    	exit(2);
    }

    unsigned int second = atoi(argv[2]);
    if (second % 5 == 3 || second % 17 != 8) {
    	printf("ha, you won't get it!\n");
    	exit(3);
    }

    if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");
    	exit(4);
    }

    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

    printf("Get your key: ");
    printf("%x\n", hash);
    return 0;
}

  • 构造条件(修改源码)输出flag:
  • int first = 0xcafe;
  • int second = 25;
for i in range(100):
    if i % 5 != 3:
        if i % 17 == 8:
            print("i:", i)
            exit()
>>> i: 25
  • argv[3] = “h4cky0u”;
strcmp() :C/C++函数,比较两个字符串。
	设这两个字符串为str1,str2,
	若str1==str2,则返回零;
	若str1<str2,则返回负数;
	若str1>str2,则返回正数。
  • payload:
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int first = 0xcafe;
    int second = 25;
    argv[3] = "h4cky0u";

    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

    printf("Get your key: ");
    printf("%x\n", hash);
    return 0;
}
  • printf
Brr wrrr grr
Get your key: c0ffee
  • flag:c0ffee

7.simple-unpack(upx -d 脱壳)

题目描述:菜鸡拿到了一个被加壳的二进制文件
题目场景: 暂无
题目附件: 附件1

  • 下载附件1 得到一个二进制文件

<1>.ExeinfoPe查壳
在这里插入图片描述

<2>.有upx壳,使用upx -d 脱壳

C:\Users\XXX\Desktop\display2\IDA>upx -d simple-unpack
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2020
UPX 3.96w       Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
    912808 <-    352624   38.63%   linux/amd64   simple-unpack

Unpacked 1 file.

<3>.扔进IDA64:

在这里插入图片描述

  • 得到flag:
flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}

8.logmein

题目描述:菜鸡开始接触一些基本的算法逆向了
题目场景: 暂无
题目附件: 附件1

<1>.ExeinfoPe查壳
<2>.扔进IDA64

void __fastcall __noreturn main(int a1, char **a2, char **a3)
{
  size_t v3; // rsi
  int i; // [rsp+3Ch] [rbp-54h]
  char s[36]; // [rsp+40h] [rbp-50h] BYREF
  int v6; // [rsp+64h] [rbp-2Ch]
  __int64 v7; // [rsp+68h] [rbp-28h]
  char v8[28]; // [rsp+70h] [rbp-20h] BYREF
  int v9; // [rsp+8Ch] [rbp-4h]

  v9 = 0;
  strcpy(v8, ":\"AL_RT^L*.?+6/46");
  v7 = 0x65626D61726168LL;
  v6 = 7;
  printf("Welcome to the RC3 secure password guesser.\n");
  printf("To continue, you must enter the correct password.\n");
  printf("Enter your guess: ");
  __isoc99_scanf("%32s", s);
  v3 = strlen(s);
  if ( v3 < strlen(v8) )
    sub_4007C0();
  for ( i = 0; i < strlen(s); ++i )
  {
    if ( i >= strlen(v8) )
      sub_4007C0();
    if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
      sub_4007C0();
  }
  sub_4007F0();
}

<3>.以下部分来源:攻防世界 Reverse 新手练习区 1-12 全详解

分析

  • v7赋值,字符型是v7 = ‘ebmarah’;,需要注意的是,x86系列的CPU都是以小端序储存数据的,即低位字节存入低地址,高位字节存入高地址,所以正确的字符串应该反过来v7=‘harambe’;
  • v8赋值v8 = ‘:”AL_RT^L*.?+6/46’
  • v6为7
  • 输入的flag应该是v7[i%v6]^v8[i]

<4>.payload:

v7 = 'harambe'
v8 = ':\"AL_RT^L*.?+6/46'
flag = ''
for i in range(len(v8)):
    c = ord(v7[i % 7]) ^ ord(v8[i])
    flag += chr(c)
print(flag)
ord()描述:
以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。
例如,ord('a')返回整数97,ord('€')(欧元符号)返回8364。
这与chr()函数相反。

<5>. 得到flag:

RC3-2016-XORISGUD

9.no-strings-attached

题目描述:菜鸡听说有的程序运行就能拿Flag?
题目场景: 暂无
题目附件: 附件1

<1>.ExeinfoPe查壳
<2>.扔进IDA64

WP

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92699.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!