晚上做几个简单的ctf逆向睡的更好

logmein

elf文件 ida看看main函数伪代码

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

  v9 = ;
  strcpy(v8, ":\"AL_RT^L*.?+6/46");
  v7 = 28537194573619560LL;
  v6 = ;
  printf("Welcome to the RC3 secure password guesser.\n", a2, a3);
  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(v8);
  ; i < strlen(s); ++i )
  {
    if ( i >= strlen(v8) )
      ((void (*)(void))sub_4007C0)();
    if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
      ((void (*)(void))sub_4007C0)();
  }
  sub_4007F0();
}

这里要看懂他的算法:

看到19行sacnf接收输入  然后v3为输入的长度v3 < strlen(v8)调用sub_4007C0函数传入v8

sub_4007C0:

接着看sub_4007F0

函数看完 26行左右就是flag的行

输入的字符要等于  经过处理的v7和v8的异或。

v7 int64  v7要转换为16进制然后在转换为字符串,而且字符是小端序,所以把得到的字符翻转然后和v8的每一位进行异或。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BYTE unsigned char

int main(int argc, char* argv[]) {
    unsigned int i;
    ] = ":\"AL_RT^L*.?+6/46";
    __int64 v7 = ;
    ;

    ] = "";
    ; i < strlen(v8); ++i) {
        s[i] = (char)(*((BYTE*)&v7 + i % v6)^v8[i]);
    }

    printf("%s\n", s);

    system("PAUSE");
    ;
}

re1

F5看看伪代码

将用户输入的flag存入v9,然后将v9和v5比较,如果值相同输出aFlag
既然需要比较flag,那正确的flag应该已经作为一个常量保存在程序内部,可以尝试直接查找flag

ida查看程序的字符串  有时候ida会把字符串当数据 所以这里直接查看hex view

game

看看有没得壳

打开程序,是一个小游戏,直接输入12345678就能直接拿到flag

在函数中搜索main

看main_0()

    void __cdecl main_0()
    {
      signed int i; // [esp+DCh] [ebp-20h]
      int v1; // [esp+F4h] [ebp-8h]

      sub_13FA7BE(&unk_14AB110);
      sub_13FA7BE(&unk_14AB158);
      sub_13FA7BE(&unk_14AB1A0);
      sub_13FA7BE(&unk_14AB1E8);
      sub_13FA7BE(&unk_14AB230);
      sub_13FA7BE(&unk_14AB278);
      sub_13FA7BE(&unk_14AB2C0);
      sub_13FA7BE(&unk_14AB308);
      sub_13FA7BE(&unk_14AAFD0);
      sub_13FA7BE("|              by 0x61                                 |\n");
      sub_13FA7BE("|                                                      |\n");
      sub_13FA7BE("|------------------------------------------------------|\n");
      sub_13FA7BE(
        "Play a game\n"
        "The n is the serial number of the lamp,and m is the state of the lamp\n"
        "If m of the Nth lamp is 1,it's on ,if not it's off\n"
        "At first all the lights were closed\n");
      sub_13FA7BE("Now you can input n to change its state\n");
      sub_13FA7BE(
        "But you should pay attention to one thing,if you change the state of the Nth lamp,the state of (N-1)th and (N+1)th w"
        "ill be changed too\n");
      sub_13FA7BE("When all lamps are on,flag will appear\n");
      sub_13FA7BE("Now,input n \n");
       )
      {
         )
        {
          sub_13FA7BE("input n,n(1-8)\n");
          sub_13F9418();
          sub_13FA7BE("n=");
          sub_13F96D4("%d", &v1);
          sub_13FA7BE("\n");
           && v1 <=  )
            break;
          sub_13FA7BE("sorry,n error,try again\n");
        }
        if ( v1 )
        {
          sub_13F76D6(v1 - );
        }
        else
        {
          ; i < ; ++i )
          {
             )
              j____report_rangecheckfailure();
            byte_14D2E28[i] = ;
          }
        }
        j__system("CLS");
        sub_13F8054();
        ] ==
          && byte_14D2E28[] ==
          && byte_14D2E28[] ==
          && byte_14D2E28[] ==
          && byte_14D2E28[] ==
          && byte_14D2E28[] ==
          && byte_14D2E28[] ==
          && byte_14D2E28[] ==  )
        {
          sub_13F7AB4();
        }
      }
    }

