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

2020-01-18 05:48:45 +08:00
 Nullplus

各位大佬好,想问一个关于汇编和 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 站问问各位大佬们~

7196 次点击
所在节点   汇编
4 条回复
codehz
2020-01-18 09:12:47 +08:00
Ummm 这个 00 不是表示 obj 还没被链接,然后留 0 等链接器填值么
kernelpanic
2020-01-18 10:45:58 +08:00
ThirdFlame
2020-01-18 11:08:02 +08:00
1 楼正解。 因为不是绝对地址,是相对地址。
zk8802
2020-01-18 14:44:12 +08:00
Shellcode 不会被系统的 loader 加载,因此不能进行重定位。如果要用进程中的其它函数(例如库函数),需要自己找到固定地址的调用指令(例如主程序的 PLT entry )然后在 shellcode 中把固定地址硬编码进去,或者在 shellcode 里面加上解析函数地址的功能。遇到 ASLR 的话,解析函数地址很麻烦。一般而言,shellcode 只调用系统调用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638896

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX