CTF-----RE新手练习(一)

学习打卡篇七


**

IDA

**
IDA是一款交互式反汇编工具,亦是是典型的递归下降反汇编器,是逆向学习的必备工具之一,IDA全称为Interactive Disassembler Professional。

官方下载地址

IDA常用快捷键:

  1. 空格键:切换文本视图与图表视图
  2. ESC:返回上一个操作地址
  3. G:搜索地址和符号
  4. N:对符号,或变量进行重命名
  5. 分号键:在反汇编后的界面中写下注释
  6. Alt+M:添加标签
  7. Ctrl+M:查看标签
  8. Ctrl+S:查看段的信息
  9. 代码数据切换 C–>代码/D–>数据/A–>ascii字符串/U–> 解析成未定义的内容
  10. X:查看交叉应用
  11. F5:查看伪代码 (在该窗口界面:右键 edit comment-----注释伪c代码。 copy to assembly-----把伪c代码复制到反汇编窗口的汇编代码。)
  12. Alt+T:搜索文本
  13. Alt+B:搜索十六进制

攻防世界

1.Hello, CTF

题目描述:菜鸡发现Flag似乎并不一定是明文比较的

CTF-----RE新手练习(一)_第1张图片题目附件如上图所示。
那我们先随便输入东西进去看看是什么效果
CTF-----RE新手练习(一)_第2张图片
提示“wrong"那我们就把它直接拖入IDA中看看
CTF-----RE新手练习(一)_第3张图片
直接“F5"查看伪代码
CTF-----RE新手练习(一)_第4张图片
分析这段伪代码,其中第31行的意思是:sprintf(&v8,"%x",v4)把v4的值的16进制发到v8。第32行的意思是把v10和v8连接并写入v10中。然后我们直接看“success”部分,分析得:只有当v10=v13 的时候才会输出“success”,并且长度不能大于17,而这时v13=“437261636b4d654a757374466f7246756e”长度远远大于17,所以说正确的serial是把其转为字符串时的值,通过判断我们知道这串数字是16进制的。
CTF-----RE新手练习(一)_第5张图片上述字符串即使flag!


2.open-source

题目描述:菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码

int main(int argc, char *argv[]) {
    if (argc != 4) {
    	printf("what?\n");
    	exit(1);
    }

    unsigned int first = atoi(argv[1]);
    if (first != 0xcafe) {
    	printf("you are wrong, sorry.\n");
    	exit(2);
    }

    unsigned int second = atoi(argv[2]);
    if (second % 5 == 3 || second % 17 != 8) {
    	printf("ha, you won't get it!\n");
    	exit(3);
    }

    if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");
    	exit(4);
    }

    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

    printf("Get your key: ");
    printf("%x\n", hash);
    return 0;
}

题目附件内容如上图所示。
通过分析代码可知,想要得到flag必须先求出first,second,argv[3]的值;
接下来我们逐个分析:
first:只有当first=0xcafe 的时候程序才会跳过printf 执行下面的语句;

second:要不满足上述条件的数字有很多我们先选第一个数字就是25(如果不对后面再做更改);

argv[3]:很容易我们可以看出argv[3]=“h4cky0u”

分析完后句可以先一段代码来执行求出值了;

#include 
#include 

int main(int argc, char *argv[]) {
    

    unsigned int first = 0xcafe;
    
    unsigned int second = 25;
    
    
    argv[3]="h4cky0u";

    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

    printf("Get your key: ");
    printf("%x\n", hash);
    return 0;
}

运行结果
CTF-----RE新手练习(一)_第6张图片把“c0ffee”带入试试
CTF-----RE新手练习(一)_第7张图片success!

结尾

今天的学习就到这了!

你可能感兴趣的:(CTF)