如何解决 ShellCode 中 call 所产生的 \x00 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Nullplus

如何解决 ShellCode 中 call 所产生的 \x00

  •  
  •   Nullplus 2020 年 1 月 18 日 7910 次点击
    这是一个创建于 2290 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬好,想问一个关于汇编和 ShellCode 中零字节的问题。

    在学习缓冲溢出时,我根据要求写了一段取得程序 PID 的汇编来构造 ShellCode,其中一段调用了 C 中的 printf 来输出结果:

    lea rdi, [rel message] mov rsi, rax call printf 

    反汇编后的结果如下:

     13: 48 8d 3d e8 ff ff ff lea -0x18(%rip),%rdi # 2 <message> 1a: 48 89 c6 mov %rax,%rsi 1d: e8 00 00 00 00 callq 22 <code+0x19> 

    如上面代码第三行所示,opcode 出现了 \x00, 我搜索了一圈都没有合适的能把 \x00 替换掉的方案,于是想来 V 站问问各位大佬们~

    4 条回复    2020-01-18 14:44:12 +08:00
    codehz
        1
    codehz  
       2020 年 1 月 18 日 via Android
    Ummm 这个 00 不是表示 obj 还没被链接,然后留 0 等链接器填值么
    ThirdFlame
        3
    ThirdFlame  
       2020 年 1 月 18 日
    1 楼正解。 因为不是绝对地址,是相对地址。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2692 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 55ms UTC 05:54 PVG 13:54 LAX 22:54 JFK 01:54
    Do have faith in what you're doing.
    ubaomsnsnddmindexpchomeyahoorakutenmypapermeadowduckbidyahooyoubaozxmzxmasdabnvcgcvbfgdfscvmmhjkxxddcyybgbzznbnccubaouaituacvGXCVETGDGYHFGBCVBFJFHCBRECBCGDGET54WRWRRWERWREWWRWERRWERSDGEWSFDSFSFfbbsubaofhddfgewrdgdfewwrewwretruyutututdfgfgdgdfgtetgdfgtdfgdert4gdfggwr235wer3wevsdfsdfgdfertxcvsdfrwerhfddfgcvbrwfafbdfhjghbmnlghrtygfdscxvxcvxcsvdasfdffgdcvsdftertsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfshasha9178shasha9178shasha9178shasha9178shasha9178liflif2liflif2liflif2liflif2liflif2liblib3liblib3liblib3liblib3liblib3zhazha444zhazha444zhazha444zhazha444zhazha444dende5dendedendendenden2denden21fenfen9fenf619fen619fenfe9fe619sdfsdfsdfsdfsdfzhazh90zhazh0zhaa50zha90zh590zhozhozzhozhzhozhozhozho2lislislls95lili95lils5liss9sdf0ty987sdft876sdft9876sdf09876sd0t9876sdf0ty98sdf0976sdf0ty986sdf0ty96sdf0t76sdf0876df0ty98sf0t876sd0ty76sdy76sdf76sdf0t76sdf0ty9sdf0ty98sdf0ty987sdf0ty98sdf6676sdf876sd876sd876sdf6sdf6sdf9876sdf0tsdf06sdf0ty9776sdf0ty9776sdf0ty76sdf8876sdf0tsd6sdf06s688876sd688sdf86
    zk8802
        4
    zk8802  
       2020 年 1 月 18 日 via iPhone
    Shellcode 不会被系统的 loader 加载,因此不能进行重定位。如果要用进程中的其它函数(例如库函数),需要自己找到固定地址的调用指令(例如主程序的 PLT entry )然后在 shellcode 中把固定地址硬编码进去,或者在 shellcode 里面加上解析函数地址的功能。遇到 ASLR 的话,解析函数地址很麻烦。一般而言,shellcode 只调用系统调用。