首页 > 技术文章 > 源码调试较高版本的glibc编译的c++程序

zq10 2021-04-11 16:51 原文

有时候做pwn题会遇libc-2.31.so的c++程序

但是我们的环境是libc-2.23,指定libc后又遇到找不到libstdc++.so.6的情况

在另一博客(https://www.cnblogs.com/zq10/p/14314952.html)的基础上,采用以下方法解决这个问题

 

跟踪一个正常的c++程序,发现它加载了一些 /usr/lib/x86_64-linux-gnu 和 /lib/x86_64-linux-gnu/目录下的文件

 

 

而我指定libc编译的c++程序,strace 跟踪显示,找不到/home/zq/Desktop/glibc-2.31/64/libs/x86_64/x86_64/目录下的文件

 

那我们就把缺失的文件链接过来:

cd /home/zq/Desktop/glibc-2.31/64/lib/tls/x86_64/
sudo ln -s /usr/lib/x86_64-linux-gnu/ ./x86_64
sudo ln -s  /lib/x86_64-linux-gnu/ ./x86_64_2
sudo cp -fr ./x86_64_2/* ./x86_64/
sudo rm -r ./x86_64_2

 

编译一个c++程序测试一下:

#include<iostream>
#include<vector>
using namespace std;

int main(){
    
    vector<int> vec;
    for (int i=0;i<10;i++){
        vec.push_back(i);
    }
    return 0;
}

编译命令:

g++ -g -L /home/zq/Desktop/glibc-2.31/64/lib -Wl,--rpath=/home/zq/Desktop/glibc-2.31/64/libs -Wl,-I /home/zq/Desktop/glibc-2.31/64/lib/ld-2.31.so hello.cc -o hello

可以顺利编译,下图是c++标准库源码和示例程序源码:

 

 

推荐阅读