使用免费工具进行逆向和利用:第19部分

admin 2022年4月15日10:42:30使用免费工具进行逆向和利用:第19部分已关闭评论34 views字数 3012阅读10分2秒阅读模式

原作者:Ricardo Narvaja

翻译作者:梦幻的彼岸

更新日期:2022年1月21日


我们将开始研究静态逆向中的一个重要课题,即对结构的处理。

事实上,我已经用IDA PRO工作了多年,我知道如何在上面工作,用IDA FREE也差不多,在写这篇文章的时候,我仍然不知道他们如何处理Radare和Ghidra结构,但我们会发现并在这些教程中写出来。

在用结构解决练习之前,我们要做的第一件事是先修改一个没有结构的旧练习,然后加入结构,看看它在低层上有什么不同。

https://drive.google.com/file/d/10p5i8gDHLUgz9Xag_1XadpHBCyNAPisB/view?usp=sharing

password =a

我们将做一个快速的静态逆向,以了解与另一个版本的区别,这是我们关心的一个版本,你可以通过完成解决方案来练习。

里面是可执行文件以及符号和源代码

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

我们在源代码中看到,有一些全局变量是在main之前声明的,我们也看到main局部变量

使用免费工具进行逆向和利用:第19部分

我们将使用这些符号,因为我们的想法是理解它,在未来的练习中,我们将不使用它们,以便一步一步地逐步进行。

使用免费工具进行逆向和利用:第19部分

它看起来很难看,让我们使用DEMANGLE NAMES。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

现在看起来好多了。

我们可以看到不同类型的所有释放的局部变量,包括byte、dwords、buffers等类型。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

我们看到,在用0初始化局部变量和用0x32初始化maxsize变量后,它读取了LoadLibraryA函数的地址,并将其存储在foo2变量中,该变量是全局的,因为它在数据部分。

使用免费工具进行逆向和利用:第19部分

我们看到它是一个指向函数的指针类型的变量,我们在源代码中也看到它。

使用免费工具进行逆向和利用:第19部分

因为它是全局的,所以它在数据部分,在main的下面,我们可以看到loadlibrarya的地址是如何保存的。

它被声明为一个函数变量,只有一个类型参数(LPCSTR),并返回一个hmodule。

使用免费工具进行逆向和利用:第19部分

只是参数类型和返回值类型与LoadLibrary相同,所以foo2存储其地址不会有问题。

我们在源代码中看到,它使用LoadLIbraryA来加载一个名为peepe.dll的模块。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

如果我在变量上按X,我们会看到有一个地方可以加载模块,在check()函数里面。

使用免费工具进行逆向和利用:第19部分

https://drive.google.com/file/d/1KDzn04vcgwA5MmZh-93kNLFPCPQsr8UO/view?usp=sharing

有一个模块pepe.dll(password a),让我们下载它并把它放在与可执行文件相同的文件夹中,这样它就能找到它。

使用免费工具进行逆向和利用:第19部分

然后它试图打开fichero.dat文件,如果该文件在文件夹中不存在,它就会退出程序,所以它必须在可执行文件所在的同一文件夹中创建。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

我们看到FILE和_iobuf是同一种东西,所以我们暂时不纠结于此。

问题是,它试图打开fichero.dat文件,如果能打开,就把它的指针保存在F1变量中,该变量是全局的。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

然后从文件中读取三个值,一个名为cookie的双字节,另一个名为cookie2,以及一个名为size的字节。

我们看到它与第一个和第二个调用的读取4字节和最后1个字节相匹配。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

它将读取的字节数是_ElementSize和_ElementCount的乘法,尽管它们在练习中定义相反,但它同样将前两次读取4个字节,最后一次读取1个字节。

使用免费工具进行逆向和利用:第19部分

它应该是element_size=4和element_count=1,但是,好吧,结果将类似于读取4字节或双字节。

使用免费工具进行逆向和利用:第19部分

下面是漏洞的关键,将变量size定义为signed。

使用免费工具进行逆向和利用:第19部分

请记住,如果它没有明确说明UNSIGNED,编译器会把它当作SIGNED。

使用免费工具进行逆向和利用:第19部分

因此它使用了一个考虑SIGN的JLE跳转,如果它是UNSIGNED,它将使用一个不考虑符号的JBE跳转,就不会有漏洞。

