XCTF-Reverse-ExerciseArea-004-writeup

0x00 介绍

本题是xctf攻防世界中Reverse的新手第四题。

这道题只给了code.c文件,我们需要分析该文件中代码的流程,解出flag。本题考查的主要是C语言的库函数

实验环境:Vscode

0x01 解题过程

直接打开C文件读代码即可

  1. 首先是一开始的参数数量判断,这里需要注意的是运行的时候,code.exe param1 param2 param3 中 code.exe为参数1。因此用户输入的参数数量应该为3个

  2. 第一个参数经过atoi()函数后是否与0xcafe相等

atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0。atoi我理解的是把数字形式的字符串转换成int类型,比如"123.45" -> 123

因此,输入的第一个参数必须为数字。把十六进制0xcafe转成十进制,为51966,当然也可以51966.xxx


unsigned int first = atoi(argv[1]);  // 数字形式的字符串转int
if (first != 0xcafe) {  // 十进制为:51966
    printf("you are wrong, sorry.\n");
    exit(2);
}

测试通过:
XCTF-Reverse-ExerciseArea-004-writeup_第1张图片
Tips: 可以先把判断参数数量和后面的参数判断的内容注释掉,添加参数1判断成功的提示信息

  1. 第二个参数经过atoi()函数后得到的整数必须同时都不满足以下两个条件
  • 条件1:second % 5 == 3
  • 条件2:second % 17 != 8

先从条件2开始看,second = 17 * n + 8 (n=0,1,2,3…), 即second = 8, 25, 42, …

结合条件1,second取24即可


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

测试通过:
XCTF-Reverse-ExerciseArea-004-writeup_第2张图片

  1. 考察strcmp函数的返回值,两个比较的字符串相同时返回0,不同时返回正数。

if的主体中,会调用exit()函数退出,因此if的条件判断结果必须为0,也就是参数3必须为"h4cky0u"


if (strcmp("h4cky0u", argv[3])) {  // strcmp,相同返回0,不同返回正数。 
    printf("so close, dude!\n");
    exit(4);
}

  1. 结合上面三个,拿到flag:c0ffee

XCTF-Reverse-ExerciseArea-004-writeup_第3张图片

你可能感兴趣的:(ctf)