首先运行一下大概了解程序的流程:
首先是传入一个name
而后需要我们指出需要排序的数字个数
而后需要我们依次输入需要排序的数字
最后程序给出排序好的result
不过这里发现一个问题,有些名字后存在其他字符(类似乱码)
猜测这里应该是字符串00结尾没有处理好而泄露了名字后的部分数据
先记下这个问题
下面载入IDA分析:
可以看出这里:
下面:
输出"What your name :":
从输入流读入0x40长度(输入流结尾自动停止读入)的字节到esp+8Ch+buf处:
输出"Hello %s,How many numbers do you what to sort :":
使用scanf读入一个unsigned型数(所需排序个数):
接下来再调用scanf读入相应个数的unsigned并调用一个冒泡排序:sub_5662B931
最终输出结果
首先就是开始时候的name可以泄露栈内数据:
当我们输入:"aaaa"
程序输出:
看一下栈内数据:
可以看到buff内数据是aaaa+'\n',而后面没有对字符串结尾加上00进行截断,导致后面的FFBA4B00上的数据在换行之后也输出了,直到遇到FFBA4804处的"\x00"
测试代码:
当输入一个非法字符时,其可能会因输入流问题直接输出栈上数据:
在程序中测试:
我们输入前栈中v13(保存需要排序的数字)处的数据分布:
排序输出后:
可以看到我们这里输入"+"并不改变栈内数据,而是对其中的数据重新排序
首先使用chechsec看一下程序的保护机制:
可以看到全部开启
考虑到调试过程发现其加载了libc库以及:
这里我们可以利用ret2libc执行system("/bin/sh")来获取shell
我们需要:
利用题目给出的库文件:
所以:
找到了:
所以:
若要获取基地址,便要得到一个相对基地址偏移量固定的地址
而能泄露数据的只有name和最后的排序处
但排序处会直接结束进程
我们需要利用排序前的scanf来布置栈空间
所以这里只能利用name泄露buf后某个栈内地址
动态调试看一下name后的栈内数据:
可以看到第七和第八个数据都在libc中
接着调试后锁定第七个数据:
看一下这次载入libc的地址:
第七位地址的相对位移:
注意:这里的偏移地址是相对于本地的libc-2.23.so文件
看到这里的对应偏移位置是:
对应远程的libc文件的.got.plt的偏移地址为:
这里需要注意:
栈内数据写入后会被排序
所以我们要让排序后的栈内:
一般情况下这几个数便是从小到大排列(除非canary随机到很大)
所以我们:
不过当输入字符来利用name获得.got.plt地址时总是出错
调试后发现,这个地址末位总是00,造成了截断,所以需要多输入一位来使用换行符(chr(0xa))来覆盖这里(在后面计算地址的时候再减去0xa)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-2-2 13:59
被admin编辑
,原因: 图片本地化