实验-修改邻接变量
书籍:0day安全-软件漏洞分析技术
操作系统:windows xp SP3
编译器:VC6


按照程序设计思路,只有正确输入了1234567
才会通过验证显示正确
我们生成exe程序以后,拖进IDA Pro查看一下

这里对照原C语言代码,可以看到main函数中验证环节调用sub_401005函数
切换到Ida View-A 反汇编窗口

这里看到调用sub_401005函数的地址为004010E6
回到OD调试

Ctrl+G跳转到地址004010E6调用处
F2(双击)下个断点

我们输入7个q看看效果

Strcmp函数,qqqqqqq大于1234567,所以返回1
我们看到OD中(q的ascii码为0x71)在q之后,有一个01
此时我们列一下栈帧的数据分布情况

注意区分,内存数据与数值数据
在调试环境中,内存是由低到高分布,这是Win32系统在内存中由低位向高位存储一个4字节的双字(DWORD)
但是作为数值时,却是由高位字节向低位字节进行解释
在调试环境中,内存数据中的DWORD和我们逻辑上使用的数值数据是按照字节逆序分布的
例如上图中的变量authenticated
其在内存中存储的是0x01000000,这个内存数据的双字会被计算机由高位向低位按照字节解释成数值数据:0x00000001
OD中显示的是数值数据,而不是原始的内存数据
所以从左到右的依次偏移量为3,2,1,0
我们输入八个q,然后rst看其覆盖authenticted的缓冲区

列一下此时的栈区分布图

(注意看覆盖前后的对比)
authenticted变量的值来源于strcmp函数的返回值,之后其会返回给main函数来做密码验证成功与否的标志,当authenticted为0时,表示验证成功
通过上面的测试,我们已经知道buffer[8]的边界后续数据会改写变量authenticted
字符串数据的最后都有NULL(0)作为结束标志
如果我们输入8个q,那么第九个字符(NULL)作为结束字符将写入内存0X0012FB20
的位置,正好改变了变量authenticted的值为0
输入后栈区数据分布如下:

成功绕过

上述是简单的一个溢出演示实验,接下来会进行修改函数返回地址的实验
技术有限,刚刚入门,如果有描述不对的地方见谅

浙公网安备 33010602011771号