查壳
IDA
进入关键函数:
可以直接看到flag字符串的生成过程,就是不断给text添加后缀。其中只有source没有给出。而source经过了itoa和atoi以及判断等变化,应该是解题关键。
atoi&itoa
atoi()函数
atoi()原型: int atoi(const char *str );
函数功能:把字符串转换成整型数。
参数str:要进行转换的字符串
返回值:每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。
itoa()函数
itoa()原型: char *itoa( int value, char *string,int radix);
原型说明:
输入参数:
value:要转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等,范围必须在 2-36。
解题
way1:
本题的关键点在source值,而source是value值整型转字符串,value=v4+1。
根据题目中的v4判断可知v4为122,则flag直出。
way2:
在判断输入的地方给了 v4 string[3] string[5] string[4]的值,其中v4是atoi string转的整型,按照经验照顺序拼起来输入“122xyz” 即可弹出flag
flag
flag{123_Buff3r_0v3rf|0w}
坑
关于way2输入的字符串,122xyz是按照做题经验猜出来的,但实际看伪代码,可以发现v4是atoi string得到的整型,但string输入的是122xyz,转换成字符串应该是122xyz全部转换,实际只有122从字符型转成整型。
在atoi下断点调试后发现,输入纯字母字符串全部不识别,返回0;输入纯数字能够正常识别,返回整型数字;输入字母+数字,返回0;输入数字+字母,返回整型数字部分。
下图为输入122xyz后,atoi返回的整型值:
填坑:这里是atoi函数性质使然。其特性和上述动调表现一致,附测试代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
char arr1[]="122";
char arr2[]="xyz";
char arr3[]="122xyz";
int arr11=atoi(arr1);
int arr22=atoi(arr2);
int arr33=atoi(arr3);
cout<<arr11<<endl;
cout<<arr22<<endl;
cout<<arr33<<endl;
cout<<atoi(arr3)<<endl;
return 0;
}