ROP链中execve系统调用无输出问题求助
排查ROP调用execve无输出问题
尝试通过ROP gadget链调用execve("/bin/cat", "filename", NULL),能单步执行系统调用,但无输出也无报错,无法定位问题。
调试关键信息
最后执行的ROP Gadget
(gdb) x/20i $pc => 0xf7dfb8ae: call *%gs:0x10 0xf7dfb8b5: pop %ebx 0xf7dfb8b6: ret 0xf7dfb8b7: lea
寄存器状态
(gdb) info registers eax 0xb 11 ecx 0xffffde1a -8678 edx 0xffffde19 -8679 ebx 0xffffde11 -8687 esp 0xffffde60 0xffffde60 ebp 0xffffde48 0xffffde48 esi 0xf7fbb000 -134500352 tedi 0xf7fbb000 -134500352 eip 0xf7dfb8ae 0xf7dfb8ae eflags 0x202 [ IF ] cs 0x23 35 ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x63 99
内存数据
字符串查询结果:
(gdb) x/s $ebx 0xffffde11: "/bin/cat" (gdb) x/s $ecx 0xffffde1a: "/home/victim/flag.txt" (gdb) x/s $edx 0xffffde19: ""
字节级内存布局:
(gdb) x /32x $ebx 0xffffde11: 0x2f 0x62 0x69 0x6e 0x2f 0x63 0x61 0x74 0xffffde19: 0x00 0x2f 0x68 0x6f 0x6d 0x65 0x2f 0x76 0xffffde21: 0x69 0x63 0x74 0x69 0x6d 0x2f 0x66 0x6c 0xffffde29: 0x61 0x67 0x2e 0x74 0x78 0x74 0x00 0x00
问题排查与修复方向
修正execve参数格式
execve的第二个参数要求是字符串数组的指针,而非单个字符串指针。正确的数组布局应在内存中构造:[0xffffde11] # "/bin/cat"的地址 [0xffffde1a] # "/home/victim/flag.txt"的地址 [0x00000000] # NULL终止符将ecx指向这个数组的起始地址,而非直接指向文件名。
第三个参数改为NULL指针
当前edx指向空字符串的地址(0xffffde19),但execve要求第三个参数是NULL指针(0x00000000),而非空字符串地址。需将edx设置为0。验证系统调用入口
执行x/x %gs:0x10查看GS段偏移0x10处的指针,确认其指向合法的系统调用入口(如int 0x80的代码地址)。若该指针无效,系统调用无法正确触发。处理标准输出问题
若execve执行成功但无输出,可能是子进程的标准输出未关联到当前终端。可在ROP链中先调用dup2将标准输出重定向到当前进程的fd,或改用system("/bin/cat /home/victim/flag.txt")简化参数构造(需找到对应gadget)。
内容的提问来源于stack exchange,提问作者nkt
相关产品推荐
相关产品推荐

