zoukankan      html  css  js  c++  java
  • Hack You CTF 2014: NotEasyTask

    exe文件,运行后闪退,peid查一下,发现是是c#写的

    Reflector打开 找到Main:

    private static void Main(string[] args)
    {
        string hostname = "127.0.0.1";
        int port = 0x7a69;
        TcpClient client = new TcpClient();
        try
        {
            Console.WriteLine("Connecting...");
            client.Connect(hostname, port);
        }
        catch (Exception)
        {
            Console.WriteLine("Cannot connect!\nFail!");
            return;
        }
        Socket socket = client.Client;
        string str2 = "Super Secret Key";
        string text = read();
        socket.Send(Encoding.ASCII.GetBytes("CTF{"));
        foreach (char ch in str2)
        {
            socket.Send(Encoding.ASCII.GetBytes(search(ch, text)));
        }
        socket.Send(Encoding.ASCII.GetBytes("}"));
        socket.Close();
        client.Close();
        Console.WriteLine("Success!");
    }
    
     
    
     
     31337 0x7a69private static void Main(string[] args)
    {
        string hostname = "127.0.0.1";
        int port = 0x7a69;
        TcpClient client = new TcpClient();
        try
        {
            Console.WriteLine("Connecting...");
            client.Connect(hostname, port);
        }
        catch (Exception)
        {
            Console.WriteLine("Cannot connect!\nFail!");
            return;
        }
        Socket socket = client.Client;
        string str2 = "Super Secret Key";
        string text = read();
        socket.Send(Encoding.ASCII.GetBytes("CTF{"));
        foreach (char ch in str2)
        {
            socket.Send(Encoding.ASCII.GetBytes(search(ch, text)));
        }
        socket.Send(Encoding.ASCII.GetBytes("}"));
        socket.Close();
        client.Close();
        Console.WriteLine("Success!");
    }
    
     

    可以看出来 是通过31337( 0x7a69 )端口向127.0.0.1通信

    传输的内容是search()函数的返回值,原本我的想法是分析search函数

    private static string search(char x, string text)
    {
        int length = text.Length;
        for (int i = 0; i < length; i++)
        {
            if (x == text[i])
            {
                int num3 = (i * 0x539) % 0x100;
                return Convert.ToString(num3, 0x10).PadLeft(2, '0');
            }
        }
        return "??";
    }

    但是发现text这个字符串不知道,返回去寻找text:

    发现: string text = read();

    private static string read()
    {
        string[] strArray = Process.GetCurrentProcess().MainModule.FileName.Split(new char[] { '\\' });
        string path = strArray[strArray.Length - 1];
        using (StreamReader reader = new StreamReader(path))
        {
            return reader.ReadToEnd();
        }
    }

    但是对于这个read函数的定义我还是有搞不明白的地方,它定义了一个输入的数组,但是根据我贫弱的(等于0)C#语法知识还是看不明白

    但是!如果直接监听程序与本机的通讯过程不就好了吗!

    脚本送上(python3):

    import http.server
    
    server_address = ('127.0.0.1', 31337)
    handler_class = http.server.BaseHTTPRequestHandler
    httpd = http.server.HTTPServer(server_address, handler_class)
    httpd.serve_forever()

    BaseHTTPRequestHandler是继承SocketServer.StreamRequestHandler,对http连接的请求作出应答

    http_server.serve_forever()是循环监听请求的

    运行这个脚本后再运行exe文件就好了:

    emmmm好像是一段报错 但是不管怎么说flag还是出来了呀(逃)

  • 相关阅读:
    Java知识系统回顾整理01基础02面向对象03方法
    可插件化拓展改造器 slot-maven-plugin
    数据治理框架
    Java读写hdfs上的avro文件
    FTPClient的使用
    Java读写hdfs上的avro文件
    图片上传预览
    css hack 用法注意
    获取get请求后面的参数
    js全局变量污染
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/10646259.html
Copyright © 2011-2022 走看看