• BUUCTF-RE-[SUCTF2019]SignIn


    分析

    __int64 __fastcall main(__int64 a1, char **a2, char **a3)
    {
      char v4; // [rsp+0h] [rbp-4A0h]
      char v5; // [rsp+10h] [rbp-490h]
      char v6; // [rsp+20h] [rbp-480h]
      char v7; // [rsp+30h] [rbp-470h]
      char v8; // [rsp+40h] [rbp-460h]
      char v9; // [rsp+B0h] [rbp-3F0h]
      unsigned __int64 v10; // [rsp+498h] [rbp-8h]
    
      v10 = __readfsqword(0x28u);
      puts("[sign in]");
      printf("[input your flag]: ", a2);
      __isoc99_scanf((__int64)"%99s", (__int64)&v8);
      sub_96A(&v8, (__int64)&v9);                         
      __gmpz_init_set_str((__int64)&v7, (__int64)"ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35", 16LL);
      __gmpz_init_set_str((__int64)&v6, (__int64)&v9, 16LL);
      __gmpz_init_set_str(
        (__int64)&v4,        
        (__int64)"103461035900816914121390101299049044413950405173712170434161686539878160984549",
        10LL);              
      __gmpz_init_set_str((__int64)&v5, (__int64)"65537", 10LL);
      __gmpz_powm(&v6, &v6, &v5, &v4);//rop = base^exp取余mod  v6=v6^v5 mod v4
      if ( (unsigned int)__gmpz_cmp((__int64)&v6, (__int64)&v7) )  //这里是v6和v7对比
        puts("GG!");
      else
        puts("TTTTTTTTTTql!");
      return 0LL;
    }
    

    没有更多信息了。iui
    这里程序用了 __gmpz_init_set_str 函数,查一查知道这是一个 GNU 高精度算法库官方文档
    程序中有用到的两个:

    int mpz_init_set_str (mpz_t rop, const char *str, int base) [Function]
    Initialize rop and set its value like mpz_set_str
    mpz_t rop:多精度整数变量
    char *str: 字符串
    int base: 进制
    将str按照base进制转换为rop
    
    void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) [Function]
    Set rop to base^exp mod mod. 
    rop = base^exp取余mod
    

    看到这个 过程rop = base^exp取余mod 就很容易联想到RSA RSA相关知识补充
    对应的就是c=m^e(mod n) v6=v6^v5 mod v4
    v7=c=ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
    v4=n=103461035900816914121390101299049044413950405173712170434161686539878160984549
    v5=e=65537
    有n先求p、q

    工具
    p:282164587459512124844245113950593348271
    q:366669102002966856876605669837014229419
    e:65537
    n:103461035900816914121390101299049044413950405173712170434161686539878160984549
    这样子就齐活了能求了=v=

    解题脚本

    import gmpy2
    import binascii
    
    n = int("103461035900816914121390101299049044413950405173712170434161686539878160984549")
    # p 和 q通过在线网站http://factordb.com/index.php分解
    p = gmpy2.mpz(282164587459512124844245113950593348271)
    q = gmpy2.mpz(366669102002966856876605669837014229419)
    e = gmpy2.mpz(65537)
    phi_n = (p-1)*(q-1)
    d = gmpy2.invert(e, phi_n)
    c = gmpy2.mpz(0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35)
    
    m = gmpy2.powmod(c, d, n)
    print("十进制:
    %s"%m)
    m_hex = hex(m)[2:]
    print("十六进制:
    %s"%(m_hex,))
    print("ascii:
    %s"%(binascii.a2b_hex(m_hex).decode(encoding="utf8")))
    

    suctf{Pwn_@_hundred_years}

  • 相关阅读:
    c# PrintDocument 设置自定义纸张大小的示例
    C#获取本地打印机列表,并将指定打印机设置为默认打印机
    水晶报表自定义纸张大小打印 (Crystal Report Print with custom paper size)
    c#打印机设置,取得打印机列表及相应打印机的所有纸张格式
    在C#中设置打印机纸张大小
    打印grid
    获取List集合中最大值的方法
    mysql使用索引优化查询效率
    mysql数据库中标的key的含义
    mysql数据库添加索引优化查询效率
  • 原文地址:https://www.cnblogs.com/Nickyl07/p/13345959.html
Copyright © 2020-2023  润新知