[pwnable.kr]bof

admin 2026-01-09 03:06:55 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: Thedocumentsolvespwnable.krbofchallenge,highlightingtheimportanceofmatchingcompilationarchitecture.Theauthorexplainsthat64-bitsystemspassfunctionargumentsviaregisters(x86-64ABI),preventingtheintendedstackoverflowfromoverwritingthetargetvariable.Byrecompilingin32-bitmodewhereargumentsresideonthestack,theauthorusesGDBtoanalyzememorylayoutandcalculatesthepreciseoffsettooverwrite0xdeadbeefwith0xcafebabe.Thesolutioninvolvesconstructingaspecificpayloadandusingpwntoolstoexecutetheexploitremotely,successfullyobtainingtheflaganddemonstratingthedifferencebetween32-bitand64-bitfunctioncallingconventions. 综合评分: 85 文章分类: CTF,二进制安全,漏洞分析


cover_image

[pwnable.kr] bof

原创

backy

安全的小马达

2026年1月8日 11:58 陕西

在解这个题目的时候,犯了一个错误,没有看可执行文件bof是多少位的程序,就直接把bof.c文件的内容复制出来,在自己64位的linux系统上,使用gcc bof.c -o bof直接编译然后进行调试, 就发现不能对0xdeadbeef进行覆盖。改成32位编译之后(gcc -m32 bof.c -o bof)就可以了。将整个过程记录下来,又get了一个知识点。

先说结论:主要原因是x86-64位的ABI(Application Binary Interface)函数调用约定与32位系统的函数调用约定不同导致的。

修改一下bof.c的代码, 观察一下32位和64位的函数调用的区别。如下图所示, func函数设置8个参数。

我的实验环境是腾讯云上的一个x86-64位的系统

[root@VM-24-14-opencloudos ~]# uname -aLinux VM-24-14-opencloudos 6.6.47-12.oc9.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Sep 24 16:15:42 CST 2024 x86_64 x86_64 x86_64 GNU/Linux

首先直接用gcc编译这个源码: gcc bof.c -o bof, 用gdb打开bof: gdb ./bof查看main函数调用func函数的汇编代码,如下图所示, 可以看出, 在x86-64位系统中, 函数调用时, 前6个参数依次放在edi, esi, edx, ecx, r8, r9这六个寄存器中, 其余的参数压入堆栈。

我们在func函数的入口出设置断点,让程序运行到func函数内部,观察下堆栈信息, 前6个参数在寄存器中, 超过6个的其他参数,从右向左入栈。

下面我们再看看32位系统上函数的调用:gcc -m32 bof.c -o bof, 使用gdb打开编译好的文件,查看main函数的反汇编代码, 可以看到,所有参数从右向左全部入栈。

再看下func函数入口处的栈信息, 参数全部在栈中。

 所以,这个题目一看就是缓冲区溢出,要在栈上覆盖func的参数0xdeadbeef。 但是如果编译成64位的程序,参数在edi寄存器中, 是无法溢出覆盖的。 只有编译成32位的程序才可以。

下面是这个题目调试的栈数据,看下如何构造溢出数据。

将代码还原,编译成32位程序,使用gdb查看main函数的汇编代码:

查看func函数的汇编代码:

在调用gets函数的返回代码处下断点, ,输入32个a, 然后查看栈上的数据布局

 要覆盖0xdeadbeef的值, 从堆栈上看, 需要(‘a’* 8 * 4 + ‘b’ *5 * 4) + p32(0xcafebabe)

我们可以输入这个数据看下堆栈的效果:

 覆盖了0xdeadbeef的一个字节, 是因为输入的字符串带了\0, 使用pwntools发送二进制数据的时候,不会出现这个问题。

登录到pwnable.kr, (ssh [email protected] -p 2222), 在/tmp目录下创建exp.py,执行后即可获取flag.

Exp代码如下:

from pwn import *key = 0xcafebabebof = b'A' * 13 * 4 + p32(key)p = remote('pwnable.kr', 9000)p.sendline(bof)p.interactive()

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全的小马达 backy《[pwnable.kr] bof》

重大通知———–招聘啦 网络安全文章

重大通知———–招聘啦

文章总结: 本文是一则上海天擎运营人员的招聘信息,要求熟悉奇安信天擎产品维护、准入控制及Linux命令。同时详细介绍了奇安信天擎作为一体化终端安全解决方案的核心
评论:0   参与:  0