问题是,当做MOVSX到ECX时,如果我们放一个负的字节或0x80或更大,它将用FF来填充,并创建一个负的双字节,这就是SIGNED的大小。

当与考虑到符号的最大尺寸0x32相比较时,任何负值都将小于正值0x32。

因此,举例来说,如果读入的字节大小是0x80,MOVSX到ECX将是0xFFFFFFFF80,考虑到SIGN是负的。

在Python中,如果你想知道它对应的是哪个负值,请使用这一行。

print ("VALOR NEGATIVO = -0x%x"%(0xFFFFFFFF- 0xFFFFFF80 +1))

使用免费工具进行逆向和利用:第19部分

好吧,它是-0x80,作为一个负值,它小于正值0x32,将通过检查,如果它是UNSIGNED,就不会发生。

使用免费工具进行逆向和利用:第19部分

该检查函数被赋予两个参数:cookie的指针和cookie2的值。

我们可以看到,在检查函数里面,它所做的是通过查找p_cookie的内容来检索cookie的值。

使用免费工具进行逆向和利用:第19部分

将参数1重命名为p_cookie,因为它找到了属于cookie的内容,并将其添加到cookie2中,并与一个常数进行比较。

使用免费工具进行逆向和利用:第19部分

因此,为了加载dll,我们必须确保文件的前4个字节加上文件的后4个字节之和必须是0x58552433。

使用免费工具进行逆向和利用:第19部分

溢出发生后,它用MOVSX再次读取SIGNED大小值,并返回到0xFFFFFFFF80。

使用免费工具进行逆向和利用:第19部分

但是fread函数不能从文件中读出负数的字节,你不能告诉它给我读-0x80字节,它将把这个值当作UNSIGNED,因为我们看到参数是size_t类型的。

使用免费工具进行逆向和利用:第19部分

在32位中,它与无符号的int相同。

使用免费工具进行逆向和利用:第19部分

因此,它将从文件中最多读取4294967168字节。

使用免费工具进行逆向和利用:第19部分

幸运的是,fread读取文件的字节数,如果它不再返回而没有出错,并且溢出了堆栈中的buf缓冲区,则会在32字节堆栈中创建另一个buf2缓冲区,该缓冲区在下面的32字节堆栈中创建,您可以从buf中复制,但不必到达那里,然后通过读取buf来利用该缓冲区。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

必须小心,因为buf在堆栈的顶部,如果我们要通过步进返回地址来避免使用seh chain,则必须小心我们步进变量的值,尤其是buf2,因为它是下一个memcpy的目标,并且可能会崩溃。

使用免费工具进行逆向和利用:第19部分

所以我们必须把前4个字节加上第二个4个字节,得到常量0x58552433,下一个字节必须是0x80或更高,这样它才是负数,剩下的就用你认为必要的字节填充,直到你输入返回地址,我把这个问题留给你。

pepe.dll还具有内置的system函数,可以直接调用该函数,因为它没有随机化,因此使用该函数可以轻松运行计算器。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

因此,如果加载pepe.dll模块,则可以轻松访问system。

我把它留给你,现在我们将修改练习,用结构来做,现在也用符号(暂时)。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

我们看到,当我们有符号时,它是非常相似的,它检测结构是堆栈中的一个单一变量,而当它调用字段时,它会将结构视为nueva_struct.nombre_del_campo.

使用免费工具进行逆向和利用:第19部分

这将是目的地,因为新的struct在堆栈中,所以它将是相似的。

使用免费工具进行逆向和利用:第19部分

如果我通过双击buf来查看结构内部。

使用免费工具进行逆向和利用:第19部分

使用免费工具进行逆向和利用:第19部分

我可以看到要填充的字节数,下面是存储的EBP和返回地址。

https://drive.google.com/file/d/1i_PKAY5ustTHjPdoM75ffwfCmXH9cDb9/view?usp=sharing

有一个CON_ESTRUCTURES的源代码。

如果能在没有结构和有结构的那部分都解决就好了,那么在下一部分我们就可以看到没有符号时是如何逆向的,嘿嘿。

这就是快乐的结束,我们会在没有符号的情况下进行,就像我们什么都不知道一样,嘿嘿。

使用免费工具进行逆向和利用:第19部分

好吧,直到第20部分

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月15日10:42:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用免费工具进行逆向和利用:第19部分http://cn-sec.com/archives/913072.html