攻防世界
reverse

srm-50

拖入EXE,无壳,拖入32位IDA
WINMAIN(xxx)函数F5反汇编
双击跟进DialogFunc
strcpy(Source, “Registration Success!\nYour flag is:”)后的内容就是flag,快捷键R将数字转换成字符串
在这里插入图片描述
即CXZA9bd7mGq94gc8
按顺序排列后得到CZ9dmq4c8g9G7bAX,即为flag

Mysterious

拖入exe,无壳,拖入32位IDA
找到WinMain(x,x,x,x) F5反汇编
双击跟进_WinMain@16_0,跟进DialogFunc,进入sub_401090
找到well done 所在的基本块,条件是v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121,注意到在该基本块的开头调用了strcpy函数将flag 赋值给Text,同时下面也有一些对Text拼接字符串的操作,看起来这个Text保存的就是flag。
观察Text的赋值,除了v5,其它的都是已知的字符,需要解出v5的值。其中,v5是执行itoa函数以后得到的:_itoa(v10, &v5, 10); 。
因此,我们需要把v10解出来。v10等于多少呢?if条件里已经告诉我们了,等于123,因此flag为flag{123_Buff3r_0v3rf|0w}
补充:
此题想考察的应该是溢出
第25行中,读取用户输入保存到String,读取的最大长度为260字节,并且没有对String做长度校验,可能存在溢出的问题。

GetDlgItemTextA(hWnd, 1002, &String, 260);

然后对String进行了长度校验,必须要大于6才行。
接下来 v10 = atoi(&String) + 1; ,也就是用户输入是个数字的字符串,通过atoi转成数字以后再加一,将结果赋值给v10。因此输入的前三个字符应该为:”123”。
重头戏来了,还是这个if条件,对v10,v12,v13和v14进行了判断。

if ( v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121 )
{
    ...
}

string~v14在栈中的情况
在这里插入图片描述
String这三个字节填充的是122无疑,v12、v13、v14的ASCII值分别为120、121、122,即对应的字符为x、y、z
在这里插入图片描述
用户输入为122xyz
输出为flag{123_Buff3r_0v3rfl0w}
在这里插入图片描述

Guess-the-Number

附件加载后得到.jar解压后得到.class文件
学习发现需要一个叫jd-gui的软件打开
下载后用其打开可以查看汇编代码
在这里插入图片描述
分析if (my_number / 5 == guess_number) //我的数字除以5取整就是猜测的数字
1545686892 / 5取整得309137378
将guess_number的值修改为309137378,执行代码成功获得flag为a7b08c546302cc1fd2a4d48bf2bf2ddb。