发现最后跳转的sub_13F7AB4()的函数可能有东西 跟进

int sub_457AB4(void)
{
  return sub_45E940();
}

再跟进sub_45E940()

    int sub_13FE940()
    {
      signed int i; // [esp+D0h] [ebp-94h]
      char v2; // [esp+DCh] [ebp-88h]
      char v3; // [esp+DDh] [ebp-87h]
      char v4; // [esp+DEh] [ebp-86h]
      char v5; // [esp+DFh] [ebp-85h]
      char v6; // [esp+E0h] [ebp-84h]
      char v7; // [esp+E1h] [ebp-83h]
      char v8; // [esp+E2h] [ebp-82h]
      char v9; // [esp+E3h] [ebp-81h]
      char v10; // [esp+E4h] [ebp-80h]
      char v11; // [esp+E5h] [ebp-7Fh]
      char v12; // [esp+E6h] [ebp-7Eh]
      char v13; // [esp+E7h] [ebp-7Dh]
      char v14; // [esp+E8h] [ebp-7Ch]
      char v15; // [esp+E9h] [ebp-7Bh]
      char v16; // [esp+EAh] [ebp-7Ah]
      char v17; // [esp+EBh] [ebp-79h]
      char v18; // [esp+ECh] [ebp-78h]
      char v19; // [esp+EDh] [ebp-77h]
      char v20; // [esp+EEh] [ebp-76h]
      char v21; // [esp+EFh] [ebp-75h]
      char v22; // [esp+F0h] [ebp-74h]
      char v23; // [esp+F1h] [ebp-73h]
      char v24; // [esp+F2h] [ebp-72h]
      char v25; // [esp+F3h] [ebp-71h]
      char v26; // [esp+F4h] [ebp-70h]
      char v27; // [esp+F5h] [ebp-6Fh]
      char v28; // [esp+F6h] [ebp-6Eh]
      char v29; // [esp+F7h] [ebp-6Dh]
      char v30; // [esp+F8h] [ebp-6Ch]
      char v31; // [esp+F9h] [ebp-6Bh]
      char v32; // [esp+FAh] [ebp-6Ah]
      char v33; // [esp+FBh] [ebp-69h]
      char v34; // [esp+FCh] [ebp-68h]
      char v35; // [esp+FDh] [ebp-67h]
      char v36; // [esp+FEh] [ebp-66h]
      char v37; // [esp+FFh] [ebp-65h]
      char v38; // [esp+100h] [ebp-64h]
      char v39; // [esp+101h] [ebp-63h]
      char v40; // [esp+102h] [ebp-62h]
      char v41; // [esp+103h] [ebp-61h]
      char v42; // [esp+104h] [ebp-60h]
      char v43; // [esp+105h] [ebp-5Fh]
      char v44; // [esp+106h] [ebp-5Eh]
      char v45; // [esp+107h] [ebp-5Dh]
      char v46; // [esp+108h] [ebp-5Ch]
      char v47; // [esp+109h] [ebp-5Bh]
      char v48; // [esp+10Ah] [ebp-5Ah]
      char v49; // [esp+10Bh] [ebp-59h]
      char v50; // [esp+10Ch] [ebp-58h]
      char v51; // [esp+10Dh] [ebp-57h]
      char v52; // [esp+10Eh] [ebp-56h]
      char v53; // [esp+10Fh] [ebp-55h]
      char v54; // [esp+110h] [ebp-54h]
      char v55; // [esp+111h] [ebp-53h]
      char v56; // [esp+112h] [ebp-52h]
      char v57; // [esp+113h] [ebp-51h]
      char v58; // [esp+114h] [ebp-50h]
      char v59; // [esp+120h] [ebp-44h]
      char v60; // [esp+121h] [ebp-43h]
      char v61; // [esp+122h] [ebp-42h]
      char v62; // [esp+123h] [ebp-41h]
      char v63; // [esp+124h] [ebp-40h]
      char v64; // [esp+125h] [ebp-3Fh]
      char v65; // [esp+126h] [ebp-3Eh]
      char v66; // [esp+127h] [ebp-3Dh]
      char v67; // [esp+128h] [ebp-3Ch]
      char v68; // [esp+129h] [ebp-3Bh]
      char v69; // [esp+12Ah] [ebp-3Ah]
      char v70; // [esp+12Bh] [ebp-39h]
      char v71; // [esp+12Ch] [ebp-38h]
      char v72; // [esp+12Dh] [ebp-37h]
      char v73; // [esp+12Eh] [ebp-36h]
      char v74; // [esp+12Fh] [ebp-35h]
      char v75; // [esp+130h] [ebp-34h]
      char v76; // [esp+131h] [ebp-33h]
      char v77; // [esp+132h] [ebp-32h]
      char v78; // [esp+133h] [ebp-31h]
      char v79; // [esp+134h] [ebp-30h]
      char v80; // [esp+135h] [ebp-2Fh]
      char v81; // [esp+136h] [ebp-2Eh]
      char v82; // [esp+137h] [ebp-2Dh]
      char v83; // [esp+138h] [ebp-2Ch]
      char v84; // [esp+139h] [ebp-2Bh]
      char v85; // [esp+13Ah] [ebp-2Ah]
      char v86; // [esp+13Bh] [ebp-29h]
      char v87; // [esp+13Ch] [ebp-28h]
      char v88; // [esp+13Dh] [ebp-27h]
      char v89; // [esp+13Eh] [ebp-26h]
      char v90; // [esp+13Fh] [ebp-25h]
      char v91; // [esp+140h] [ebp-24h]
      char v92; // [esp+141h] [ebp-23h]
      char v93; // [esp+142h] [ebp-22h]
      char v94; // [esp+143h] [ebp-21h]
      char v95; // [esp+144h] [ebp-20h]
      char v96; // [esp+145h] [ebp-1Fh]
      char v97; // [esp+146h] [ebp-1Eh]
      char v98; // [esp+147h] [ebp-1Dh]
      char v99; // [esp+148h] [ebp-1Ch]
      char v100; // [esp+149h] [ebp-1Bh]
      char v101; // [esp+14Ah] [ebp-1Ah]
      char v102; // [esp+14Bh] [ebp-19h]
      char v103; // [esp+14Ch] [ebp-18h]
      char v104; // [esp+14Dh] [ebp-17h]
      char v105; // [esp+14Eh] [ebp-16h]
      char v106; // [esp+14Fh] [ebp-15h]
      char v107; // [esp+150h] [ebp-14h]
      char v108; // [esp+151h] [ebp-13h]
      char v109; // [esp+152h] [ebp-12h]
      char v110; // [esp+153h] [ebp-11h]
      char v111; // [esp+154h] [ebp-10h]
      char v112; // [esp+155h] [ebp-Fh]
      char v113; // [esp+156h] [ebp-Eh]
      char v114; // [esp+157h] [ebp-Dh]
      char v115; // [esp+158h] [ebp-Ch]

      sub_13FA7BE("done!!! the flag is ");
      v59 = ;
      v60 = ;
      v61 = ;
      v62 = ;
      v63 = ;
      v64 = ;
      v65 = ;
      v66 = ;
      v67 = ;
      v68 = ;
      v69 = ;
      v70 = ;
      v71 = ;
      v72 = ;
      v73 = ;
      v74 = ;
      v75 = ;
      v76 = ;
      v77 = ;
      v78 = ;
      v79 = ;
      v80 = ;
      v81 = ;
      v82 = ;
      v83 = ;
      v84 = ;
      v85 = ;
      v86 = ;
      v87 = ;
      v88 = ;
      v89 = ;
      v90 = ;
      v91 = ;
      v92 = ;
      v93 = ;
      v94 = ;
      v95 = ;
      v96 = ;
      v97 = ;
      v98 = ;
      v99 = ;
      v100 = ;
      v101 = ;
      v102 = ;
      v103 = ;
      v104 = ;
      v105 = ;
      v106 = ;
      v107 = ;
      v108 = ;
      v109 = ;
      v110 = ;
      v111 = ;
      v112 = ;
      v113 = ;
      v114 = ;
      v115 = ;
      v2 = ;
      v3 = ;
      v4 = ;
      v5 = ;
      v6 = ;
      v7 = ;
      v8 = ;
      v9 = ;
      v10 = ;
      v11 = ;
      v12 = ;
      v13 = ;
      v14 = ;
      v15 = ;
      v16 = ;
      v17 = ;
      v18 = ;
      v19 = ;
      v20 = ;
      v21 = ;
      v22 = ;
      v23 = ;
      v24 = ;
      v25 = ;
      v26 = ;
      v27 = ;
      v28 = ;
      v29 = ;
      v30 = ;
      v31 = ;
      v32 = ;
      v33 = ;
      v34 = ;
      v35 = ;
      v36 = ;
      v37 = ;
      v38 = ;
      v39 = ;
      v40 = ;
      v41 = ;
      v42 = ;
      v43 = ;
      v44 = ;
      v45 = ;
      v46 = ;
      v47 = ;
      v48 = ;
      v49 = ;
      v50 = ;
      v51 = ;
      v52 = ;
      v53 = ;
      v54 = ;
      v55 = ;
      v56 = ;
      v57 = ;
      v58 = ;
      ; i < ; ++i )
      {
        *(&v2 + i) ^= *(&v59 + i);
        *(&v2 + i) ^= 0x13u;
      }
      return sub_13FA7BE("%s\n");
    }

这应该就是打印flag的函数了  这个两个57字节的变量进行循环打印异或 写个脚本 有点麻烦静态分析出来的

    a=[,,,,,,,,,,,,,,,,,,,,,,
       ,,,,,,,,,,,,,,,,,,,,,,,
       ,,,,,,,,,,,]
    b=[,,,,,,,,,,,,,,,,
       ,,,,,,,,,,,,,,,,,
       ,,,,,,,,,,,,,,,,,,
       ,,,,,]
    i=
    c=''
    ):
        a[i]^=b[i]
        a[i]^=
        c=c+chr(a[i])
        i=i+
    print (c)

Hello, CTF

打开 发现是输入然后比对

看看main函数

strcpy把那串字符串复制给v13地址

第36~39行代码是判断输入字符串和right serial是否匹配

将初始化v13的十六进制转换为字符串即可。

open-source

直接给的源码

第29行计算flag,第32行代码输出十六进制形式

    printf("Brr wrrr grr\n");

    unsigned  + (second % ) *  + strlen(argv[]) - ;

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

然后看看我们需要满足的条件

) {
        printf("what?\n");
        exit();
    }

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

    unsigned ]);
     ==  || second %  != ) {
        printf("ha, you won't get it!\n");
        exit();
    }

    ])) {
        printf("so close, dude!\n");
        exit();
    }

