晚上做几个简单的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. 操作系统原理之I/O设备管理(第六章上半部分下)

    五.I/O软件原理 输入输出软件的总体目标是将软件组织成一种层次结构 低层软件用来屏蔽硬件的具体细节 高层软件则主要是为用户提供一个简洁.规范的界面 设备管理的4个层次: 用户层软件 ->向系统 ...

  2. Ganglia环境搭建并监控Hadoop分布式集群

    简介 Ganglia可以监控分布式集群中硬件资源的使用情况,例如CPU,内存,网络等资源.通过Ganglia可以监控Hadoop集群在运行过程中对集群资源的调度,作为简单地运维参考. 环境搭建流程 1 ...

  3. Node.js之模块机制

    > 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...

  4. TestNG(五) 5-7 套件测试

    <?xml version="1.0" encoding="utf-8" ?> <suite name="test"> ...

  5. 001:photoshop教程

    1:添加辅助线:有个位移的坐标系图标:点击标志中,鼠标按着不动.之后拖动到对应的位置. 2:量距离:第一行.第二个图标.直接测量像素. 3:切割图片: 3.1:第三行.第一列:选择切片工具 3.2:之 ...

  6. spring boot 整合mybatis 的xml版本【包括逆向工程以及分页插件】

    逆向工程很方便,可以直接根据数据库和配置文件生成pojo,mapper接口和相应的映射文件. xml版本和全注解版本其实差不多,大部分情况下,都会保留xml文件方便其他人去扩展新的dml方法. 文章旨 ...

  7. 【pymongo.errors】Cursor not found

    pymongo.errors.CursorNotFound: Cursor not found 故事背景:先从数据库中取得所有数据 db['test'].find(),然后对结果进行for循环,但是当 ...

  8. SqlServer Left、Right、CharIndex函数

    LEFT 函数:返回字符串中从左边开始指定个数字符 RIGT.H 函数:返回字符串从右边开始指定个数字符 len函数:LEN 函数返回文本字段中值的长度. CHARINDEX函数:CHARINDEX ...

  9. C++ 函数模板用法

    泛型编程概念:不考虑具体数据类型的编程方式: 函数模板: 1.提供一种特殊的函数可用不同类型进行调用: 2.与普通函数很相似,区别是类型可被参数化: template <typename T&g ...

  10. org.hibernate.AnnotationException: No identifier specified for entity 错误解决

    主键对应的属性上加上@Id注解,对应javax.persistence.Id @Id private Long id;