C 手动获取系统功能的地址?

C 手动获取系统功能的地址?,c,gdb,system,C,Gdb,System,当我打印系统时,如何获得GDB提供的地址 假设,如果我启动程序,然后立即暂停它,然后查看/proc/$pid/maps并获取库的基址。然后我需要在libc.so.6中找到系统的偏移量,并将这两个加在一起。然而,当我在实践中尝试这一点时,我得到的地址与gdb给出的地址不同 获取系统地址的最佳方式是什么 请注意,我正在尝试获取另一个程序的地址,而不是我自己编译的那个 获取系统地址的最佳方式是什么 我没有试过,但我有一个想法。那么: void* libc = dlopen("libc.so"); vo

当我打印系统时,如何获得GDB提供的地址

假设,如果我启动程序,然后立即暂停它,然后查看/proc/$pid/maps并获取库的基址。然后我需要在libc.so.6中找到系统的偏移量,并将这两个加在一起。然而,当我在实践中尝试这一点时,我得到的地址与gdb给出的地址不同

获取系统地址的最佳方式是什么

请注意,我正在尝试获取另一个程序的地址,而不是我自己编译的那个

获取系统地址的最佳方式是什么


我没有试过,但我有一个想法。那么:

void* libc = dlopen("libc.so");
void* address = dlsym( libc, "system");

为什么要这样做?偏移量是指代码的文件偏移量还是虚拟地址?你明白其中的区别吗?在linux上,函数指针可以转换为void*。例如,void*ptr=系统;printf%p\n,ptr;虽然这并不能解决你真正想做的事情`@不,他可能想侵入另一个进程,让它产生另一个进程。另一个选项是:他自己的系统调用出现问题,所以他在寻找异常。如果是这样的话,那么他可能找错了地方。@不,我认为这样会打印当前可执行文件中系统存根的地址。这可能会打印当前映像中存根的地址,而不是实际代码的地址。也就是说,在同一过程中不同图像中获得的地址将不同。这返回系统的PLT地址,而不是我要查找的地址。它返回0xb7e9af10。GDB给出的地址是0xb7e9ef10。非常接近。你能检查一下这些地址下面有什么吗?也许其中一个只包含到另一个的跳转指令?顺便说一句,为什么你真的想要得到gdb显示的值呢?我在做ret2libc,只有gdb中函数的地址可以工作。当我编译并运行它时,它会给出0xb7e9af10。当我在gdb中打开这个程序并执行“p系统”时,我得到了相同的地址0xb7e9af10。但当我打开其他文件并执行p系统时,我得到0xb7e9ef10。在您的程序中,我的代码和gdb都是一致的,所以没有混淆。在你想要破解的程序中,系统的地址似乎不同,因为它不是你的程序,你不能用我的代码来确认它-我理解的情况对吗?首先,我要检查/proc/$pid/maps,看看您的程序是否与被黑客攻击的程序具有相同的libc基地址。可能其他库已经读取了libc地址空间的一部分,因此需要重新定位libc,从而进行更改。~只是想检查我的系统中libc的不同加载地址:我在'ls/proc|grep[0-9]\\\+'中运行I;执行cat/proc/$i/maps | grep libc-;完成了| grep 00000000 | sort | uniq | wc-l,它显示了不同过程的34个不同基址。我猜ASLR是有罪的-你禁用了吗?
void* libc = dlopen("libc.so");
void* address = dlsym( libc, "system");