first=0xcafe

second = 25

argv[3]=“h4cky0u”

ok  写个c++打印下flag

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {

    int first = 0xcafe;
    ;
    argv[] = "h4cky0u";

    printf("Brr wrrr grr\n");

    unsigned  + (second % ) *  + strlen(argv[]) - ;

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

    system("PAUSE");
    ;
}

simple-unpack

查壳

elf格式文件  upx壳

首先ida查看字符串直接可以找到

当然也可以

直接kali upx脱壳

打开脱壳后的 main函数

攻防世界(XCTF)逆向部分write up(一)的更多相关文章

  1. 攻防世界(XCTF)WEB(进阶区)write up(三)

    挑着做一些好玩的ctf题 FlatScience web2 unserialize3upload1wtf.sh-150ics-04web i-got-id-200 FlatScience 扫出来的lo ...

  2. 攻防世界(XCTF)WEB(进阶区)write up(四)

    ics-07  Web_php_include  Zhuanxv Web_python_template_injection ics-07 题前半部分是php弱类型 这段说当传入的id值浮点值不能为1 ...

  3. 攻防世界(XCTF)WEB(进阶区)write up(一)

      cat ics-05 ics-06 lottery Cat XCTF 4th-WHCTF-2017 输入域名  输入普通域名无果  输入127.0.0.1返回了ping码的结果 有可能是命令执行 ...

  4. 攻防世界(XCTF)WEB(进阶区)write up(二)

    国庆就要莫得了   起床刷几道 NewsCenter mfw Training-WWW-Robots NaNNaNNaNNaN-Batman bug NewsCenter search传参那里发现有注 ...

  5. 攻防世界逆向——game

    攻防世界逆向:game wp 攻防世界逆向新手区的一道题目. 是一道windows的creak,动态调试打开是这样的: 题目说明是让屏幕上所有的图像都亮之后,会出现flag,看来应该是可以玩出来的. ...

  6. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  7. XCTF攻防世界web进阶练习—mfw

    XCTF攻防世界web进阶练习-mfw题目为mfw,没有任何提示.直接打开题目,是一个网站 大概浏览一下其中的内容,看到其中url变化其实只是get的参数的变化查看它的源码,看到有一个?page=fl ...

  8. 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...

  9. 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...

随机推荐

  1. change,Ringo题目

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Redis小白入门系列

    一.从NoSQL说起 NoSQL 是 Not only SQL 的缩写,大意为"不只是SQL",说明这项技术是传统关系型数据库的补充而非替代.在整个NoSQL技术栈中 MemCac ...

  3. react navigation goBack()返回到任意页面(不集成redux) 二

    实现思路: A -- > B (获取A的key值,传至C)-- >C(获取B传来的A页面key值,传至D) -- >D(获取C传来的A页面key值&C页面的key值,传至下一 ...

  4. Spring Boot 入门之整合 log4jdbc 篇(六)

    博客地址:http://www.moonxy.com 一.前言 Spring Data JPA 默认采用 Hibernate 实现.Hibernate 的 showSql 配置只打印 SQL,但并不打 ...

  5. 理解setState

    近来在学习react源码, 最初是直接从入口一行一行的看, 结果跟着调用的函数跳转来跳去头都晕了. 后来决定带着一个目的去看源码, 每次看只研究一个东西. 一开始最想了解的就是充满魔性的setStat ...

  6. 将字符串转换成json格式

    1.引入json依赖,在pom.xml文件里添加如下内容 <!--Json array start --> <dependency> <groupId>common ...

  7. golang1.13中重要的新特新

    本文索引 语言变化 数字字面量 越界索引报错的完善 工具链改进 GOPROXY GOSUMDB GOPRIVATE 标准库的新功能 判断变量是否为0值 错误处理的革新 Unwrap Is As gol ...

  8. 记一次Burp Suite的使用实例

       下载完的Bur是这样的,双击jar即可 最右边的键一直按,傻瓜式         先将要抓包的网页打开,此次以上传图片为例     第一步当然是先下载Burp Suite之后打开,查看设置代理地 ...

  9. Linux 部署vsftp服务及详解

    一.FTP服务概述: FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transf ...

  10. springboot 获取Resource目录下的文件

    如图,获取user.png: 代码实现: //文件路径,此处static前不能加/,否则解析不到try { //此处的static前不能加/!!! file = ResourceUtils.getFi ...