【发布时间】:2021-01-04 06:09:43
【问题描述】:
我正在学习使用 shellcode 的缓冲区溢出。在 shellcode 中通过系统调用 execve() 来生成 shell。像mov $0x0, %eax 这样的东西可以用xor %eax, %eax 代替,以避免在shellcode 中出现NULL。但是有一个int $0x80。数字 0x80 是巧合吗?如果中断向量从创建之日起是 0x0 怎么办?有没有办法消除那个 NULL 字节?
【问题讨论】:
-
你的 shellcode 可能是可写的,因为它通常是这样被注入的。所以你可以使用自我修改。
int方法已过时,您有syscall和sysenter作为奖励,它们没有零字节。 -
32 位 Linux 对每个系统调用使用中断向量 0x80。这是一个任意的选择,但却是一个固定的选择。你没有理由去做
int $0x0,它只会出现段错误而没有做任何有用的事情。系统调用号,用于选择是否调用read、write、fork等,在%eax中传递,而不是作为中断向量。 -
等等,你是在问如果 Linux 的设计不同并且使用中断 0 而不是 0x80 会怎样,在这种情况下你将如何编写没有零字节的 shellcode?然后就像 Jester 说的那样,您需要使用自修改代码。如果这就是您的意思,那么如果您在标题中说“是”(虚拟语气)而不是“是”(指示性语气),您的问题会更清楚。你的意思是“中断向量”而不是“系统调用号”。
-
谢谢 Nate,我已经修改了我的问题。
标签: assembly x86 system-calls buffer-overflow shellcode