zoukankan      html  css  js  c++  java
  • 攻防世界 reverse 进阶 easyre-153

    easyre-153

    查壳:

    upx壳 

    脱壳:

     1 int __cdecl main(int argc, const char **argv, const char **envp)
     2 {
     3   int pipedes[2]; // [esp+18h] [ebp-38h]
     4   __pid_t v5; // [esp+20h] [ebp-30h]
     5   int v6; // [esp+24h] [ebp-2Ch]
     6   char buf; // [esp+2Eh] [ebp-22h]
     7   unsigned int v8; // [esp+4Ch] [ebp-4h]
     8 
     9   v8 = __readgsdword(0x14u);
    10   pipe(pipedes);                                // pipe函数可用于创建一个管道,以实现进程间的通信。
    11                                                 // pipe函数的定义如下:
    12                                                 // #include<unistd.h>
    13                                                 // int pipe(int fd[2]);
    14                                                 //         pipe函数定义中的fd参数是一个大小为2的一个数组类型的指针。该函数成功时返回0,并将一对打开的文件描述符值填入fd参数指向的数组。失败时返回 -1并设置errno。
    15                                                 //         通过pipe函数创建的这两个文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出。并且 fd[1] 一端只能进行写操作,fd[0] 一端只能进行读操作,不能反过来使用。要实现双向数据传输,可以使用两个管道。
    16   v5 = fork();                                  //     1)在父进程中,fork返回新创建子进程的进程ID;
    17                                                 //     2)在子进程中,fork返回0;
    18                                                 //     3)如果出现错误,fork返回一个负值;
    19   if ( !v5 )                                    // 等于0,即在子进程中时
    20   {
    21     puts("
    OMG!!!! I forgot kid's id");
    22     write(pipedes[1], "69800876143568214356928753", 0x1Du);// 写入
    23     puts("Ready to exit     ");
    24     exit(0);
    25   }
    26   read(pipedes[0], &buf, 0x1Du);                // 读取
    27   __isoc99_scanf("%d", &v6);
    28   if ( v6 == v5 )
    29   {
    30     if ( (*(_DWORD *)((_BYTE *)lol + 3) & 0xFF) == 204 )
    31     {
    32       puts(":D");
    33       exit(1);
    34     }
    35     printf("
    You got the key
     ");             
    36     lol(&buf);                                  // 生成flag
    37   }
    38   wait(0);
    39   return 0;
    40 }

    查看lol(&buf)

     1 int __cdecl lol(_BYTE *a1)
     2 {
     3   char v2; // [esp+15h] [ebp-13h]
     4   char v3; // [esp+16h] [ebp-12h]
     5   char v4; // [esp+17h] [ebp-11h]
     6   char v5; // [esp+18h] [ebp-10h]
     7   char v6; // [esp+19h] [ebp-Fh]
     8   char v7; // [esp+1Ah] [ebp-Eh]
     9   char v8; // [esp+1Bh] [ebp-Dh]
    10 
    11   v2 = 2 * a1[1];
    12   v3 = a1[4] + a1[5];
    13   v4 = a1[8] + a1[9];
    14   v5 = 2 * a1[12];
    15   v6 = a1[18] + a1[17];
    16   v7 = a1[10] + a1[21];
    17   v8 = a1[9] + a1[25];
    18   return printf("flag_is_not_here");
    19 }

    wp:

     1 a1='69800876143568214356928753'
     2 a1=list(map(ord,a1))
     3 v2 = 2 * a1[1];
     4 v3 = a1[4] + a1[5];
     5 v4 = a1[8] + a1[9];
     6 v5 = 2 * a1[12];
     7 v6 = a1[18] + a1[17];
     8 v7 = a1[10] + a1[21];
     9 v8 = a1[9] + a1[25];
    10 
    11 # x=locals().items()
    12 # print(x)
    13 flag=''
    14 for i in range(2,9):
    15     flag+=chr(locals()['v'+str(i)])
    16 print(flag)

    rhelheg

    特娘的,提交需要加上RCTF{}

    RCTF{rhelheg}

  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/DirWang/p/11451783.html
Copyright © 2011-2022 走看看