当前位置:   article > 正文

攻防世界Reverse进阶区-srm-50-writeup_ida srm-50

ida srm-50

1. 介绍

本题是xctf攻防世界中Reverse的进阶区的题srm-50
题目来源: suctf-2016

2. 分析

运行一下:
在这里插入图片描述
查壳:
在这里插入图片描述
扔进IDA,strings windows里查找e-mail,找到一个字符串Your E-mail address in not valid. 在DialogFunc函数中被使用。

首先映入眼帘的是一个最外层的if判断,根据这行可以知道String是保存用户输入的email的。除了校验@. 以外没有其他特别的。

if ( strstr(&String, "@") && strstr(&String, ".") && strstr(&String, ".")[1] && strstr(&String, "@")[1] != '.' )
{
    ...
}
  • 1
  • 2
  • 3
  • 4

总得找找输入在哪里吧。往前看,发现GetDlgItemTextA函数,其实就是GetDlgItemText函数,原型为:int GetDlgItemText( HWND hDlg , int nID, LPTSTR lpStr, int nMaxCount) const; 。用来从文本框中读取文本的。因此,可以判断出v11保存了用户输入的serial number。

GetDlgItemTextA(hDlg, 1001, &String, 256);    // 获取用户输入的邮箱
GetDlgItemTextA(hDlg, 1002, v11, 256);        // 获取用户输入的serial number
  • 1
  • 2

往下看,主要是在内层的if判断中,检查用户输入的serial number,每个条件都必须不满足,为0,才能输出正确的结果。
很明显可以看到的是v11的长度必须16。
奇怪的是,还检查了v12v23的内容,并没有对这部分空间进行赋值的操作呀。想到v11和v12v23是连续的地址空间,往上看一下v11的定义,发现v11占4个字节,v12~v23只占1个字节。4+(23-12+1)*1=16 。刚刚好。

CHAR String; // [esp+8h] [ebp-340h]
CHAR v11[4]; // [esp+108h] [ebp-240h]
char v12; // [esp+10Ch] [ebp-23Ch]
char v13; // [esp+10Dh] [ebp-23Bh]
char v14; // [esp+10Eh] [ebp-23Ah]
char v15; // [esp+10Fh] [ebp-239h]
char v16; // [esp+110h] [ebp-238h]
char v17; // [esp+111h] [ebp-237h]
char v18; // [esp+112h] [ebp-236h]
char v19; // [esp+113h] [ebp-235h]
char v20; // [esp+114h] [ebp-234h]
char v21; // [esp+115h] [ebp-233h]
char v22; // [esp+116h] [ebp-232h]
char v23; // [esp+117h] [ebp-231h]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

再去看看读取v11的代码:GetDlgItemTextA(hDlg, 1002, v11, 256); ,发现是把整个v11都读进来,没有做长度校验。因此这里存在一个溢出的问题,即v11如果输入的是16个字节,那么刚好会覆盖到v23。

其中,v11有4个字节,其余的只有1个字节。读取serial number时,存在溢出。那么我们只要照着if条件给的内容,一个一个去推算,就能把正确的serial number计算出来了。

v11~v23在栈中的情况如下:

内存地址数据具体内容
ebp-231v23X
ebp-232v22A
ebp-233v21b
ebp-234v207
ebp-235v19G
ebp-236v189
ebp-237v17g
ebp-238v168
ebp-239v15c
ebp-23Av144
ebp-23Bv13q
ebp-23Cv12m
ebp-240v11CZ9d

在这里插入图片描述

可以看出serial number为:CZ9dmq4c8g9G7bAX ,输入程序测试一下吧~
在这里插入图片描述
因此最终的flag为:CZ9dmq4c8g9G7bAX

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/695008
推荐阅读
相关标签
  

闽ICP备14008679号