zoukankan      html  css  js  c++  java
  • CTF实验吧——证明自己吧

    题目地址:http://www.shiyanbar.com/ctf/28

    没有壳 ,vc++ 写的

    拖进OD观察观察,发现代码很短哟,先来看这俩个call 怀疑他们其中有正确的flag和我们输入的东西对比

    强行爆破完寄存器里是没有正确的flag出现的,肯定是在某个函数里算出来的。

    再进IDA里 main 空格,发现 关键函数就是sub_401060

    双击进入查看sub_401060的伪C代码

    分成三个部分:

    第一,将我们输入的a1与v5的长度比较,将a1的每一项都进行异或。

    第二,将v5的每一项都减去5

    第三,可以当成这样看, while(   *(a1 + v3) == *(_BYTE *)&V5+V3)    ) 就是把我们输入的a1与v5逐个比较

    关系就是 :  a1 ^ 0x20 = v5 - 5 

    根据异或的性质 我们要得到的a1 =(v5-5)^0x20 

    ps:这里的if(strlen((const char *)v5)==0)return 1;判断v5元素为0个就返回1,没啥用。有点迷惑,不管他。

    v5的数据可以根据地址去寻找,v5=dword_40708C ,这里用OD比较方便 ctrl+G,因为V5是字符串,所以指向的是该字符串的首地址,则V5为 68 57 19 48 50 6e 58 78 54 6a19 58 5e 06(都为十六进制)

    拿下来,用python或者C语言写脚本即可解得答案。

    python:

    a=" "
    code=(0x68,0x57,0x19,0x48,0x50,0x6E,0x58,0x78,0x54,0x6A,0x19,0x58,0x5E,0x06)
    for i in code:
        i=(i-5)^0x20
        a+=chr(i)
    print(a)
    

     C:

    #include<stdio.h>
    int main()
    {
    int a[14]={0x68,0x57,0x19,0x48,0x50,0x6e,0x58,0x78,0x54,0x6a,0x19,0x58,0x5e,0x06};
    int i;
    for(i=0;i<14;i++)
    {
    a[i]=a[i]-5;
    a[i]=a[i]^0x20;
    printf("%c",a[i]);
    }
    return 0;
    }

    验证一下,对的

  • 相关阅读:
    IT人士必去的10个网站
    c++怎样让函数返回数组
    vs中“Stack around the variable was corrupted”的解决方案
    c++ eof()函数
    bat开发小工具以及使用
    Python接口自动化(一)---json数据类型取值
    MAVEN编译错误解决:maven only whitespace content allowed before start
    shell常用命令总结总结
    shell打包和解压
    java总结笔记
  • 原文地址:https://www.cnblogs.com/tqing/p/11494705.html
Copyright © 2011-2022 走看看